Module: Mesa
Branch: main
Commit: 22f7f167cdafe0facbab2ba2a89f5aadccc39dc5
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=22f7f167cdafe0facbab2ba2a89f5aadccc39dc5

Author: Emma Anholt <[email protected]>
Date:   Wed Oct 19 15:54:18 2022 -0700

nir/opt_phi_precision: Fix missing swizzles when narrowing phi srcs.

This NIR:

        vec4 32 ssa_169 = phi block_1: ssa_168, block_2: ssa_138
        vec1 16 ssa_209 = f2fmp ssa_169.x
        vec1 16 ssa_210 = f2fmp ssa_169.y
        vec1 16 ssa_211 = f2fmp ssa_169.z
        vec1 16 ssa_212 = f2fmp ssa_169.w
        vec4 16 ssa_213 = vec4 ssa_209, ssa_210, ssa_211, ssa_212
        intrinsic store_output (ssa_213, ssa_171) (base=0, wrmask=xyzw /*15*/, 
component=0, src_type=float16 /*144*/, io location=4 slots=1 mediump 
/*8388740*/, xfb() /*0*/, xfb2() /*0*/)

would turn into:

        vec4 32 ssa_169 = phi block_1: ssa_168, block_2: ssa_138
        vec4 16 ssa_216 = phi block_1: ssa_214, block_2: ssa_215
        vec1 16 ssa_209 = f2fmp ssa_169.x
        vec1 16 ssa_210 = f2fmp ssa_169.y
        vec1 16 ssa_211 = f2fmp ssa_169.z
        vec1 16 ssa_212 = f2fmp ssa_169.w
        vec4 16 ssa_213 = vec4 ssa_216.x, ssa_216.x, ssa_216.x, ssa_216.x
        intrinsic store_output (ssa_213, ssa_171) (base=0, wrmask=xyzw /*15*/, 
component=0, src_type=float16 /*144*/, io location=4 slots=1 mediump 
/*8388740*/, xfb() /*0*/, xfb2() /*0*/)

ignoring the swizzles from the f2fmp srcs.  Fixes failures in
dEQP-GLES2.functional.shaders.random.all_features.fragment.20 on
turnip+ANGLE.

Fixes: c7b935962b27 ("nir: Add pass to lower phi precision")
Reviewed-by: Connor Abbott <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19179>

---

 src/compiler/nir/nir_opt_phi_precision.c | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/src/compiler/nir/nir_opt_phi_precision.c 
b/src/compiler/nir/nir_opt_phi_precision.c
index 6213d5b04fa..caef5c465ff 100644
--- a/src/compiler/nir/nir_opt_phi_precision.c
+++ b/src/compiler/nir/nir_opt_phi_precision.c
@@ -249,14 +249,12 @@ try_move_narrowing_dst(nir_builder *b, nir_phi_instr *phi)
     */
    nir_foreach_use (use, &phi->dest.ssa) {
       /* We've previously established that all the uses were alu
-       * conversion ops:
+       * conversion ops.  Turn them into movs instead.
        */
       nir_alu_instr *alu = nir_instr_as_alu(use->parent_instr);
-
-      assert(alu->dest.dest.is_ssa);
-
-      nir_ssa_def_rewrite_uses(&alu->dest.dest.ssa, &new_phi->dest.ssa);
+      alu->op = nir_op_mov;
    }
+   nir_ssa_def_rewrite_uses(&phi->dest.ssa, &new_phi->dest.ssa);
 
    /* And finally insert the new phi after all sources are in place: */
    b->cursor = nir_after_instr(&phi->instr);

Reply via email to