mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 06:58:05 +02:00
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: e99081e76d ("intel/fs/ra: Spill without destroying the interference graph")
This commit is contained in:
parent
a3aadac5fe
commit
c5c02d0571
1 changed files with 12 additions and 9 deletions
|
|
@ -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++;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue