From c5c02d0571a9e3d8ea978bf536ec710b25754376 Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Tue, 17 Oct 2023 01:40:25 -0700 Subject: [PATCH] intel/elk: Move code to enable spilling to choose_spill_reg() The first time we spill a register, we may need to discard and rebuild the interference graph with some registers reserved, as we unfortunately have to use registers to send messages to spill registers. We also need to set spill costs. It makes sense to do both of these tasks in choose_spill_reg(), rather than open coding it in the middle of the spill/retry-allocation loop. We also introduce a new boolean for whether the current interference graph supports spilling, in order to simplify some logic. Cc: mesa-stable Fixes: e99081e76d4 ("intel/fs/ra: Spill without destroying the interference graph") --- .../compiler/elk/elk_fs_reg_allocate.cpp | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/intel/compiler/elk/elk_fs_reg_allocate.cpp b/src/intel/compiler/elk/elk_fs_reg_allocate.cpp index 229a0853cfe..ca31dbc43f8 100644 --- a/src/intel/compiler/elk/elk_fs_reg_allocate.cpp +++ b/src/intel/compiler/elk/elk_fs_reg_allocate.cpp @@ -387,6 +387,7 @@ private: int rsi; ra_graph *g; + bool interference_graph_supports_spilling; bool have_spill_costs; int payload_node_count; @@ -629,6 +630,8 @@ elk_fs_reg_alloc::setup_inst_interference(const elk_fs_inst *inst) void elk_fs_reg_alloc::build_interference_graph(bool allow_spilling) { + interference_graph_supports_spilling = allow_spilling; + /* Compute the RA node layout */ node_count = 0; first_payload_node = node_count; @@ -925,6 +928,15 @@ elk_fs_reg_alloc::set_spill_costs() int elk_fs_reg_alloc::choose_spill_reg() { + /* If we're going to spill but we've never spilled before, we need + * to re-build the interference graph with MRFs enabled to allow + * spilling. + */ + if (!interference_graph_supports_spilling) { + discard_interference_graph(); + build_interference_graph(true); + } + if (!have_spill_costs) set_spill_costs(); @@ -1158,15 +1170,6 @@ elk_fs_reg_alloc::assign_regs(bool allow_spilling, bool spill_all) break; } - /* If we're going to spill but we've never spilled before, we need - * to re-build the interference graph with MRFs enabled to allow - * spilling. - */ - if (!fs->spilled_any_registers) { - discard_interference_graph(); - build_interference_graph(true); - } - spill_reg(reg); spilled++; }