diff --git a/src/amd/compiler/aco_optimizer_postRA.cpp b/src/amd/compiler/aco_optimizer_postRA.cpp index 510b9e196da..6435a54ef4e 100644 --- a/src/amd/compiler/aco_optimizer_postRA.cpp +++ b/src/amd/compiler/aco_optimizer_postRA.cpp @@ -109,13 +109,13 @@ struct pr_opt_ctx { std::fill(instr_idx_by_regs[block->index].begin(), instr_idx_by_regs[block->index].end(), not_written_yet); } else if (block->kind & block_kind_loop_header) { - /* Initialize with content from loop preheader */ - memcpy(&instr_idx_by_regs[block->index][0], &instr_idx_by_regs[block->index - 1][0], - max_reg_cnt * sizeof(Idx)); - - /* Assume exec writes on back-edges */ - instr_idx_by_regs[block->index][126] = overwritten_untrackable; - instr_idx_by_regs[block->index][127] = overwritten_untrackable; + /* Instructions inside the loop may overwrite registers of temporaries that are + * not live inside the loop, but we can't detect that because we haven't processed + * the blocks in the loop yet. As a workaround, mark all registers as untrackable. + * TODO: Consider improving this in the future. + */ + std::fill(instr_idx_by_regs[block->index].begin(), instr_idx_by_regs[block->index].end(), + overwritten_untrackable); } else { reset_block_regs(block->linear_preds, block->index, 0, max_sgpr_cnt); reset_block_regs(block->linear_preds, block->index, 251, 3);