i965/vec4: Fix handling of multiple register reads and writes in dead_code_eliminate().
authorFrancisco Jerez <currojerez@riseup.net>
Wed, 18 Mar 2015 19:06:28 +0000 (21:06 +0200)
committerFrancisco Jerez <currojerez@riseup.net>
Mon, 23 Mar 2015 12:52:57 +0000 (14:52 +0200)
Reviewed-by: Matt Turner <mattst88@gmail.com>
src/mesa/drivers/dri/i965/brw_vec4_dead_code_eliminate.cpp

index e4ce4960428a45d3cef8f3391a80271ee0453702..980e266750a45075d1e6c1a7a8b27dc79d139b4c 100644 (file)
@@ -80,8 +80,10 @@ vec4_visitor::dead_code_eliminate()
          if (inst->dst.file == GRF && !inst->has_side_effects()) {
             bool result_live[4] = { false };
 
-            for (int c = 0; c < 4; c++) {
-               result_live[c] = BITSET_TEST(live, var_from_reg(alloc, inst->dst, c));
+            for (unsigned i = 0; i < inst->regs_written; i++) {
+               for (int c = 0; c < 4; c++)
+                  result_live[c] |= BITSET_TEST(
+                     live, var_from_reg(alloc, offset(inst->dst, i), c));
             }
 
             /* If the instruction can't do writemasking, then it's all or
@@ -122,9 +124,12 @@ vec4_visitor::dead_code_eliminate()
          }
 
          if (inst->dst.file == GRF && !inst->predicate) {
-            for (int c = 0; c < 4; c++) {
-               if (inst->dst.writemask & (1 << c)) {
-                  BITSET_CLEAR(live, var_from_reg(alloc, inst->dst, c));
+            for (unsigned i = 0; i < inst->regs_written; i++) {
+               for (int c = 0; c < 4; c++) {
+                  if (inst->dst.writemask & (1 << c)) {
+                     BITSET_CLEAR(live, var_from_reg(alloc,
+                                                     offset(inst->dst, i), c));
+                  }
                }
             }
          }
@@ -135,8 +140,11 @@ vec4_visitor::dead_code_eliminate()
 
          for (int i = 0; i < 3; i++) {
             if (inst->src[i].file == GRF) {
-               for (int c = 0; c < 4; c++) {
-                  BITSET_SET(live, var_from_reg(alloc, inst->src[i], c));
+               for (unsigned j = 0; j < inst->regs_read(i); j++) {
+                  for (int c = 0; c < 4; c++) {
+                     BITSET_SET(live, var_from_reg(alloc,
+                                                   offset(inst->src[i], j), c));
+                  }
                }
             }
          }