From 686e5a03f52f0e805a59d3affd098cca98a603fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Fri, 26 Apr 2024 17:31:58 -0400 Subject: [PATCH] ac/llvm: add a workaround for nir_intrinsic_load_constant for LLVM on gfx12 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: Timur Kristóf Acked-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/amd/llvm/ac_nir_to_llvm.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/amd/llvm/ac_nir_to_llvm.c b/src/amd/llvm/ac_nir_to_llvm.c index b2d05125da3..9c6821f867a 100644 --- a/src/amd/llvm/ac_nir_to_llvm.c +++ b/src/amd/llvm/ac_nir_to_llvm.c @@ -3439,6 +3439,17 @@ static bool visit_intrinsic(struct ac_nir_context *ctx, nir_intrinsic_instr *ins offset = LLVMBuildSelect(ctx->ac.builder, cond, offset, size, ""); LLVMValueRef ptr = ac_build_gep0(&ctx->ac, ctx->constant_data, offset); + + /* TODO: LLVM doesn't sign-extend the result of s_getpc_b64 correctly, causing hangs. + * Do it manually here. + */ + if (ctx->ac.gfx_level == GFX12) { + LLVMValueRef addr = LLVMBuildPtrToInt(ctx->ac.builder, ptr, ctx->ac.i64, ""); + addr = LLVMBuildOr(ctx->ac.builder, addr, + LLVMConstInt(ctx->ac.i64, 0xffff000000000000ull, 0), ""); + ptr = LLVMBuildIntToPtr(ctx->ac.builder, addr, LLVMTypeOf(ptr), ""); + } + LLVMTypeRef comp_type = LLVMIntTypeInContext(ctx->ac.context, instr->def.bit_size); LLVMTypeRef vec_type = instr->def.num_components == 1 ? comp_type