summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
diff options
context:
space:
mode:
authorFrancisco Jerez <currojerez@riseup.net>2016-05-26 18:51:41 -0700
committerFrancisco Jerez <currojerez@riseup.net>2016-05-27 23:29:06 -0700
commitad8f66ed33172ab40d4679063780a501b6f80740 (patch)
tree833509d5036fd92c1146bc012363ea976fdceae5 /src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
parentc88b52745c754619d3e7af73abb71adfcc63cc7a (diff)
downloadexternal_mesa3d-ad8f66ed33172ab40d4679063780a501b6f80740.zip
external_mesa3d-ad8f66ed33172ab40d4679063780a501b6f80740.tar.gz
external_mesa3d-ad8f66ed33172ab40d4679063780a501b6f80740.tar.bz2
i965/fs: Fix multiple ACP interference during copy propagation.
This is more fallout from cf375a3333e54a01462f192202d609436e5fbec8. It's possible for multiple ACP entries to interfere with a given VGRF write, so we need to continue iterating even if an overlapping entry has already been found. Cc: Samuel Iglesias Gonsálvez <siglesias@igalia.com> Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Diffstat (limited to 'src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp')
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp8
1 files changed, 2 insertions, 6 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 6aec506..f93a20c 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
@@ -758,10 +758,8 @@ fs_visitor::opt_copy_propagate_local(void *copy_prop_ctx, bblock_t *block,
if (inst->dst.file == VGRF) {
foreach_in_list_safe(acp_entry, entry, &acp[inst->dst.nr % ACP_HASH_SIZE]) {
if (regions_overlap(entry->dst, entry->regs_written,
- inst->dst, inst->regs_written)) {
+ inst->dst, inst->regs_written))
entry->remove();
- break;
- }
}
/* Oops, we only have the chaining hash based on the destination, not
@@ -773,10 +771,8 @@ fs_visitor::opt_copy_propagate_local(void *copy_prop_ctx, bblock_t *block,
* _any_ of the registers that it reads
*/
if (regions_overlap(entry->src, entry->regs_read,
- inst->dst, inst->regs_written)) {
+ inst->dst, inst->regs_written))
entry->remove();
- continue;
- }
}
}
}