mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 08:40:11 +01:00
nir/copy_prop_vars: Ignore volatile accesses
The spec explicitly says that volatile writes can't be removed and volatile reads do not guarantee that the same value will still be around after the read, as if there were a barrier after each read/write. Just ignore them. Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
This commit is contained in:
parent
364996d70d
commit
75063fbac5
1 changed files with 13 additions and 0 deletions
|
|
@ -812,6 +812,9 @@ copy_prop_vars_block(struct copy_prop_var_state *state,
|
|||
case nir_intrinsic_load_deref: {
|
||||
if (debug) dump_instr(instr);
|
||||
|
||||
if (nir_intrinsic_access(intrin) & ACCESS_VOLATILE)
|
||||
break;
|
||||
|
||||
nir_deref_instr *src = nir_src_as_deref(intrin->src[0]);
|
||||
|
||||
/* Direct array_derefs of vectors operate on the vectors (the parent
|
||||
|
|
@ -892,6 +895,9 @@ copy_prop_vars_block(struct copy_prop_var_state *state,
|
|||
case nir_intrinsic_store_deref: {
|
||||
if (debug) dump_instr(instr);
|
||||
|
||||
if (nir_intrinsic_access(intrin) & ACCESS_VOLATILE)
|
||||
break;
|
||||
|
||||
nir_deref_instr *dst = nir_src_as_deref(intrin->src[0]);
|
||||
assert(glsl_type_is_vector_or_scalar(dst->type));
|
||||
|
||||
|
|
@ -936,6 +942,10 @@ copy_prop_vars_block(struct copy_prop_var_state *state,
|
|||
case nir_intrinsic_copy_deref: {
|
||||
if (debug) dump_instr(instr);
|
||||
|
||||
if ((nir_intrinsic_src_access(intrin) & ACCESS_VOLATILE) ||
|
||||
(nir_intrinsic_dst_access(intrin) & ACCESS_VOLATILE))
|
||||
break;
|
||||
|
||||
nir_deref_instr *dst = nir_src_as_deref(intrin->src[0]);
|
||||
nir_deref_instr *src = nir_src_as_deref(intrin->src[1]);
|
||||
|
||||
|
|
@ -1005,6 +1015,9 @@ copy_prop_vars_block(struct copy_prop_var_state *state,
|
|||
case nir_intrinsic_deref_atomic_comp_swap:
|
||||
if (debug) dump_instr(instr);
|
||||
|
||||
if (nir_intrinsic_access(intrin) & ACCESS_VOLATILE)
|
||||
break;
|
||||
|
||||
nir_deref_instr *dst = nir_src_as_deref(intrin->src[0]);
|
||||
unsigned num_components = glsl_get_vector_elements(dst->type);
|
||||
unsigned full_mask = (1 << num_components) - 1;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue