Having the direct copy case short-circuit the loop doesn't make sense.
In both cases, we need to update the destination's current value, as
well as the current value of any register that pointed to our
destination.  The only difference is whether or not we know our
destination's current value.

By removing the "continue", we can remove the duplicated block
introduced in the previous commit and share code.

Cc: Eric Anholt <e...@anholt.net>
Cc: Matt Turner <matts...@gmail.com>
Cc: Christopher James Halse Rogers <chalserog...@gmail.com>
Signed-off-by: Kenneth Graunke <kenn...@whitecape.org>
---
 .../drivers/dri/i965/brw_vec4_copy_propagation.cpp |   40 +++++--------------
 1 files changed, 11 insertions(+), 29 deletions(-)

Sorry this is hard to follow...

diff --git a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp 
b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
index 3e24903..08d8f5b 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
@@ -297,44 +297,26 @@ vec4_visitor::opt_copy_propagation()
       }
 
       /* Track available source registers. */
-      if (is_direct_copy(inst)) {
-        int reg = virtual_grf_reg_map[inst->dst.reg] + inst->dst.reg_offset;
-        for (int i = 0; i < 4; i++) {
-           if (inst->dst.writemask & (1 << i)) {
-              cur_value[reg][i] = &inst->src[0];
-           }
-        }
+      const int reg = virtual_grf_reg_map[inst->dst.reg] + 
inst->dst.reg_offset;
 
-        /* For any updated channels, clear tracking of them as a source. */
-        for (int i = 0; i < virtual_grf_reg_count; i++) {
-           for (int j = 0; j < 4; j++) {
-              if (inst->dst.writemask & (1 << j) &&
-                  cur_value[i][j] &&
-                  cur_value[i][j]->file == GRF &&
-                  cur_value[i][j]->reg == inst->dst.reg &&
-                  cur_value[i][j]->reg_offset == inst->dst.reg_offset) {
-                 cur_value[i][j] = NULL;
-              }
-           }
+      /* Update our destination's current channel values.  For a direct copy,
+       * the value is the newly propagated source.  Otherwise, we don't know
+       * the new value, so clear it.
+       */
+      bool direct_copy = is_direct_copy(inst);
+      for (int i = 0; i < 4; i++) {
+        if (inst->dst.writemask & (1 << i)) {
+           cur_value[reg][i] = direct_copy ? &inst->src[0] : NULL;
         }
-
-        continue;
       }
 
-      /* For any updated channels, clear tracking of them as a source
-       * or destination.
+      /* Clear the records for any registers whose current value came from
+       * our destination's updated channels, as the two are no longer equal.
        */
       if (inst->dst.file == GRF) {
         if (inst->dst.reladdr)
            memset(cur_value, 0, sizeof(cur_value));
         else {
-           int reg = virtual_grf_reg_map[inst->dst.reg] + inst->dst.reg_offset;
-
-           for (int i = 0; i < 4; i++) {
-              if (inst->dst.writemask & (1 << i))
-                 cur_value[reg][i] = NULL;
-           }
-
            for (int i = 0; i < virtual_grf_reg_count; i++) {
               for (int j = 0; j < 4; j++) {
                  if (inst->dst.writemask & (1 << j) &&
-- 
1.7.7.3

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to