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 <jenatali@microsoft.com>
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6332>
This commit is contained in:
Jason Ekstrand 2020-11-01 17:46:56 -06:00 committed by Marge Bot
parent 379d535480
commit ced9b6f0d8
3 changed files with 7 additions and 7 deletions

View file

@ -174,7 +174,7 @@ static void
combine_stores_with_deref(struct combine_stores_state *state, combine_stores_with_deref(struct combine_stores_state *state,
nir_deref_instr *deref) nir_deref_instr *deref)
{ {
if ((state->modes & deref->mode) == 0) if (!nir_deref_mode_may_be(deref, state->modes))
return; return;
list_for_each_entry_safe(struct combined_store, combo, &state->pending, link) { 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; return;
list_for_each_entry_safe(struct combined_store, combo, &state->pending, link) { 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); combine_stores(state, combo);
free_combined_store(state, combo); free_combined_store(state, combo);
} }
@ -216,7 +216,7 @@ update_combined_store(struct combine_stores_state *state,
nir_intrinsic_instr *intrin) nir_intrinsic_instr *intrin)
{ {
nir_deref_instr *dst = nir_src_as_deref(intrin->src[0]); 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; return;
unsigned vec_mask; unsigned vec_mask;

View file

@ -401,8 +401,8 @@ apply_barrier_for_modes(struct util_dynarray *copies,
nir_variable_mode modes) nir_variable_mode modes)
{ {
util_dynarray_foreach_reverse(copies, struct copy_entry, iter) { util_dynarray_foreach_reverse(copies, struct copy_entry, iter) {
if ((iter->dst->mode & modes) || if (nir_deref_mode_may_be(iter->dst, modes) ||
(!iter->src.is_ssa && (iter->src.deref->mode & modes))) (!iter->src.is_ssa && nir_deref_mode_may_be(iter->src.deref, modes)))
copy_entry_remove(copies, iter); 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; struct vars_written *written = ht_entry->data;
if (written->modes) { if (written->modes) {
util_dynarray_foreach_reverse(copies, struct copy_entry, entry) { 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); copy_entry_remove(copies, entry);
} }
} }

View file

@ -56,7 +56,7 @@ static void
clear_unused_for_modes(struct util_dynarray *unused_writes, nir_variable_mode modes) clear_unused_for_modes(struct util_dynarray *unused_writes, nir_variable_mode modes)
{ {
util_dynarray_foreach_reverse(unused_writes, struct write_entry, entry) { 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); *entry = util_dynarray_pop(unused_writes, struct write_entry);
} }
} }