mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-07-12 04:35:56 +00:00
control_flow: Fix single instruction scopes edge case
Fixes the following pattern v_cmpx_gt_u32 cond buffer_store_dword value .LABEL: Before buffer[index] = value; After if (cond) { buffer[index] = value; }
This commit is contained in:
parent
565bde7c4f
commit
5cd32cc077
1 changed files with 2 additions and 2 deletions
|
@ -188,14 +188,14 @@ void CFG::SplitDivergenceScopes() {
|
||||||
const bool is_close = is_close_scope(inst);
|
const bool is_close = is_close_scope(inst);
|
||||||
if ((is_close || index == blk->end_index) && curr_begin != -1) {
|
if ((is_close || index == blk->end_index) && curr_begin != -1) {
|
||||||
// If there are no instructions inside scope don't do anything.
|
// If there are no instructions inside scope don't do anything.
|
||||||
if (index - curr_begin == 1) {
|
if (index - curr_begin == 1 && is_close) {
|
||||||
curr_begin = -1;
|
curr_begin = -1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// If all instructions in the scope ignore exec masking, we shouldn't insert a
|
// If all instructions in the scope ignore exec masking, we shouldn't insert a
|
||||||
// scope.
|
// scope.
|
||||||
const auto start = inst_list.begin() + curr_begin + 1;
|
const auto start = inst_list.begin() + curr_begin + 1;
|
||||||
if (!std::ranges::all_of(start, inst_list.begin() + index, IgnoresExecMask)) {
|
if (!std::ranges::all_of(start, inst_list.begin() + index + !is_close, IgnoresExecMask)) {
|
||||||
// Determine the first instruction affected by the exec mask.
|
// Determine the first instruction affected by the exec mask.
|
||||||
do {
|
do {
|
||||||
++curr_begin;
|
++curr_begin;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue