From 76b9dd6266f4b170e94ee47a6881c3d528c25969 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Timur=20Krist=C3=B3f?= Date: Thu, 26 Aug 2021 10:47:10 +0200 Subject: [PATCH] aco: Unset 16 and 24-bit flags from operands in apply_extract. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Consider the following sequence in a shader: b = p_extract a c = v_mad_u32_u16 b, X, 0 The optimizer applies extract, resulting in: c = v_mad_u32_u16 a, X, 0 (correct) Then it mistakenly turns that into: c = v_mul_u32_u24 a, X, 0 (incorrect) In this case, the p_extract is applied to v_mad_u32_u16 by apply_extract. After this, we can no longer be sure that the operands are still 16 or 24-bit, so we have to remove this flag. No Fossil DB changes. Fixes: 54292e99c7844500314bfd623469c65adef954c5 Signed-off-by: Timur Kristóf Reviewed-by: Rhys Perry Part-of: --- src/amd/compiler/aco_optimizer.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/amd/compiler/aco_optimizer.cpp b/src/amd/compiler/aco_optimizer.cpp index 7f36568..4a95ef8 100644 --- a/src/amd/compiler/aco_optimizer.cpp +++ b/src/amd/compiler/aco_optimizer.cpp @@ -871,6 +871,9 @@ apply_extract(opt_ctx& ctx, aco_ptr& instr, unsigned idx, ssa_info& instr->vop3().opsel |= 1 << idx; } + instr->operands[idx].set16bit(false); + instr->operands[idx].set24bit(false); + ctx.info[tmp.id()].label &= ~label_insert; /* label_vopc seems to be the only one worth keeping at the moment */ for (Definition& def : instr->definitions) -- 2.7.4