From 541cfb21bad9bd6ae3326484075ea3a0cd01bb21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Tue, 13 Aug 2024 12:31:24 +0200 Subject: [PATCH] aco: don't attempt to spill dead phis These don't affect register pressure. Part-of: --- src/amd/compiler/aco_lower_to_cssa.cpp | 2 +- src/amd/compiler/aco_spill.cpp | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/amd/compiler/aco_lower_to_cssa.cpp b/src/amd/compiler/aco_lower_to_cssa.cpp index 3725c72881a..d0cef033b6e 100644 --- a/src/amd/compiler/aco_lower_to_cssa.cpp +++ b/src/amd/compiler/aco_lower_to_cssa.cpp @@ -70,7 +70,7 @@ collect_parallelcopies(cssa_ctx& ctx) /* if the definition is not temp, it is the exec mask. * We can reload the exec mask directly from the spill slot. */ - if (!def.isTemp()) + if (!def.isTemp() || def.isKill()) continue; Block::edge_vec& preds = diff --git a/src/amd/compiler/aco_spill.cpp b/src/amd/compiler/aco_spill.cpp index 86bfbb39119..811c386da0f 100644 --- a/src/amd/compiler/aco_spill.cpp +++ b/src/amd/compiler/aco_spill.cpp @@ -391,7 +391,7 @@ init_live_in_vars(spill_ctx& ctx, Block* block, unsigned block_idx) for (aco_ptr& phi : block->instructions) { if (!is_phi(phi)) break; - if (!phi->definitions[0].isTemp()) + if (!phi->definitions[0].isTemp() || phi->definitions[0].isKill()) continue; Temp var = phi->definitions[0].getTemp(); if (var.type() == type && !ctx.spills_entry[block_idx].count(var) && @@ -486,7 +486,7 @@ init_live_in_vars(spill_ctx& ctx, Block* block, unsigned block_idx) for (aco_ptr& phi : block->instructions) { if (!is_phi(phi)) break; - if (!phi->definitions[0].isTemp()) + if (!phi->definitions[0].isTemp() || phi->definitions[0].isKill()) continue; Block::edge_vec& preds = @@ -596,6 +596,7 @@ add_coupling_code(spill_ctx& ctx, Block* block, IDSet& live_in) Block::edge_vec& preds = phi->opcode == aco_opcode::p_phi ? block->logical_preds : block->linear_preds; uint32_t def_spill_id = ctx.spills_entry[block_idx][phi->definitions[0].getTemp()]; + phi->definitions[0].setKill(true); for (unsigned i = 0; i < phi->operands.size(); i++) { if (phi->operands[i].isUndefined()) @@ -717,11 +718,11 @@ add_coupling_code(spill_ctx& ctx, Block* block, IDSet& live_in) for (aco_ptr& phi : block->instructions) { if (!is_phi(phi)) break; + if (phi->definitions[0].isKill()) + continue; assert(!phi->definitions[0].isTemp() || - !ctx.spills_entry[block_idx].count(phi->definitions[0].getTemp()) || - std::all_of(phi->operands.begin(), phi->operands.end(), - [](Operand op) { return op.isUndefined(); })); + !ctx.spills_entry[block_idx].count(phi->definitions[0].getTemp())); Block::edge_vec& preds = phi->opcode == aco_opcode::p_phi ? block->logical_preds : block->linear_preds;