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 <samuel.pitoiset@gmail.com> Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6936>
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 @@ 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 @@ 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)