From: Timur Kristóf Date: Sun, 2 Apr 2023 20:11:25 +0000 (+0200) Subject: aco: Don't remove exec writes that also write other registers. X-Git-Tag: upstream/23.3.3~10594 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0211e66f65522caa1f6855b937ae4fc18af0c937;p=platform%2Fupstream%2Fmesa.git aco: Don't remove exec writes that also write other registers. Don't eliminate an instruction that writes registers other than exec and scc. It is possible that this is eg. an s_and_saveexec and the saved value is used by a later branch. Fixes: bc130497472cb4ec4ec60695ed99b169d6681118 Reviewed-by: Daniel Schürmann Part-of: --- diff --git a/src/amd/compiler/aco_ssa_elimination.cpp b/src/amd/compiler/aco_ssa_elimination.cpp index c90c29b..39c33cc 100644 --- a/src/amd/compiler/aco_ssa_elimination.cpp +++ b/src/amd/compiler/aco_ssa_elimination.cpp @@ -596,7 +596,15 @@ eliminate_useless_exec_writes_in_block(ssa_elimination_ctx& ctx, Block& block) /* See if we found an unused exec write. */ if (writes_exec && !exec_write_used) { - instr.reset(); + /* Don't eliminate an instruction that writes registers other than exec and scc. + * It is possible that this is eg. an s_and_saveexec and the saved value is + * used by a later branch. + */ + bool writes_other = std::any_of(instr->definitions.begin(), instr->definitions.end(), + [](const Definition& def) -> bool + { return def.physReg() != exec && def.physReg() != scc; }); + if (!writes_other) + instr.reset(); continue; }