<div dir="ltr">On 12 August 2013 13:11, Kenneth Graunke <span dir="ltr"><<a href="mailto:kenneth@whitecape.org" target="_blank">kenneth@whitecape.org</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">This is the "COPY" set from Muchnick's textbook, which is necessary<br>
to do the dataflow algorithm correctly.<br></blockquote><div><br></div><div>I believe this can be done more easily.  The only ACP entries that are in the hastable on exit from opt_copy_propagate_local() are the ones that made it to the end of the block.  So we should be able to simply populate the new "COPY" set in the "for" loop at the bottom of the fs_copy_prop_dataflow constructor.  We don't need to do the extra work you're doing in setup_initial_values().<br>
</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
Signed-off-by: Kenneth Graunke <<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a>><br>
---<br>
 .../drivers/dri/i965/brw_fs_copy_propagation.cpp   | 27 ++++++++++++++++++----<br>
 1 file changed, 23 insertions(+), 4 deletions(-)<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp<br>
index 7aff36b..2970af6 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp<br>
+++ b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp<br>
@@ -64,6 +64,13 @@ struct block_data {<br>
    BITSET_WORD *liveout;<br>
<br>
    /**<br>
+    * Which entries in the fs_copy_prop_dataflow acp table are generated by<br>
+    * instructions in this block which reach the end of the block without<br>
+    * being killed.<br>
+    */<br>
+   BITSET_WORD *copy;<br>
+<br>
+   /**<br>
     * Which entries in the fs_copy_prop_dataflow acp table are killed over the<br>
     * course of this block.<br>
     */<br>
@@ -113,6 +120,7 @@ fs_copy_prop_dataflow::fs_copy_prop_dataflow(void *mem_ctx, cfg_t *cfg,<br>
    for (int b = 0; b < cfg->num_blocks; b++) {<br>
       bd[b].livein = rzalloc_array(bd, BITSET_WORD, bitset_words);<br>
       bd[b].liveout = rzalloc_array(bd, BITSET_WORD, bitset_words);<br>
+      bd[b].copy = rzalloc_array(bd, BITSET_WORD, bitset_words);<br>
       bd[b].kill = rzalloc_array(bd, BITSET_WORD, bitset_words);<br>
<br>
       for (int i = 0; i < ACP_HASH_SIZE; i++) {<br>
@@ -148,15 +156,26 @@ fs_copy_prop_dataflow::setup_initial_values()<br>
          if (inst->dst.file != GRF)<br>
             continue;<br>
<br>
-         /* Mark ACP entries which are killed by this instruction. */<br>
          for (int i = 0; i < num_acp; i++) {<br>
-            if (inst != acp[i]->inst &&<br>
-                (inst->overwrites_reg(acp[i]->dst) ||<br>
-                 inst->overwrites_reg(acp[i]->src))) {<br>
+            if (inst == acp[i]->inst) {<br>
+               /* Add this entry to the COPY set. */<br>
+               BITSET_SET(bd[b].copy, i);<br>
+            } else if (inst->overwrites_reg(acp[i]->dst) ||<br>
+                       inst->overwrites_reg(acp[i]->src)) {<br>
+               /* The current instruction kills this copy.  Add the entry to<br>
+                * the KILL set.<br>
+                */<br>
                BITSET_SET(bd[b].kill, i);<br>
             }<br>
          }<br>
       }<br>
+<br>
+      /* Anything killed did not make it to the end of the block, so it<br>
+       * shouldn't be in COPY.<br>
+       */<br>
+      for (int i = 0; i < bitset_words; i++) {<br>
+         bd[b].copy[i] &= ~bd[b].kill[i];<br>
+      }<br>
    }<br>
 }<br>
<span class=""><font color="#888888"><br>
--<br>
1.8.3.4<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div></div>