From d3b0f781103ffcef4e18257b8289948e9d37dd99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 14 Nov 2022 18:04:23 +0100 Subject: [PATCH] aco/optimizer_postRA: Initialize loop header with preheader information MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This works because of SSA and should be safer than just setting 'not_written_yet'. No Fossil DB changes on Rembrandt (RDNA2). Reviewed-by: Timur Kristóf Part-of: --- src/amd/compiler/aco_optimizer_postRA.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/amd/compiler/aco_optimizer_postRA.cpp b/src/amd/compiler/aco_optimizer_postRA.cpp index 59c0d12548d..7a598ed6554 100644 --- a/src/amd/compiler/aco_optimizer_postRA.cpp +++ b/src/amd/compiler/aco_optimizer_postRA.cpp @@ -107,9 +107,17 @@ struct pr_opt_ctx { current_block = block; current_instr_idx = 0; - if ((block->kind & block_kind_loop_header) || block->linear_preds.empty()) { + if (block->linear_preds.empty()) { 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; } else { reset_block_regs(block->linear_preds, block->index, 0, max_sgpr_cnt); reset_block_regs(block->linear_preds, block->index, 251, 3);