i965/fs: Remove broken optimization for live intervals in loops.
authorEric Anholt <eric@anholt.net>
Sun, 3 Apr 2011 04:11:32 +0000 (18:11 -1000)
committerEric Anholt <eric@anholt.net>
Fri, 8 Apr 2011 18:04:00 +0000 (08:04 -1000)
The theory here was to detect a temporary variable used within a loop,
and avoid considering it live across the entire loop.  However, it was
overeager and failed when the first definition of the variable
appeared within the loop but was only conditionally defined.

Fixes glsl-fs-loop-redundant-condition.

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

index cada1401821c96ab092b88698ecbe9b76d1ed2c2..99cd8f833a7087aaa4447f979dadc8a725b81b19 100644 (file)
@@ -2812,8 +2812,7 @@ fs_visitor::calculate_live_intervals()
            if (inst->src[i].file == GRF && inst->src[i].reg != 0) {
               int reg = inst->src[i].reg;
 
-              if (!loop_depth || (this->virtual_grf_sizes[reg] == 1 &&
-                                  def[reg] >= bb_header_ip)) {
+              if (!loop_depth) {
                  use[reg] = ip;
               } else {
                  def[reg] = MIN2(loop_start, def[reg]);
@@ -2829,8 +2828,7 @@ fs_visitor::calculate_live_intervals()
         if (inst->dst.file == GRF && inst->dst.reg != 0) {
            int reg = inst->dst.reg;
 
-           if (!loop_depth || (this->virtual_grf_sizes[reg] == 1 &&
-                               !inst->predicated)) {
+           if (!loop_depth) {
               def[reg] = MIN2(def[reg], ip);
            } else {
               def[reg] = MIN2(def[reg], loop_start);