i965/fs: Create the COPY() set for use in copy propagation dataflow.
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 9 Aug 2013 06:29:56 +0000 (23:29 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 19 Aug 2013 18:29:24 +0000 (11:29 -0700)
This is the "COPY" set from Muchnick's textbook, which is necessary
to do the dataflow algorithm correctly.

v2: Simplify initialization based on Paul Berry's observation that
    out_acp contains exactly what needs to be in the COPY set.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Paul Berry <stereotype441@gmail.com>
src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp

index 634eb3d0a79bea4fba3acb96e1dc73c3fccbdc8c..424d7b52dcc73a9e9df793680d4d38439466d386 100644 (file)
@@ -60,6 +60,13 @@ struct block_data {
     */
    BITSET_WORD *liveout;
 
+   /**
+    * Which entries in the fs_copy_prop_dataflow acp table are generated by
+    * instructions in this block which reach the end of the block without
+    * being killed.
+    */
+   BITSET_WORD *copy;
+
    /**
     * Which entries in the fs_copy_prop_dataflow acp table are killed over the
     * course of this block.
@@ -110,6 +117,7 @@ fs_copy_prop_dataflow::fs_copy_prop_dataflow(void *mem_ctx, cfg_t *cfg,
    for (int b = 0; b < cfg->num_blocks; b++) {
       bd[b].livein = rzalloc_array(bd, BITSET_WORD, bitset_words);
       bd[b].liveout = rzalloc_array(bd, BITSET_WORD, bitset_words);
+      bd[b].copy = rzalloc_array(bd, BITSET_WORD, bitset_words);
       bd[b].kill = rzalloc_array(bd, BITSET_WORD, bitset_words);
 
       for (int i = 0; i < ACP_HASH_SIZE; i++) {
@@ -117,6 +125,13 @@ fs_copy_prop_dataflow::fs_copy_prop_dataflow(void *mem_ctx, cfg_t *cfg,
             acp_entry *entry = (acp_entry *)entry_node;
 
             acp[next_acp] = entry;
+
+            /* opt_copy_propagate_local populates out_acp with copies created
+             * in a block which are still live at the end of the block.  This
+             * is exactly what we want in the COPY set.
+             */
+            BITSET_SET(bd[b].copy, next_acp);
+
             BITSET_SET(bd[b].liveout, next_acp);
             next_acp++;
          }