From: Nick Sarnie Date: Wed, 7 Dec 2022 22:59:17 +0000 (-0500) Subject: [PATCH 76/79] [Backport to 15] Translate atomicrmw fadd into AtomicFAddEXT (#1757) X-Git-Tag: archive/raspbian/15.0.1-1+rpi1^2^2~9 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=0748eae5bd83ab044d0d54c8b2fe8ccdaddee840;p=spirv-llvm-translator-15.git [PATCH 76/79] [Backport to 15] Translate atomicrmw fadd into AtomicFAddEXT (#1757) Signed-off-by: Sarnie, Nick Gbp-Pq: Name 0076-Backport-to-15-Translate-atomicrmw-fadd-into-AtomicF.patch --- diff --git a/lib/SPIRV/OCLUtil.cpp b/lib/SPIRV/OCLUtil.cpp index 53ebc36..e14ac42 100644 --- a/lib/SPIRV/OCLUtil.cpp +++ b/lib/SPIRV/OCLUtil.cpp @@ -646,6 +646,7 @@ template <> void LLVMSPIRVAtomicRmwOpCodeMap::init() { add(llvm::AtomicRMWInst::Min, OpAtomicSMin); add(llvm::AtomicRMWInst::UMax, OpAtomicUMax); add(llvm::AtomicRMWInst::UMin, OpAtomicUMin); + add(llvm::AtomicRMWInst::FAdd, OpAtomicFAddEXT); } } // namespace SPIRV diff --git a/lib/SPIRV/SPIRVWriter.cpp b/lib/SPIRV/SPIRVWriter.cpp index 97af8e0..c58c2d7 100644 --- a/lib/SPIRV/SPIRVWriter.cpp +++ b/lib/SPIRV/SPIRVWriter.cpp @@ -2191,9 +2191,11 @@ LLVMToSPIRVBase::transValueWithoutDecoration(Value *V, SPIRVBasicBlock *BB, if (AtomicRMWInst *ARMW = dyn_cast(V)) { AtomicRMWInst::BinOp Op = ARMW->getOperation(); + bool SupportedAtomicInst = AtomicRMWInst::isFPOperation(Op) + ? Op == AtomicRMWInst::FAdd + : Op != AtomicRMWInst::Nand; if (!BM->getErrorLog().checkError( - !AtomicRMWInst::isFPOperation(Op) && Op != AtomicRMWInst::Nand, - SPIRVEC_InvalidInstruction, V, + SupportedAtomicInst, SPIRVEC_InvalidInstruction, V, "Atomic " + AtomicRMWInst::getOperationName(Op).str() + " is not supported in SPIR-V!\n")) return nullptr; diff --git a/test/extensions/EXT/SPV_EXT_shader_atomic_float_/atomicrmw_fadd_double.ll b/test/extensions/EXT/SPV_EXT_shader_atomic_float_/atomicrmw_fadd_double.ll new file mode 100644 index 0000000..7d14bcf --- /dev/null +++ b/test/extensions/EXT/SPV_EXT_shader_atomic_float_/atomicrmw_fadd_double.ll @@ -0,0 +1,33 @@ +; RUN: llvm-as -opaque-pointers < %s -o %t.bc +; RUN: llvm-spirv -opaque-pointers --spirv-ext=+SPV_EXT_shader_atomic_float_add %t.bc -o %t.spv +; RUN: spirv-val %t.spv +; RUN: llvm-spirv -opaque-pointers -to-text %t.spv -o - | FileCheck %s + +; CHECK-DAG: Extension "SPV_EXT_shader_atomic_float_add" +; CHECK-DAG: Capability AtomicFloat64AddEXT +; CHECK: TypeInt [[Int:[0-9]+]] 32 0 +; CHECK-DAG: Constant [[Int]] [[Scope_Device:[0-9]+]] 1 {{$}} +; CHECK-DAG: Constant [[Int]] [[MemSem_SequentiallyConsistent:[0-9]+]] 16 +; CHECK: TypeFloat [[Double:[0-9]+]] 64 +; CHECK: Variable {{[0-9]+}} [[DoublePointer:[0-9]+]] +; CHECK: Constant [[Double]] [[DoubleValue:[0-9]+]] 0 1078263808 + +target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024" +target triple = "spir64" + +@f = common dso_local local_unnamed_addr addrspace(1) global double 0.000000e+00, align 8 + +; Function Attrs: nounwind +define dso_local spir_func void @test_atomicrmw_fadd() local_unnamed_addr #0 { +entry: + %0 = atomicrmw fadd double addrspace(1)* @f, double 42.000000e+00 seq_cst +; CHECK: AtomicFAddEXT [[Double]] {{[0-9]+}} [[DoublePointer]] [[Scope_Device]] [[MemSem_SequentiallyConsistent]] [[DoubleValue]] + + ret void +} + +attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!llvm.module.flags = !{!0} + +!0 = !{i32 1, !"wchar_size", i32 4} diff --git a/test/extensions/EXT/SPV_EXT_shader_atomic_float_/atomicrmw_fadd_float.ll b/test/extensions/EXT/SPV_EXT_shader_atomic_float_/atomicrmw_fadd_float.ll new file mode 100644 index 0000000..6f33a31 --- /dev/null +++ b/test/extensions/EXT/SPV_EXT_shader_atomic_float_/atomicrmw_fadd_float.ll @@ -0,0 +1,33 @@ +; RUN: llvm-as -opaque-pointers < %s -o %t.bc +; RUN: llvm-spirv -opaque-pointers --spirv-ext=+SPV_EXT_shader_atomic_float_add %t.bc -o %t.spv +; RUN: spirv-val %t.spv +; RUN: llvm-spirv -opaque-pointers -to-text %t.spv -o - | FileCheck %s + +; CHECK-DAG: Extension "SPV_EXT_shader_atomic_float_add" +; CHECK-DAG: Capability AtomicFloat32AddEXT +; CHECK: TypeInt [[Int:[0-9]+]] 32 0 +; CHECK-DAG: Constant [[Int]] [[Scope_Device:[0-9]+]] 1 {{$}} +; CHECK-DAG: Constant [[Int]] [[MemSem_SequentiallyConsistent:[0-9]+]] 16 +; CHECK: TypeFloat [[Float:[0-9]+]] 32 +; CHECK: Variable {{[0-9]+}} [[FPPointer:[0-9]+]] +; CHECK: Constant [[Float]] [[FPValue:[0-9]+]] 1109917696 + +target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024" +target triple = "spir64" + +@f = common dso_local local_unnamed_addr addrspace(1) global float 0.000000e+00, align 4 + +; Function Attrs: nounwind +define dso_local spir_func void @test_atomicrmw_fadd() local_unnamed_addr #0 { +entry: + %0 = atomicrmw fadd float addrspace(1)* @f, float 42.000000e+00 seq_cst +; CHECK: AtomicFAddEXT [[Float]] {{[0-9]+}} [[FPPointer]] [[Scope_Device]] [[MemSem_SequentiallyConsistent]] [[FPValue]] + + ret void +} + +attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!llvm.module.flags = !{!0} + +!0 = !{i32 1, !"wchar_size", i32 4}