*/
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.
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++) {
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++;
}