nir: handle float atomics in copy propagation pass

Without this patch, copy propagation pass can optimize out
buffer loads out of compare & swap loop, which then leads
to infinite loop.

Triggered by a change to atomicCompSwap float test in piglit.

Fixes: 8424cd8fbd ("nir: Account for atomics in copy propagation.")
Suggested-by: Jason Ekstrand <jason@jlekstrand.net>
Signed-off-by: Marcin Ślusarz <marcin.slusarz@intel.com>
Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7538>
(cherry picked from commit 6e6dab4799)
This commit is contained in:
Marcin Ślusarz 2020-11-10 17:32:15 +01:00 committed by Dylan Baker
parent e9fe1addb7
commit 8770b7f426
2 changed files with 9 additions and 1 deletions

View file

@ -2965,7 +2965,7 @@
"description": "nir: handle float atomics in copy propagation pass",
"nominated": true,
"nomination_type": 1,
"resolution": 0,
"resolution": 1,
"master_sha": null,
"because_sha": "8424cd8fbd1671c4c13f57cfa34bf8145d0fffcf"
},

View file

@ -185,15 +185,19 @@ gather_vars_written(struct copy_prop_var_state *state,
break;
case nir_intrinsic_deref_atomic_add:
case nir_intrinsic_deref_atomic_fadd:
case nir_intrinsic_deref_atomic_imin:
case nir_intrinsic_deref_atomic_umin:
case nir_intrinsic_deref_atomic_fmin:
case nir_intrinsic_deref_atomic_imax:
case nir_intrinsic_deref_atomic_umax:
case nir_intrinsic_deref_atomic_fmax:
case nir_intrinsic_deref_atomic_and:
case nir_intrinsic_deref_atomic_or:
case nir_intrinsic_deref_atomic_xor:
case nir_intrinsic_deref_atomic_exchange:
case nir_intrinsic_deref_atomic_comp_swap:
case nir_intrinsic_deref_atomic_fcomp_swap:
case nir_intrinsic_store_deref:
case nir_intrinsic_copy_deref: {
/* Destination in all of store_deref, copy_deref and the atomics is src[0]. */
@ -1057,15 +1061,19 @@ copy_prop_vars_block(struct copy_prop_var_state *state,
}
case nir_intrinsic_deref_atomic_add:
case nir_intrinsic_deref_atomic_fadd:
case nir_intrinsic_deref_atomic_imin:
case nir_intrinsic_deref_atomic_umin:
case nir_intrinsic_deref_atomic_fmin:
case nir_intrinsic_deref_atomic_imax:
case nir_intrinsic_deref_atomic_umax:
case nir_intrinsic_deref_atomic_fmax:
case nir_intrinsic_deref_atomic_and:
case nir_intrinsic_deref_atomic_or:
case nir_intrinsic_deref_atomic_xor:
case nir_intrinsic_deref_atomic_exchange:
case nir_intrinsic_deref_atomic_comp_swap:
case nir_intrinsic_deref_atomic_fcomp_swap:
if (debug) dump_instr(instr);
nir_deref_instr *dst = nir_src_as_deref(intrin->src[0]);