From e3b1f26a2b83538eb175be28b2e785bbe626bf5f Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Fri, 18 Nov 2022 16:37:19 +0800 Subject: [PATCH] ac/llvm: fix 16bit varying llvm compile error Found when 16bit vec3 varying with llvm14 (not found when llvm15), one 32bit vec4 slot is filled like this: vec3[0] | undef vec3[1] | undef vec3[2] | undef undef | undef LLVM error is for the elements with undef: %287 = insertelement float %280, half %279, i64 0 After this change, we get: %287 = insertelement <2 x half> %280, half %279, i64 0 Fixes: 279eea5bda2 ("amd/llvm: Transition to LLVM "opaque pointers"") Reviewed-by: Pierre-Eric Pelloux-Prayer Signed-off-by: Qiang Yu Part-of: --- src/amd/llvm/ac_nir_to_llvm.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/amd/llvm/ac_nir_to_llvm.c b/src/amd/llvm/ac_nir_to_llvm.c index b89fe70..7b69c1c 100644 --- a/src/amd/llvm/ac_nir_to_llvm.c +++ b/src/amd/llvm/ac_nir_to_llvm.c @@ -2391,7 +2391,16 @@ static void visit_store_output(struct ac_nir_context *ctx, nir_intrinsic_instr * * using read-modify-write. */ index = LLVMConstInt(ctx->ac.i32, nir_intrinsic_io_semantics(instr).high_16bits, 0); + +#if LLVM_VERSION_MAJOR <= 14 + /* To work around old LLVM bug which won't change the output type to + * LLVMBuildLoad2 type argument. + */ + output = LLVMBuildLoad2(ctx->ac.builder, ctx->ac.f32, output_addr, ""); + output = LLVMBuildBitCast(ctx->ac.builder, output, ctx->ac.v2f16, ""); +#else output = LLVMBuildLoad2(ctx->ac.builder, ctx->ac.v2f16, output_addr, ""); +#endif output = LLVMBuildInsertElement(ctx->ac.builder, output, value, index, ""); value = LLVMBuildBitCast(ctx->ac.builder, output, ctx->ac.f32, ""); } -- 2.7.4