i965/vs: Slightly improve the trivial reg allocator to skip unused regs.
authorEric Anholt <eric@anholt.net>
Mon, 8 Aug 2011 22:56:11 +0000 (15:56 -0700)
committerEric Anholt <eric@anholt.net>
Tue, 16 Aug 2011 20:04:42 +0000 (13:04 -0700)
This fixes most of the regressions in the vs array test set from the
varying array indexing work, since the giant array that was originally
allocated in virtual GRF space never gets used and is only ever
read/stored from scratch space.

src/mesa/drivers/dri/i965/brw_vec4_reg_allocate.cpp

index e7f6b28a536aba62e502057f7f320d6236f51753..1bfd84d76e8690c7dd14893f651955d23969aa90 100644 (file)
@@ -41,15 +41,37 @@ vec4_visitor::reg_allocate_trivial()
 {
    int last_grf = 0;
    int hw_reg_mapping[this->virtual_grf_count];
+   bool virtual_grf_used[this->virtual_grf_count];
    int i;
    int next;
 
+   /* Calculate which virtual GRFs are actually in use after whatever
+    * optimization passes have occurred.
+    */
+   for (int i = 0; i < this->virtual_grf_count; i++) {
+      virtual_grf_used[i] = false;
+   }
+
+   foreach_iter(exec_list_iterator, iter, this->instructions) {
+      vec4_instruction *inst = (vec4_instruction *)iter.get();
+
+      if (inst->dst.file == GRF)
+        virtual_grf_used[inst->dst.reg] = true;
+
+      for (int i = 0; i < 3; i++) {
+        if (inst->src[i].file == GRF)
+           virtual_grf_used[inst->src[i].reg] = true;
+      }
+   }
+
    /* Note that compressed instructions require alignment to 2 registers. */
    hw_reg_mapping[0] = this->first_non_payload_grf;
    next = hw_reg_mapping[0] + this->virtual_grf_sizes[0];
    for (i = 1; i < this->virtual_grf_count; i++) {
-      hw_reg_mapping[i] = next;
-      next += this->virtual_grf_sizes[i];
+      if (virtual_grf_used[i]) {
+        hw_reg_mapping[i] = next;
+        next += this->virtual_grf_sizes[i];
+      }
    }
    prog_data->total_grf = next;