i965/vec4: skip registers already marked as no_spill
authorJuan A. Suarez Romero <jasuarez@igalia.com>
Tue, 8 Nov 2016 10:59:44 +0000 (11:59 +0100)
committerJuan A. Suarez Romero <jasuarez@igalia.com>
Mon, 14 Nov 2016 09:09:30 +0000 (10:09 +0100)
Do not evaluate spill costs for registers that were already marked as
no_spill.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_vec4_reg_allocate.cpp

index 228e04c44dec8e8b4bcccdb04a3f4ddae10f83e6..5a5be8575141636db3316c03be3a84c230fb40a4 100644 (file)
@@ -385,7 +385,7 @@ vec4_visitor::evaluate_spill_costs(float *spill_costs, bool *no_spill)
     */
    foreach_block_and_inst(block, vec4_instruction, inst, cfg) {
       for (unsigned int i = 0; i < 3; i++) {
-         if (inst->src[i].file == VGRF) {
+         if (inst->src[i].file == VGRF && !no_spill[inst->src[i].nr]) {
             /* We will only unspill src[i] it it wasn't unspilled for the
              * previous instruction, in which case we'll just reuse the scratch
              * reg for this instruction.
@@ -399,7 +399,7 @@ vec4_visitor::evaluate_spill_costs(float *spill_costs, bool *no_spill)
          }
       }
 
-      if (inst->dst.file == VGRF) {
+      if (inst->dst.file == VGRF && !no_spill[inst->dst.nr]) {
          spill_costs[inst->dst.nr] += loop_scale;
          if (inst->dst.reladdr || inst->dst.offset % REG_SIZE != 0)
             no_spill[inst->dst.nr] = true;