From: Kenneth Graunke Date: Fri, 9 Aug 2013 06:29:56 +0000 (-0700) Subject: i965/fs: Create the COPY() set for use in copy propagation dataflow. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=597efd2b67d1afb8a95be38145c4f977ed36b672;p=mesa.git i965/fs: Create the COPY() set for use in copy propagation dataflow. 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 Reviewed-by: Paul Berry --- diff --git a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp index 634eb3d0a79..424d7b52dcc 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp @@ -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++; }