diff options
author | Jason Ekstrand <[email protected]> | 2019-05-07 18:14:46 -0500 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2019-05-14 12:30:22 -0500 |
commit | 0fd60e95fbfeff67651455f7897bf663572969e9 (patch) | |
tree | b00fc44e58668a9427086618da8062dc35c70b42 /src | |
parent | 47b1dcdcab80db9179e1a28d7f46b98be091bdcf (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.cpp | 4 | ||||
-rw-r--r-- | src/intel/compiler/brw_fs_reg_allocate.cpp | 45 |
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; } |