i965: Be more conservative on live interval calculation.
authorEric Anholt <eric@anholt.net>
Sun, 3 Oct 2010 22:01:20 +0000 (15:01 -0700)
committerEric Anholt <eric@anholt.net>
Mon, 4 Oct 2010 23:08:17 +0000 (16:08 -0700)
This also means that our intervals now highlight dead code.

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

index 5ebf9063df2b8f10cf3a0c35d213ef21fe68bde6..6106445fbb73931b4e165c821bea6b2e539955dc 100644 (file)
@@ -2471,7 +2471,7 @@ fs_visitor::calculate_live_intervals()
 
    for (int i = 0; i < num_vars; i++) {
       def[i] = 1 << 30;
-      use[i] = 0;
+      use[i] = -1;
    }
 
    int ip = 0;
@@ -2506,13 +2506,11 @@ fs_visitor::calculate_live_intervals()
 
         for (unsigned int i = 0; i < 3; i++) {
            if (inst->src[i].file == GRF && inst->src[i].reg != 0) {
-              def[inst->src[i].reg] = MIN2(def[inst->src[i].reg], eip);
               use[inst->src[i].reg] = MAX2(use[inst->src[i].reg], eip);
            }
         }
         if (inst->dst.file == GRF && inst->dst.reg != 0) {
            def[inst->dst.reg] = MIN2(def[inst->dst.reg], eip);
-           use[inst->dst.reg] = MAX2(use[inst->dst.reg], eip);
         }
       }
 
@@ -2529,6 +2527,16 @@ fs_visitor::virtual_grf_interferes(int a, int b)
    int start = MAX2(this->virtual_grf_def[a], this->virtual_grf_def[b]);
    int end = MIN2(this->virtual_grf_use[a], this->virtual_grf_use[b]);
 
+   /* For dead code, just check if the def interferes with the other range. */
+   if (this->virtual_grf_use[a] == -1) {
+      return (this->virtual_grf_def[a] >= this->virtual_grf_def[b] &&
+             this->virtual_grf_def[a] < this->virtual_grf_use[b]);
+   }
+   if (this->virtual_grf_use[b] == -1) {
+      return (this->virtual_grf_def[b] >= this->virtual_grf_def[a] &&
+             this->virtual_grf_def[b] < this->virtual_grf_use[a]);
+   }
+
    return start <= end;
 }