intel/fs: Skip registers faster when setting spill costs

This might be slightly faster since we're doing one read rather than
two before we decide to skip.  The more important reason, however, is
because no_spill prevents us from re-spilling spill registers.  In the
new world in which we don't re-calculate liveness every spill, we may
not have valid liveness for spill registers so we shouldn't even look
their live ranges up.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=110825
Fixes: e99081e76d "intel/fs/ra: Spill without destroying the..."
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Tested-by: Tapani Pälli <tapani.palli@intel.com>
This commit is contained in:
Jason Ekstrand
2019-06-03 17:09:12 -05:00
parent d68218dbca
commit a84de3fb7c

View File

@@ -922,6 +922,15 @@ fs_reg_alloc::set_spill_costs()
} }
for (unsigned i = 0; i < fs->alloc.count; i++) { for (unsigned i = 0; i < fs->alloc.count; i++) {
/* Do the no_spill check first. Registers that are used as spill
* temporaries may have been allocated after we calculated liveness so
* we shouldn't look their liveness up. Fortunately, they're always
* used in SCRATCH_READ/WRITE instructions so they'll always be flagged
* no_spill.
*/
if (no_spill[i])
continue;
int live_length = fs->virtual_grf_end[i] - fs->virtual_grf_start[i]; int live_length = fs->virtual_grf_end[i] - fs->virtual_grf_start[i];
if (live_length <= 0) if (live_length <= 0)
continue; continue;
@@ -934,8 +943,7 @@ fs_reg_alloc::set_spill_costs()
* to spill medium length registers with more uses. * to spill medium length registers with more uses.
*/ */
float adjusted_cost = spill_costs[i] / logf(live_length); float adjusted_cost = spill_costs[i] / logf(live_length);
if (!no_spill[i]) ra_set_node_spill_cost(g, first_vgrf_node + i, adjusted_cost);
ra_set_node_spill_cost(g, first_vgrf_node + i, adjusted_cost);
} }
have_spill_costs = true; have_spill_costs = true;