void setup_initial_values();
void run();
+ void dump_block_data() const;
+
void *mem_ctx;
cfg_t *cfg;
for (int i = 0; i < bitset_words; i++) {
const BITSET_WORD old_liveout = bd[b].liveout[i];
- bd[b].liveout[i] |=
+ bd[b].liveout[i] =
bd[b].copy[i] | (bd[b].livein[i] & ~bd[b].kill[i]);
if (old_liveout != bd[b].liveout[i])
continue;
for (int i = 0; i < bitset_words; i++) {
- BITSET_WORD new_livein = ~bd[b].livein[i];
+ const BITSET_WORD old_livein = bd[b].livein[i];
+
+ bd[b].livein[i] = ~0u;
foreach_list(block_node, &cfg->blocks[b]->parents) {
bblock_link *link = (bblock_link *)block_node;
bblock_t *block = link->block;
- new_livein &= bd[block->block_num].liveout[i];
- if (!new_livein)
- break;
+ bd[b].livein[i] &= bd[block->block_num].liveout[i];
}
- if (new_livein) {
- bd[b].livein[i] |= new_livein;
+
+ if (old_livein != bd[b].livein[i])
progress = true;
- }
}
}
} while (progress);
}
+void
+fs_copy_prop_dataflow::dump_block_data() const
+{
+ for (int b = 0; b < cfg->num_blocks; b++) {
+ bblock_t *block = cfg->blocks[b];
+ printf("Block %d [%d, %d] (parents ", block->block_num,
+ block->start_ip, block->end_ip);
+ foreach_list(block_node, &block->parents) {
+ bblock_t *parent = ((bblock_link *) block_node)->block;
+ printf("%d ", parent->block_num);
+ }
+ printf("):\n");
+ printf(" livein = 0x");
+ for (int i = 0; i < bitset_words; i++)
+ printf("%08x", bd[b].livein[i]);
+ printf(", liveout = 0x");
+ for (int i = 0; i < bitset_words; i++)
+ printf("%08x", bd[b].liveout[i]);
+ printf(",\n copy = 0x");
+ for (int i = 0; i < bitset_words; i++)
+ printf("%08x", bd[b].copy[i]);
+ printf(", kill = 0x");
+ for (int i = 0; i < bitset_words; i++)
+ printf("%08x", bd[b].kill[i]);
+ printf("\n");
+ }
+}
+
bool
fs_visitor::try_copy_propagate(fs_inst *inst, int arg, acp_entry *entry)
{
out_acp[b]) || progress;
}
- #if 0
/* Do dataflow analysis for those available copies. */
fs_copy_prop_dataflow dataflow(mem_ctx, &cfg, out_acp);
progress = opt_copy_propagate_local(mem_ctx, block, in_acp) || progress;
}
- #endif
for (int i = 0; i < cfg.num_blocks; i++)
delete [] out_acp[i];