diff --git a/src/amd/llvm/ac_llvm_helper.cpp b/src/amd/llvm/ac_llvm_helper.cpp index 5f04813704f..ebeafaea553 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 1beea68e876..a3543c4ae06 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)