From 22f7f167cdafe0facbab2ba2a89f5aadccc39dc5 Mon Sep 17 00:00:00 2001 From: Emma Anholt Date: Wed, 19 Oct 2022 15:54:18 -0700 Subject: [PATCH] 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 Part-of: --- 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);