ac/nir: fix nir_intrinsic_shared_atomic_fadd
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Wed, 30 Sep 2020 11:52:19 +0000 (13:52 +0200)
committerMarge Bot <eric+marge@anholt.net>
Thu, 1 Oct 2020 06:38:42 +0000 (06:38 +0000)
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>

src/amd/llvm/ac_llvm_helper.cpp
src/amd/llvm/ac_nir_to_llvm.c

index 5f04813..ebeafae 100644 (file)
@@ -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;
index 1beea68..a3543c4 100644 (file)
@@ -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)