From 8770b7f426e2925ddaf3cf022d67c683efc54c10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20=C5=9Alusarz?= Date: Tue, 10 Nov 2020 17:32:15 +0100 Subject: [PATCH] nir: handle float atomics in copy propagation pass MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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: 8424cd8fbd1 ("nir: Account for atomics in copy propagation.") Suggested-by: Jason Ekstrand Signed-off-by: Marcin Ĺšlusarz Reviewed-by: Rhys Perry Reviewed-by: Jason Ekstrand Part-of: (cherry picked from commit 6e6dab479907fe79ed24e69be841dd3ec7bd479e) --- .pick_status.json | 2 +- src/compiler/nir/nir_opt_copy_prop_vars.c | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.pick_status.json b/.pick_status.json index 51a0ee8d537..c09e1101a31 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -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" }, diff --git a/src/compiler/nir/nir_opt_copy_prop_vars.c b/src/compiler/nir/nir_opt_copy_prop_vars.c index fddbf88daf9..efabb5aff88 100644 --- a/src/compiler/nir/nir_opt_copy_prop_vars.c +++ b/src/compiler/nir/nir_opt_copy_prop_vars.c @@ -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]);