From 74dafa3c7929e10bcd520168d28002fb38e2cd8d Mon Sep 17 00:00:00 2001 From: Karol Herbst Date: Thu, 22 Aug 2024 19:39:46 +0200 Subject: [PATCH] ac/llvm: fix umul_high MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit LLVM optimizes umul_hi with a constant to v_mul_hi_i32_i24_e32 which isn't always what we need here. This causes miscalculations. To prevent LLVM to apply this optimization, we insert a optimization barrier. Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/11761 Suggested-by: Rhys Perry Reviewed-by: Konstantin Seurer Reviewed-by: Marek Olšák Part-of: --- src/amd/llvm/ac_nir_to_llvm.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/amd/llvm/ac_nir_to_llvm.c b/src/amd/llvm/ac_nir_to_llvm.c index a4914db9430..50788b98175 100644 --- a/src/amd/llvm/ac_nir_to_llvm.c +++ b/src/amd/llvm/ac_nir_to_llvm.c @@ -333,6 +333,14 @@ static LLVMValueRef emit_umul_high(struct ac_llvm_context *ctx, LLVMValueRef src LLVMValueRef src1) { LLVMValueRef dst64, result; + +#if LLVM_VERSION_MAJOR < 20 + if (LLVMIsConstant(src0)) + ac_build_optimization_barrier(ctx, &src1, false); + else + ac_build_optimization_barrier(ctx, &src0, false); +#endif + src0 = LLVMBuildZExt(ctx->builder, src0, ctx->i64, ""); src1 = LLVMBuildZExt(ctx->builder, src1, ctx->i64, "");