aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/compiler/nir/nir_opt_copy_prop_vars.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/compiler/nir/nir_opt_copy_prop_vars.c b/src/compiler/nir/nir_opt_copy_prop_vars.c
index b95a455a109..7fc84083ea6 100644
--- a/src/compiler/nir/nir_opt_copy_prop_vars.c
+++ b/src/compiler/nir/nir_opt_copy_prop_vars.c
@@ -302,12 +302,17 @@ lookup_entry_for_deref(struct util_dynarray *copies,
nir_deref_instr *deref,
nir_deref_compare_result allowed_comparisons)
{
+ struct copy_entry *entry = NULL;
util_dynarray_foreach(copies, struct copy_entry, iter) {
- if (nir_compare_derefs(iter->dst, deref) & allowed_comparisons)
- return iter;
+ nir_deref_compare_result result = nir_compare_derefs(iter->dst, deref);
+ if (result & allowed_comparisons) {
+ entry = iter;
+ if (result & nir_derefs_equal_bit)
+ break;
+ /* Keep looking in case we have an equal match later in the array. */
+ }
}
-
- return NULL;
+ return entry;
}
static struct copy_entry *