fs_copy_prop_dataflow::setup_kills() walks through each basic block's instructions, looking for instructions which overwrite registers used in ACP entries.
This would be fine, except that it didn't exclude the instructions which generated the ACP entries in the first place. This meant that every copy was killed by its own generating instruction, making the dataflow analysis useless. To fix this, this patch records the generating instruction in the ACP entry. It then skips the kill checks when processing that instruction. Using a void pointer ensures it will only be used for comparisons, and not dereferenced. Signed-off-by: Kenneth Graunke <kenn...@whitecape.org> --- src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) 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 d8d1546..379605c 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp @@ -42,6 +42,9 @@ namespace { /* avoid conflict with opt_copy_propagation_elements */ struct acp_entry : public exec_node { fs_reg dst; fs_reg src; + + /** MOV instruction which generated this copy/ACP entry. */ + void *inst; }; struct block_data { @@ -146,8 +149,9 @@ fs_copy_prop_dataflow::setup_kills() continue; for (int i = 0; i < num_acp; i++) { - if (inst->overwrites_reg(acp[i]->dst) || - inst->overwrites_reg(acp[i]->src)) { + if (inst != acp[i]->inst && + (inst->overwrites_reg(acp[i]->dst) || + inst->overwrites_reg(acp[i]->src))) { BITSET_SET(bd[b].kill, i); } } @@ -418,6 +422,7 @@ fs_visitor::opt_copy_propagate_local(void *mem_ctx, bblock_t *block, acp_entry *entry = ralloc(mem_ctx, acp_entry); entry->dst = inst->dst; entry->src = inst->src[0]; + entry->inst = inst; acp[entry->dst.reg % ACP_HASH_SIZE].push_tail(entry); } } -- 1.8.3.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev