i965/fs: Fix multiple ACP interference during copy propagation.
authorFrancisco Jerez <currojerez@riseup.net>
Fri, 27 May 2016 01:51:41 +0000 (18:51 -0700)
committerFrancisco Jerez <currojerez@riseup.net>
Sat, 28 May 2016 06:29:06 +0000 (23:29 -0700)
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>
src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp

index 6aec50617b20a895af22e0c0d1310816617c85c7..f93a20c7faabe259c6cfa1d015078c598a6ca552 100644 (file)
@@ -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;
-               }
             }
         }
       }