mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 02:38:04 +02:00
Merge branch 'elk-ra-fixes' into 'main'
intel/elk: Re-run register allocation once after recreating the graph See merge request mesa/mesa!29823
This commit is contained in:
commit
02463a382f
1 changed files with 25 additions and 9 deletions
|
|
@ -367,6 +367,7 @@ private:
|
|||
int rsi;
|
||||
|
||||
ra_graph *g;
|
||||
bool interference_graph_supports_spilling;
|
||||
bool have_spill_costs;
|
||||
|
||||
int payload_node_count;
|
||||
|
|
@ -612,6 +613,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;
|
||||
|
|
@ -904,6 +907,28 @@ 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);
|
||||
|
||||
/* ra_get_best_spill_node() relies on ra_allocate() having been called
|
||||
* once to set up the stack of trivially colorable and optimistically
|
||||
* colored nodes. By torching and rebuilding our interference graph,
|
||||
* we also discarded the information needed to pick spill candidates.
|
||||
*
|
||||
* The simplest (if expensive) solution is to call ra_allocate() again
|
||||
* on the new graph. This can't succeed - allocation already failed on
|
||||
* our old graph which had fewer constraints - but it creates the list
|
||||
* of spill candidates for our new more constrained graph.
|
||||
*/
|
||||
ASSERTED bool allocated = ra_allocate(g);
|
||||
assert(!allocated);
|
||||
}
|
||||
|
||||
if (!have_spill_costs)
|
||||
set_spill_costs();
|
||||
|
||||
|
|
@ -1138,15 +1163,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