From ced9b6f0d8ef4211afd5ea4c09edabd2b3b80f27 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Sun, 1 Nov 2020 17:46:56 -0600 Subject: [PATCH] nir: Use nir_deref_mode_may_be in deref optimizations All the checks being replaced are fore potential aliasing so we want to flush stores whenever the mode might be something that aliases. Reviewed-by: Jesse Natalie Reviewed-by: Caio Marcelo de Oliveira Filho Part-of: --- src/compiler/nir/nir_opt_combine_stores.c | 6 +++--- src/compiler/nir/nir_opt_copy_prop_vars.c | 6 +++--- src/compiler/nir/nir_opt_dead_write_vars.c | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/compiler/nir/nir_opt_combine_stores.c b/src/compiler/nir/nir_opt_combine_stores.c index 19671b7d223..e97f81d21f7 100644 --- a/src/compiler/nir/nir_opt_combine_stores.c +++ b/src/compiler/nir/nir_opt_combine_stores.c @@ -174,7 +174,7 @@ static void combine_stores_with_deref(struct combine_stores_state *state, nir_deref_instr *deref) { - if ((state->modes & deref->mode) == 0) + if (!nir_deref_mode_may_be(deref, state->modes)) return; list_for_each_entry_safe(struct combined_store, combo, &state->pending, link) { @@ -193,7 +193,7 @@ combine_stores_with_modes(struct combine_stores_state *state, return; list_for_each_entry_safe(struct combined_store, combo, &state->pending, link) { - if (combo->dst->mode & modes) { + if (nir_deref_mode_may_be(combo->dst, modes)) { combine_stores(state, combo); free_combined_store(state, combo); } @@ -216,7 +216,7 @@ update_combined_store(struct combine_stores_state *state, nir_intrinsic_instr *intrin) { nir_deref_instr *dst = nir_src_as_deref(intrin->src[0]); - if ((dst->mode & state->modes) == 0) + if (!nir_deref_mode_may_be(dst, state->modes)) return; unsigned vec_mask; diff --git a/src/compiler/nir/nir_opt_copy_prop_vars.c b/src/compiler/nir/nir_opt_copy_prop_vars.c index e29b225759d..6fcd16fa863 100644 --- a/src/compiler/nir/nir_opt_copy_prop_vars.c +++ b/src/compiler/nir/nir_opt_copy_prop_vars.c @@ -401,8 +401,8 @@ apply_barrier_for_modes(struct util_dynarray *copies, nir_variable_mode modes) { util_dynarray_foreach_reverse(copies, struct copy_entry, iter) { - if ((iter->dst->mode & modes) || - (!iter->src.is_ssa && (iter->src.deref->mode & modes))) + if (nir_deref_mode_may_be(iter->dst, modes) || + (!iter->src.is_ssa && nir_deref_mode_may_be(iter->src.deref, modes))) copy_entry_remove(copies, iter); } } @@ -704,7 +704,7 @@ invalidate_copies_for_cf_node(struct copy_prop_var_state *state, struct vars_written *written = ht_entry->data; if (written->modes) { util_dynarray_foreach_reverse(copies, struct copy_entry, entry) { - if (entry->dst->mode & written->modes) + if (nir_deref_mode_may_be(entry->dst, written->modes)) copy_entry_remove(copies, entry); } } diff --git a/src/compiler/nir/nir_opt_dead_write_vars.c b/src/compiler/nir/nir_opt_dead_write_vars.c index b9d167a878e..ba98a2d202e 100644 --- a/src/compiler/nir/nir_opt_dead_write_vars.c +++ b/src/compiler/nir/nir_opt_dead_write_vars.c @@ -56,7 +56,7 @@ static void clear_unused_for_modes(struct util_dynarray *unused_writes, nir_variable_mode modes) { util_dynarray_foreach_reverse(unused_writes, struct write_entry, entry) { - if (entry->dst->mode & modes) + if (nir_deref_mode_may_be(entry->dst, modes)) *entry = util_dynarray_pop(unused_writes, struct write_entry); } }