aco: Fix dead instruction/index handling for try_insert_saveexec_out_of_loop
The loop checking if exec is overwritten didn't check for NULL
instructions, and didn't fix up reg write indices after inserting
instructions.
Fixes: fcd94a8c
("aco: move try_optimize_branching_sequence() to postRA optimizations")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32746>
This commit is contained in:

committed by
Marge Bot

parent
67d74a04b9
commit
71392fff25
@@ -867,6 +867,8 @@ try_insert_saveexec_out_of_loop(pr_opt_ctx& ctx, Block* block, Definition saved_
|
|||||||
|
|
||||||
/* Check if exec is written, or the copy's dst overwritten in the loop header. */
|
/* Check if exec is written, or the copy's dst overwritten in the loop header. */
|
||||||
for (unsigned i = 0; i < saveexec_pos; i++) {
|
for (unsigned i = 0; i < saveexec_pos; i++) {
|
||||||
|
if (!block->instructions[i])
|
||||||
|
continue;
|
||||||
if (block->instructions[i]->writes_exec())
|
if (block->instructions[i]->writes_exec())
|
||||||
return false;
|
return false;
|
||||||
if (instr_overwrites(block->instructions[i].get(), saved_exec.physReg(), saved_exec.size()))
|
if (instr_overwrites(block->instructions[i].get(), saved_exec.physReg(), saved_exec.size()))
|
||||||
@@ -906,6 +908,19 @@ try_insert_saveexec_out_of_loop(pr_opt_ctx& ctx, Block* block, Definition saved_
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
fixup_reg_writes(pr_opt_ctx& ctx, unsigned start)
|
||||||
|
{
|
||||||
|
const unsigned current_idx = ctx.current_instr_idx;
|
||||||
|
for (unsigned i = start; i < current_idx; i++) {
|
||||||
|
ctx.current_instr_idx = i;
|
||||||
|
if (ctx.current_block->instructions[i])
|
||||||
|
save_reg_writes(ctx, ctx.current_block->instructions[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.current_instr_idx = current_idx;
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
try_optimize_branching_sequence(pr_opt_ctx& ctx, aco_ptr<Instruction>& exec_copy)
|
try_optimize_branching_sequence(pr_opt_ctx& ctx, aco_ptr<Instruction>& exec_copy)
|
||||||
{
|
{
|
||||||
@@ -1145,8 +1160,11 @@ try_optimize_branching_sequence(pr_opt_ctx& ctx, aco_ptr<Instruction>& exec_copy
|
|||||||
*/
|
*/
|
||||||
if (ctx.current_block->kind & block_kind_loop_header) {
|
if (ctx.current_block->kind & block_kind_loop_header) {
|
||||||
if (try_insert_saveexec_out_of_loop(ctx, ctx.current_block, exec_copy_def,
|
if (try_insert_saveexec_out_of_loop(ctx, ctx.current_block, exec_copy_def,
|
||||||
exec_val_idx.instr))
|
exec_val_idx.instr)) {
|
||||||
|
/* We inserted something after the last phi, so fixup indices from the start. */
|
||||||
|
fixup_reg_writes(ctx, 0);
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Instruction* copy = create_instruction(aco_opcode::p_parallelcopy, Format::PSEUDO, 1, 1);
|
Instruction* copy = create_instruction(aco_opcode::p_parallelcopy, Format::PSEUDO, 1, 1);
|
||||||
copy->definitions[0] = exec_copy_def;
|
copy->definitions[0] = exec_copy_def;
|
||||||
@@ -1155,14 +1173,7 @@ try_optimize_branching_sequence(pr_opt_ctx& ctx, aco_ptr<Instruction>& exec_copy
|
|||||||
ctx.current_block->instructions.emplace(it, copy);
|
ctx.current_block->instructions.emplace(it, copy);
|
||||||
|
|
||||||
/* Fixup indices after inserting an instruction. */
|
/* Fixup indices after inserting an instruction. */
|
||||||
const unsigned current_idx = ctx.current_instr_idx;
|
fixup_reg_writes(ctx, exec_val_idx.instr);
|
||||||
for (unsigned i = exec_val_idx.instr; i < current_idx; i++) {
|
|
||||||
ctx.current_instr_idx = i;
|
|
||||||
if (ctx.current_block->instructions[i])
|
|
||||||
save_reg_writes(ctx, ctx.current_block->instructions[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx.current_instr_idx = current_idx;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user