From b00a023f1e16a280730650952134ce9b72382987 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Wed, 30 Sep 2020 13:52:19 +0200 Subject: [PATCH] ac/nir: fix nir_intrinsic_shared_atomic_fadd This was completely broken. Fixes dEQP-VK.glsl.atomic_operations.add_float32_compute_shared. Signed-off-by: Samuel Pitoiset Reviewed-by: Bas Nieuwenhuizen Part-of: --- src/amd/llvm/ac_llvm_helper.cpp | 5 +++++ src/amd/llvm/ac_nir_to_llvm.c | 9 +++++++++ 2 files changed, 14 insertions(+) diff --git a/src/amd/llvm/ac_llvm_helper.cpp b/src/amd/llvm/ac_llvm_helper.cpp index 5f04813..ebeafae 100644 --- a/src/amd/llvm/ac_llvm_helper.cpp +++ b/src/amd/llvm/ac_llvm_helper.cpp @@ -309,6 +309,11 @@ LLVMValueRef ac_build_atomic_rmw(struct ac_llvm_context *ctx, LLVMAtomicRMWBinOp case LLVMAtomicRMWBinOpUMin: binop = llvm::AtomicRMWInst::UMin; break; +#if LLVM_VERSION_MAJOR >= 10 + case LLVMAtomicRMWBinOpFAdd: + binop = llvm::AtomicRMWInst::FAdd; + break; +#endif default: unreachable("invalid LLVMAtomicRMWBinOp"); break; diff --git a/src/amd/llvm/ac_nir_to_llvm.c b/src/amd/llvm/ac_nir_to_llvm.c index 1beea68..a3543c4 100644 --- a/src/amd/llvm/ac_nir_to_llvm.c +++ b/src/amd/llvm/ac_nir_to_llvm.c @@ -3364,11 +3364,20 @@ static LLVMValueRef visit_var_atomic(struct ac_nir_context *ctx, const nir_intri if (instr->intrinsic == nir_intrinsic_shared_atomic_fadd || instr->intrinsic == nir_intrinsic_deref_atomic_fadd) { val = ac_to_float(&ctx->ac, src); + + LLVMTypeRef ptr_type = + LLVMPointerType(LLVMTypeOf(val), LLVMGetPointerAddressSpace(LLVMTypeOf(ptr))); + ptr = LLVMBuildBitCast(ctx->ac.builder, ptr, ptr_type, ""); } else { val = ac_to_integer(&ctx->ac, src); } result = ac_build_atomic_rmw(&ctx->ac, op, ptr, val, sync_scope); + + if (instr->intrinsic == nir_intrinsic_shared_atomic_fadd || + instr->intrinsic == nir_intrinsic_deref_atomic_fadd) { + result = ac_to_integer(&ctx->ac, result); + } } if (ctx->ac.postponed_kill) -- 2.7.4