From 54f83d718ad6d089bfd0a018db8c9a0bbdc5c9ea Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Thu, 2 Sep 2021 17:30:57 +0100 Subject: [PATCH] aco/spill: add temporary operands of exec phis to next_use_distances_end MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rhys Perry Reviewed-by: Daniel Schürmann Fixes: dfb10e4f4b7 ("aco/spill: don't count phis as variable access") Part-of: --- src/amd/compiler/aco_spill.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/amd/compiler/aco_spill.cpp b/src/amd/compiler/aco_spill.cpp index 40a4d8c0fc0..205a687b7e4 100644 --- a/src/amd/compiler/aco_spill.cpp +++ b/src/amd/compiler/aco_spill.cpp @@ -193,14 +193,15 @@ next_uses_per_block(spill_ctx& ctx, unsigned block_idx, std::set& work aco_ptr& instr = block->instructions[idx]; assert(instr->opcode == aco_opcode::p_linear_phi || instr->opcode == aco_opcode::p_phi); - if (!instr->definitions[0].isTemp()) { - idx--; - continue; + std::pair distance{block_idx, 0}; + + auto it = instr->definitions[0].isTemp() ? next_uses.find(instr->definitions[0].getTemp()) + : next_uses.end(); + if (it != next_uses.end()) { + distance = it->second; + next_uses.erase(it); } - auto it = next_uses.find(instr->definitions[0].getTemp()); - std::pair distance = - it == next_uses.end() ? std::make_pair(block_idx, 0u) : it->second; for (unsigned i = 0; i < instr->operands.size(); i++) { unsigned pred_idx = instr->opcode == aco_opcode::p_phi ? block->logical_preds[i] : block->linear_preds[i]; @@ -212,7 +213,6 @@ next_uses_per_block(spill_ctx& ctx, unsigned block_idx, std::set& work ctx.next_use_distances_end[pred_idx][instr->operands[i].getTemp()] = distance; } } - next_uses.erase(instr->definitions[0].getTemp()); idx--; }