mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 11:18:08 +02:00
aco: don't fix break condition for break+discard to exec
This would move the old exec mask back into exec. This also fixes the
live_out_exec.
Issue found in dEQP-VK.graphicsfuzz.cosh-return-inf-unused
Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
Cc: 20.2 <mesa-stable>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6212>
(cherry picked from commit a537c9e73f)
This commit is contained in:
parent
01c1323180
commit
643ae5ea24
2 changed files with 8 additions and 5 deletions
|
|
@ -742,7 +742,7 @@
|
|||
"description": "aco: don't fix break condition for break+discard to exec",
|
||||
"nominated": true,
|
||||
"nomination_type": 0,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"master_sha": null,
|
||||
"because_sha": null
|
||||
},
|
||||
|
|
|
|||
|
|
@ -929,6 +929,11 @@ void add_branch_code(exec_ctx& ctx, Block* block)
|
|||
has_discard);
|
||||
}
|
||||
|
||||
/* For normal breaks, this is the exec mask. For discard+break, it's the
|
||||
* old exec mask before it was zero'd.
|
||||
*/
|
||||
Operand break_cond = bld.exec(ctx.info[idx].exec.back().first);
|
||||
|
||||
if (block->kind & block_kind_discard) {
|
||||
|
||||
assert(block->instructions.back()->format == Format::PSEUDO_BRANCH);
|
||||
|
|
@ -961,8 +966,7 @@ void add_branch_code(exec_ctx& ctx, Block* block)
|
|||
}
|
||||
assert(!ctx.handle_wqm || (ctx.info[block->index].exec[0].second & mask_type_wqm) == 0);
|
||||
|
||||
if ((block->kind & (block_kind_break | block_kind_uniform)) == block_kind_break)
|
||||
ctx.info[idx].exec.back().first = cond;
|
||||
break_cond = Operand(cond);
|
||||
bld.insert(std::move(branch));
|
||||
/* no return here as it can be followed by a divergent break */
|
||||
}
|
||||
|
|
@ -1055,13 +1059,12 @@ void add_branch_code(exec_ctx& ctx, Block* block)
|
|||
assert(block->instructions.back()->opcode == aco_opcode::p_branch);
|
||||
block->instructions.pop_back();
|
||||
|
||||
Temp current_exec = ctx.info[idx].exec.back().first;
|
||||
Temp cond = Temp();
|
||||
for (int exec_idx = ctx.info[idx].exec.size() - 2; exec_idx >= 0; exec_idx--) {
|
||||
cond = bld.tmp(s1);
|
||||
Temp exec_mask = ctx.info[idx].exec[exec_idx].first;
|
||||
exec_mask = bld.sop2(Builder::s_andn2, bld.def(bld.lm), bld.scc(Definition(cond)),
|
||||
exec_mask, bld.exec(current_exec));
|
||||
exec_mask, break_cond);
|
||||
ctx.info[idx].exec[exec_idx].first = exec_mask;
|
||||
if (ctx.info[idx].exec[exec_idx].second & mask_type_loop)
|
||||
break;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue