summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2019-05-07 18:14:46 -0500
committerJason Ekstrand <[email protected]>2019-05-14 12:30:22 -0500
commit0fd60e95fbfeff67651455f7897bf663572969e9 (patch)
treeb00fc44e58668a9427086618da8062dc35c70b42 /src
parent47b1dcdcab80db9179e1a28d7f46b98be091bdcf (diff)
intel/fs/ra: Do the spill loop inside RA
Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/intel/compiler/brw_fs.cpp4
-rw-r--r--src/intel/compiler/brw_fs_reg_allocate.cpp45
2 files changed, 28 insertions, 21 deletions
diff --git a/src/intel/compiler/brw_fs.cpp b/src/intel/compiler/brw_fs.cpp
index f9fbffca7ce..c942a35a434 100644
--- a/src/intel/compiler/brw_fs.cpp
+++ b/src/intel/compiler/brw_fs.cpp
@@ -7279,9 +7279,7 @@ fs_visitor::allocate_registers(unsigned min_dispatch_width, bool allow_spilling)
/* We should only spill registers on the last scheduling. */
assert(!spilled_any_registers);
- do {
- allocated = assign_regs(can_spill, spill_all);
- } while (!allocated && can_spill && !failed);
+ allocated = assign_regs(can_spill, spill_all);
if (allocated)
break;
}
diff --git a/src/intel/compiler/brw_fs_reg_allocate.cpp b/src/intel/compiler/brw_fs_reg_allocate.cpp
index 447f49f30a2..66a92095ab8 100644
--- a/src/intel/compiler/brw_fs_reg_allocate.cpp
+++ b/src/intel/compiler/brw_fs_reg_allocate.cpp
@@ -1051,32 +1051,36 @@ fs_reg_alloc::spill_reg(unsigned spill_reg)
bool
fs_reg_alloc::assign_regs(bool allow_spilling, bool spill_all)
{
- build_interference_graph(fs->spilled_any_registers);
+ while (1) {
+ build_interference_graph(fs->spilled_any_registers);
+
+ /* Debug of register spilling: Go spill everything. */
+ if (unlikely(spill_all)) {
+ int reg = choose_spill_reg();
+ if (reg != -1) {
+ spill_reg(reg);
+ ralloc_free(g);
+ g = NULL;
+ continue;
+ }
+ }
- /* Debug of register spilling: Go spill everything. */
- if (unlikely(spill_all)) {
- int reg = choose_spill_reg();
+ if (ra_allocate(g))
+ break;
- if (reg != -1) {
- spill_reg(reg);
+ if (!allow_spilling)
return false;
- }
- }
- if (!ra_allocate(g)) {
/* Failed to allocate registers. Spill a reg, and the caller will
* loop back into here to try again.
*/
int reg = choose_spill_reg();
+ if (reg == -1)
+ return false;
- if (reg == -1) {
- fs->fail("no register to spill:\n");
- fs->dump_instructions(NULL);
- } else if (allow_spilling) {
- spill_reg(reg);
- }
-
- return false;
+ spill_reg(reg);
+ ralloc_free(g);
+ g = NULL;
}
/* Get the chosen virtual registers for each node, and map virtual
@@ -1109,5 +1113,10 @@ bool
fs_visitor::assign_regs(bool allow_spilling, bool spill_all)
{
fs_reg_alloc alloc(this);
- return alloc.assign_regs(allow_spilling, spill_all);
+ bool success = alloc.assign_regs(allow_spilling, spill_all);
+ if (!success && allow_spilling) {
+ fail("no register to spill:\n");
+ dump_instructions(NULL);
+ }
+ return success;
}