From 23c36461646a3a99e7f4dab513c5f03ff895cef6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Wed, 18 Jun 2025 18:09:06 -0400 Subject: [PATCH] radeonsi: fix tess regression with latest LLVM git MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The problem was that SGPRs returned from LS were treated as VGPRs by LLVM because LS executes conditionally. The workaround is to use input SGPRs initialized by the hw (i.e. parameters of the wrapper function) instead of the ones returned by LS. Fixes: 80236f23679 - ac/nir/tess: add if/endif for HS threads in NIR instead of ACO/LLVM Reviewed-by: Timur Kristóf Part-of: --- src/gallium/drivers/radeonsi/si_shader_llvm.c | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm.c b/src/gallium/drivers/radeonsi/si_shader_llvm.c index 165d13935e5..64dbc1b1d51 100644 --- a/src/gallium/drivers/radeonsi/si_shader_llvm.c +++ b/src/gallium/drivers/radeonsi/si_shader_llvm.c @@ -407,27 +407,24 @@ static void si_build_wrapper_function(struct si_shader_context *ctx, assert(num_params == LLVMCountParams(parts[1].value)); for (unsigned i = 0; i < num_params; i++) { - params[i] = LLVMBuildExtractValue(builder, ret, i, ""); - - /* Convert return value to same type as next shader's input param. */ - LLVMTypeRef ret_type = LLVMTypeOf(params[i]); + LLVMValueRef ret_value = LLVMBuildExtractValue(builder, ret, i, "");; + LLVMTypeRef ret_type = LLVMTypeOf(ret_value); LLVMTypeRef param_type = LLVMTypeOf(LLVMGetParam(parts[1].value, i)); + assert(ac_get_type_size(ret_type) == 4); assert(ac_get_type_size(param_type) == 4); - if (ret_type != param_type) { - if (LLVMGetTypeKind(param_type) == LLVMPointerTypeKind) { - assert(LLVMGetPointerAddressSpace(param_type) == AC_ADDR_SPACE_CONST_32BIT); - assert(ret_type == ctx->ac.i32); - - params[i] = LLVMBuildIntToPtr(builder, params[i], param_type, ""); - } else { - params[i] = LLVMBuildBitCast(builder, params[i], param_type, ""); - } + if (ret_type == ctx->ac.f32) { + /* Returned VGPRs only: Pass the returned value to the next shader. */ + params[i] = LLVMBuildBitCast(builder, ret_value, param_type, ""); + } else { + /* Use input SGPRs from the wrapper function params instead of the return value of + * the previous shader. + */ + assert(ret_type == ctx->ac.i32); } } } else { - /* The second half of the merged shader should use * the inputs from the toplevel (wrapper) function, * not the return value from the last call.