|
|
|
@ -0,0 +1,982 @@
|
|
|
|
|
From fbc9996d6490a5d4720b85b47f38335e7fdc99d9 Mon Sep 17 00:00:00 2001
|
|
|
|
|
From: haonanya <haonan.yang@intel.com>
|
|
|
|
|
Date: Mon, 19 Jul 2021 10:14:20 +0800
|
|
|
|
|
Subject: [PATCH 3/3] Add support for cl_ext_float_atomics in SPIRVWriter
|
|
|
|
|
|
|
|
|
|
Upstream-Status: Backport [Taken from opencl-clang patches, https://github.com/intel/opencl-clang/blob/ocl-open-100/patches/spirv/0001-Add-support-for-cl_ext_float_atomics-in-SPIRVWriter.patch]
|
|
|
|
|
|
|
|
|
|
Signed-off-by: haonanya <haonan.yang@intel.com>
|
|
|
|
|
Signed-off-by: Naveen Saini <naveen.kumar.saini@intel.com>
|
|
|
|
|
---
|
|
|
|
|
lib/SPIRV/OCL20ToSPIRV.cpp | 79 ++++++++++++++++--
|
|
|
|
|
lib/SPIRV/SPIRVToOCL.h | 3 +
|
|
|
|
|
lib/SPIRV/SPIRVToOCL12.cpp | 21 +++++
|
|
|
|
|
lib/SPIRV/SPIRVToOCL20.cpp | 28 ++++++-
|
|
|
|
|
lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h | 1 -
|
|
|
|
|
lib/SPIRV/libSPIRV/SPIRVOpCode.h | 8 +-
|
|
|
|
|
test/AtomicFAddEXTForOCL.ll | 64 +++++++++++++++
|
|
|
|
|
test/AtomicFAddExt.ll | 111 ++++++++-----------------
|
|
|
|
|
test/AtomicFMaxEXT.ll | 113 +++++++-------------------
|
|
|
|
|
test/AtomicFMaxEXTForOCL.ll | 64 +++++++++++++++
|
|
|
|
|
test/AtomicFMinEXT.ll | 113 +++++++-------------------
|
|
|
|
|
test/AtomicFMinEXTForOCL.ll | 64 +++++++++++++++
|
|
|
|
|
test/InvalidAtomicBuiltins.cl | 8 --
|
|
|
|
|
13 files changed, 417 insertions(+), 260 deletions(-)
|
|
|
|
|
create mode 100644 test/AtomicFAddEXTForOCL.ll
|
|
|
|
|
create mode 100644 test/AtomicFMaxEXTForOCL.ll
|
|
|
|
|
create mode 100644 test/AtomicFMinEXTForOCL.ll
|
|
|
|
|
|
|
|
|
|
diff --git a/lib/SPIRV/OCL20ToSPIRV.cpp b/lib/SPIRV/OCL20ToSPIRV.cpp
|
|
|
|
|
index e30aa5be..b676a009 100644
|
|
|
|
|
--- a/lib/SPIRV/OCL20ToSPIRV.cpp
|
|
|
|
|
+++ b/lib/SPIRV/OCL20ToSPIRV.cpp
|
|
|
|
|
@@ -408,10 +408,63 @@ void OCL20ToSPIRV::visitCallInst(CallInst &CI) {
|
|
|
|
|
if (DemangledName.find(kOCLBuiltinName::AtomicPrefix) == 0 ||
|
|
|
|
|
DemangledName.find(kOCLBuiltinName::AtomPrefix) == 0) {
|
|
|
|
|
|
|
|
|
|
- // Compute atomic builtins do not support floating types.
|
|
|
|
|
- if (CI.getType()->isFloatingPointTy() &&
|
|
|
|
|
- isComputeAtomicOCLBuiltin(DemangledName))
|
|
|
|
|
- return;
|
|
|
|
|
+ // Compute "atom" prefixed builtins do not support floating types.
|
|
|
|
|
+ if (CI.getType()->isFloatingPointTy()) {
|
|
|
|
|
+ if (DemangledName.find(kOCLBuiltinName::AtomPrefix) == 0)
|
|
|
|
|
+ return;
|
|
|
|
|
+ // handle functions which are "atomic_" prefixed.
|
|
|
|
|
+ StringRef Stem = DemangledName;
|
|
|
|
|
+ Stem = Stem.drop_front(strlen("atomic_"));
|
|
|
|
|
+ // FP-typed atomic_{add, sub, inc, dec, exchange, min, max, or, and, xor,
|
|
|
|
|
+ // fetch_or, fetch_xor, fetch_and, fetch_or_explicit, fetch_xor_explicit,
|
|
|
|
|
+ // fetch_and_explicit} should be identified as function call
|
|
|
|
|
+ bool IsFunctionCall = llvm::StringSwitch<bool>(Stem)
|
|
|
|
|
+ .Case("add", true)
|
|
|
|
|
+ .Case("sub", true)
|
|
|
|
|
+ .Case("inc", true)
|
|
|
|
|
+ .Case("dec", true)
|
|
|
|
|
+ .Case("cmpxchg", true)
|
|
|
|
|
+ .Case("min", true)
|
|
|
|
|
+ .Case("max", true)
|
|
|
|
|
+ .Case("or", true)
|
|
|
|
|
+ .Case("xor", true)
|
|
|
|
|
+ .Case("and", true)
|
|
|
|
|
+ .Case("fetch_or", true)
|
|
|
|
|
+ .Case("fetch_and", true)
|
|
|
|
|
+ .Case("fetch_xor", true)
|
|
|
|
|
+ .Case("fetch_or_explicit", true)
|
|
|
|
|
+ .Case("fetch_xor_explicit", true)
|
|
|
|
|
+ .Case("fetch_and_explicit", true)
|
|
|
|
|
+ .Default(false);
|
|
|
|
|
+ if (IsFunctionCall)
|
|
|
|
|
+ return;
|
|
|
|
|
+ if (F->arg_size() != 2) {
|
|
|
|
|
+ IsFunctionCall = llvm::StringSwitch<bool>(Stem)
|
|
|
|
|
+ .Case("exchange", true)
|
|
|
|
|
+ .Case("fetch_add", true)
|
|
|
|
|
+ .Case("fetch_sub", true)
|
|
|
|
|
+ .Case("fetch_min", true)
|
|
|
|
|
+ .Case("fetch_max", true)
|
|
|
|
|
+ .Case("load", true)
|
|
|
|
|
+ .Case("store", true)
|
|
|
|
|
+ .Default(false);
|
|
|
|
|
+ if (IsFunctionCall)
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (F->arg_size() != 3 && F->arg_size() != 4) {
|
|
|
|
|
+ IsFunctionCall = llvm::StringSwitch<bool>(Stem)
|
|
|
|
|
+ .Case("exchange_explicit", true)
|
|
|
|
|
+ .Case("fetch_add_explicit", true)
|
|
|
|
|
+ .Case("fetch_sub_explicit", true)
|
|
|
|
|
+ .Case("fetch_min_explicit", true)
|
|
|
|
|
+ .Case("fetch_max_explicit", true)
|
|
|
|
|
+ .Case("load_explicit", true)
|
|
|
|
|
+ .Case("store_explicit", true)
|
|
|
|
|
+ .Default(false);
|
|
|
|
|
+ if (IsFunctionCall)
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
auto PCI = &CI;
|
|
|
|
|
if (DemangledName == kOCLBuiltinName::AtomicInit) {
|
|
|
|
|
@@ -819,7 +872,7 @@ void OCL20ToSPIRV::transAtomicBuiltin(CallInst *CI, OCLBuiltinTransInfo &Info) {
|
|
|
|
|
AttributeList Attrs = CI->getCalledFunction()->getAttributes();
|
|
|
|
|
mutateCallInstSPIRV(
|
|
|
|
|
M, CI,
|
|
|
|
|
- [=](CallInst *CI, std::vector<Value *> &Args) {
|
|
|
|
|
+ [=](CallInst *CI, std::vector<Value *> &Args) -> std::string {
|
|
|
|
|
Info.PostProc(Args);
|
|
|
|
|
// Order of args in OCL20:
|
|
|
|
|
// object, 0-2 other args, 1-2 order, scope
|
|
|
|
|
@@ -864,7 +917,21 @@ void OCL20ToSPIRV::transAtomicBuiltin(CallInst *CI, OCLBuiltinTransInfo &Info) {
|
|
|
|
|
std::rotate(Args.begin() + 2, Args.begin() + OrderIdx,
|
|
|
|
|
Args.end() - Offset);
|
|
|
|
|
}
|
|
|
|
|
- return getSPIRVFuncName(OCLSPIRVBuiltinMap::map(Info.UniqName));
|
|
|
|
|
+ llvm::Type* AtomicBuiltinsReturnType =
|
|
|
|
|
+ CI->getCalledFunction()->getReturnType();
|
|
|
|
|
+ auto IsFPType = [](llvm::Type *ReturnType) {
|
|
|
|
|
+ return ReturnType->isHalfTy() || ReturnType->isFloatTy() ||
|
|
|
|
|
+ ReturnType->isDoubleTy();
|
|
|
|
|
+ };
|
|
|
|
|
+ auto SPIRVFunctionName =
|
|
|
|
|
+ getSPIRVFuncName(OCLSPIRVBuiltinMap::map(Info.UniqName));
|
|
|
|
|
+ if (!IsFPType(AtomicBuiltinsReturnType))
|
|
|
|
|
+ return SPIRVFunctionName;
|
|
|
|
|
+ // Translate FP-typed atomic builtins.
|
|
|
|
|
+ return llvm::StringSwitch<std::string>(SPIRVFunctionName)
|
|
|
|
|
+ .Case("__spirv_AtomicIAdd", "__spirv_AtomicFAddEXT")
|
|
|
|
|
+ .Case("__spirv_AtomicSMax", "__spirv_AtomicFMaxEXT")
|
|
|
|
|
+ .Case("__spirv_AtomicSMin", "__spirv_AtomicFMinEXT");
|
|
|
|
|
},
|
|
|
|
|
&Attrs);
|
|
|
|
|
}
|
|
|
|
|
diff --git a/lib/SPIRV/SPIRVToOCL.h b/lib/SPIRV/SPIRVToOCL.h
|
|
|
|
|
index ddeec0b6..006fb0b1 100644
|
|
|
|
|
--- a/lib/SPIRV/SPIRVToOCL.h
|
|
|
|
|
+++ b/lib/SPIRV/SPIRVToOCL.h
|
|
|
|
|
@@ -178,6 +178,9 @@ public:
|
|
|
|
|
/// using separate maps for OpenCL 1.2 and OpenCL 2.0
|
|
|
|
|
virtual Instruction *mutateAtomicName(CallInst *CI, Op OC) = 0;
|
|
|
|
|
|
|
|
|
|
+ // Transform FP atomic opcode to corresponding OpenCL function name
|
|
|
|
|
+ virtual std::string mapFPAtomicName(Op OC) = 0;
|
|
|
|
|
+
|
|
|
|
|
private:
|
|
|
|
|
/// Transform uniform group opcode to corresponding OpenCL function name,
|
|
|
|
|
/// example: GroupIAdd(Reduce) => group_iadd => work_group_reduce_add |
|
|
|
|
|
diff --git a/lib/SPIRV/SPIRVToOCL12.cpp b/lib/SPIRV/SPIRVToOCL12.cpp
|
|
|
|
|
index afddd596..d7f00de3 100644
|
|
|
|
|
--- a/lib/SPIRV/SPIRVToOCL12.cpp
|
|
|
|
|
+++ b/lib/SPIRV/SPIRVToOCL12.cpp
|
|
|
|
|
@@ -104,6 +104,9 @@ public:
|
|
|
|
|
/// cl_khr_int64_base_atomics and cl_khr_int64_extended_atomics extensions.
|
|
|
|
|
std::string mapAtomicName(Op OC, Type *Ty);
|
|
|
|
|
|
|
|
|
|
+ // Transform FP atomic opcode to corresponding OpenCL function name
|
|
|
|
|
+ std::string mapFPAtomicName(Op OC) override;
|
|
|
|
|
+
|
|
|
|
|
static char ID;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
@@ -338,6 +341,21 @@ Instruction *SPIRVToOCL12::visitCallSPIRVAtomicBuiltin(CallInst *CI, Op OC) {
|
|
|
|
|
return NewCI;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
+std::string SPIRVToOCL12::mapFPAtomicName(Op OC) {
|
|
|
|
|
+ assert(isFPAtomicOpCode(OC) && "Not intended to handle other opcodes than "
|
|
|
|
|
+ "AtomicF{Add/Min/Max}EXT!");
|
|
|
|
|
+ switch (OC) {
|
|
|
|
|
+ case OpAtomicFAddEXT:
|
|
|
|
|
+ return "atomic_add";
|
|
|
|
|
+ case OpAtomicFMinEXT:
|
|
|
|
|
+ return "atomic_min";
|
|
|
|
|
+ case OpAtomicFMaxEXT:
|
|
|
|
|
+ return "atomic_max";
|
|
|
|
|
+ default:
|
|
|
|
|
+ llvm_unreachable("Unsupported opcode!");
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
Instruction *SPIRVToOCL12::mutateAtomicName(CallInst *CI, Op OC) {
|
|
|
|
|
AttributeList Attrs = CI->getCalledFunction()->getAttributes();
|
|
|
|
|
return mutateCallInstOCL(
|
|
|
|
|
@@ -351,6 +369,9 @@ Instruction *SPIRVToOCL12::mutateAtomicName(CallInst *CI, Op OC) {
|
|
|
|
|
std::string SPIRVToOCL12::mapAtomicName(Op OC, Type *Ty) {
|
|
|
|
|
std::string Prefix = Ty->isIntegerTy(64) ? kOCLBuiltinName::AtomPrefix
|
|
|
|
|
: kOCLBuiltinName::AtomicPrefix;
|
|
|
|
|
+ // Map fp atomic instructions to regular OpenCL built-ins.
|
|
|
|
|
+ if (isFPAtomicOpCode(OC))
|
|
|
|
|
+ return mapFPAtomicName(OC);
|
|
|
|
|
return Prefix += OCL12SPIRVBuiltinMap::rmap(OC);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
diff --git a/lib/SPIRV/SPIRVToOCL20.cpp b/lib/SPIRV/SPIRVToOCL20.cpp
|
|
|
|
|
index d829ff42..01d088e9 100644
|
|
|
|
|
--- a/lib/SPIRV/SPIRVToOCL20.cpp
|
|
|
|
|
+++ b/lib/SPIRV/SPIRVToOCL20.cpp
|
|
|
|
|
@@ -82,6 +82,9 @@ public:
|
|
|
|
|
/// compare_exchange_strong/weak_explicit
|
|
|
|
|
Instruction *visitCallSPIRVAtomicCmpExchg(CallInst *CI, Op OC) override;
|
|
|
|
|
|
|
|
|
|
+ // Transform FP atomic opcode to corresponding OpenCL function name
|
|
|
|
|
+ std::string mapFPAtomicName(Op OC) override;
|
|
|
|
|
+
|
|
|
|
|
static char ID;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
@@ -144,11 +147,29 @@ void SPIRVToOCL20::visitCallSPIRVControlBarrier(CallInst *CI) {
|
|
|
|
|
&Attrs);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
+std::string SPIRVToOCL20::mapFPAtomicName(Op OC) {
|
|
|
|
|
+ assert(isFPAtomicOpCode(OC) && "Not intended to handle other opcodes than "
|
|
|
|
|
+ "AtomicF{Add/Min/Max}EXT!");
|
|
|
|
|
+ switch (OC) {
|
|
|
|
|
+ case OpAtomicFAddEXT:
|
|
|
|
|
+ return "atomic_fetch_add_explicit";
|
|
|
|
|
+ case OpAtomicFMinEXT:
|
|
|
|
|
+ return "atomic_fetch_min_explicit";
|
|
|
|
|
+ case OpAtomicFMaxEXT:
|
|
|
|
|
+ return "atomic_fetch_max_explicit";
|
|
|
|
|
+ default:
|
|
|
|
|
+ llvm_unreachable("Unsupported opcode!");
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
Instruction *SPIRVToOCL20::mutateAtomicName(CallInst *CI, Op OC) {
|
|
|
|
|
AttributeList Attrs = CI->getCalledFunction()->getAttributes();
|
|
|
|
|
return mutateCallInstOCL(
|
|
|
|
|
M, CI,
|
|
|
|
|
[=](CallInst *, std::vector<Value *> &Args) {
|
|
|
|
|
+ // Map fp atomic instructions to regular OpenCL built-ins.
|
|
|
|
|
+ if (isFPAtomicOpCode(OC))
|
|
|
|
|
+ return mapFPAtomicName(OC);
|
|
|
|
|
return OCLSPIRVBuiltinMap::rmap(OC);
|
|
|
|
|
},
|
|
|
|
|
&Attrs);
|
|
|
|
|
@@ -215,7 +236,12 @@ CallInst *SPIRVToOCL20::mutateCommonAtomicArguments(CallInst *CI, Op OC) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
auto Ptr = findFirstPtr(Args);
|
|
|
|
|
- auto Name = OCLSPIRVBuiltinMap::rmap(OC);
|
|
|
|
|
+ std::string Name;
|
|
|
|
|
+ // Map fp atomic instructions to regular OpenCL built-ins.
|
|
|
|
|
+ if (isFPAtomicOpCode(OC))
|
|
|
|
|
+ Name = mapFPAtomicName(OC);
|
|
|
|
|
+ else
|
|
|
|
|
+ Name = OCLSPIRVBuiltinMap::rmap(OC);
|
|
|
|
|
auto NumOrder = getSPIRVAtomicBuiltinNumMemoryOrderArgs(OC);
|
|
|
|
|
auto ScopeIdx = Ptr + 1;
|
|
|
|
|
auto OrderIdx = Ptr + 2;
|
|
|
|
|
diff --git a/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h b/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h
|
|
|
|
|
index 13f93fbe..7b707993 100644
|
|
|
|
|
--- a/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h
|
|
|
|
|
+++ b/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h
|
|
|
|
|
@@ -521,7 +521,6 @@ template <> inline void SPIRVMap<Capability, std::string>::init() {
|
|
|
|
|
add(CapabilityAtomicFloat64AddEXT, "AtomicFloat64AddEXT");
|
|
|
|
|
add(CapabilityAtomicFloat32MinMaxEXT, "AtomicFloat32MinMaxEXT");
|
|
|
|
|
add(CapabilityAtomicFloat64MinMaxEXT, "AtomicFloat64MinMaxEXT");
|
|
|
|
|
- add(CapabilityAtomicFloat16MinMaxEXT, "AtomicFloat16MinMaxEXT");
|
|
|
|
|
add(CapabilitySubgroupShuffleINTEL, "SubgroupShuffleINTEL");
|
|
|
|
|
add(CapabilitySubgroupBufferBlockIOINTEL, "SubgroupBufferBlockIOINTEL");
|
|
|
|
|
add(CapabilitySubgroupImageBlockIOINTEL, "SubgroupImageBlockIOINTEL");
|
|
|
|
|
diff --git a/lib/SPIRV/libSPIRV/SPIRVOpCode.h b/lib/SPIRV/libSPIRV/SPIRVOpCode.h
|
|
|
|
|
index feec70f6..8e595e83 100644
|
|
|
|
|
--- a/lib/SPIRV/libSPIRV/SPIRVOpCode.h
|
|
|
|
|
+++ b/lib/SPIRV/libSPIRV/SPIRVOpCode.h
|
|
|
|
|
@@ -54,11 +54,17 @@ template <> inline void SPIRVMap<Op, std::string>::init() {
|
|
|
|
|
}
|
|
|
|
|
SPIRV_DEF_NAMEMAP(Op, OpCodeNameMap)
|
|
|
|
|
|
|
|
|
|
+inline bool isFPAtomicOpCode(Op OpCode) {
|
|
|
|
|
+ return OpCode == OpAtomicFAddEXT || OpCode == OpAtomicFMinEXT ||
|
|
|
|
|
+ OpCode == OpAtomicFMaxEXT;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
inline bool isAtomicOpCode(Op OpCode) {
|
|
|
|
|
static_assert(OpAtomicLoad < OpAtomicXor, "");
|
|
|
|
|
return ((unsigned)OpCode >= OpAtomicLoad &&
|
|
|
|
|
(unsigned)OpCode <= OpAtomicXor) ||
|
|
|
|
|
- OpCode == OpAtomicFlagTestAndSet || OpCode == OpAtomicFlagClear;
|
|
|
|
|
+ OpCode == OpAtomicFlagTestAndSet || OpCode == OpAtomicFlagClear ||
|
|
|
|
|
+ isFPAtomicOpCode(OpCode);
|
|
|
|
|
}
|
|
|
|
|
inline bool isBinaryOpCode(Op OpCode) {
|
|
|
|
|
return ((unsigned)OpCode >= OpIAdd && (unsigned)OpCode <= OpFMod) ||
|
|
|
|
|
diff --git a/test/AtomicFAddEXTForOCL.ll b/test/AtomicFAddEXTForOCL.ll
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 00000000..fb146fb9
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/test/AtomicFAddEXTForOCL.ll
|
|
|
|
|
@@ -0,0 +1,64 @@
|
|
|
|
|
+; RUN: llvm-as %s -o %t.bc
|
|
|
|
|
+; RUN: llvm-spirv %t.bc --spirv-ext=+SPV_EXT_shader_atomic_float_add -o %t.spv
|
|
|
|
|
+; RUN: spirv-val %t.spv
|
|
|
|
|
+; RUN: llvm-spirv -to-text %t.spv -o %t.spt
|
|
|
|
|
+; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
|
|
|
|
|
+
|
|
|
|
|
+; RUN: llvm-spirv --spirv-target-env=CL2.0 -r %t.spv -o %t.rev.bc
|
|
|
|
|
+; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefixes=CHECK-LLVM-CL,CHECK-LLVM-CL20
|
|
|
|
|
+
|
|
|
|
|
+; RUN: llvm-spirv --spirv-target-env=SPV-IR -r %t.spv -o %t.rev.bc
|
|
|
|
|
+; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefixes=CHECK-LLVM-SPV
|
|
|
|
|
+
|
|
|
|
|
+target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
|
|
|
|
|
+target triple = "spir-unknown-unknown"
|
|
|
|
|
+
|
|
|
|
|
+; CHECK-SPIRV: Capability AtomicFloat32AddEXT
|
|
|
|
|
+; CHECK-SPIRV: Capability AtomicFloat64AddEXT
|
|
|
|
|
+; CHECK-SPIRV: Extension "SPV_EXT_shader_atomic_float_add"
|
|
|
|
|
+; CHECK-SPIRV: TypeFloat [[TYPE_FLOAT_32:[0-9]+]] 32
|
|
|
|
|
+; CHECK-SPIRV: TypeFloat [[TYPE_FLOAT_64:[0-9]+]] 64
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+; Function Attrs: convergent norecurse nounwind
|
|
|
|
|
+define dso_local spir_func void @test_atomic_float(float addrspace(1)* %a) local_unnamed_addr #0 {
|
|
|
|
|
+entry:
|
|
|
|
|
+ ; CHECK-SPIRV: 7 AtomicFAddEXT [[TYPE_FLOAT_32]]
|
|
|
|
|
+ ; CHECK-LLVM-CL20: call spir_func float @[[FLOAT_FUNC_NAME:_Z25atomic_fetch_add_explicit[[:alnum:]]+_Atomicff[a-zA-Z0-9_]+]]({{.*}})
|
|
|
|
|
+ ; CHECK-LLVM-SPV: call spir_func float @[[FLOAT_FUNC_NAME:_Z21__spirv_AtomicFAddEXT[[:alnum:]]+fiif]]({{.*}})
|
|
|
|
|
+ %call = tail call spir_func float @_Z25atomic_fetch_add_explicitPU3AS1VU7_Atomicff12memory_order(float addrspace(1)* %a, float 0.000000e+00, i32 0) #2
|
|
|
|
|
+ ret void
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+; Function Attrs: convergent
|
|
|
|
|
+declare spir_func float @_Z25atomic_fetch_add_explicitPU3AS1VU7_Atomicff12memory_order(float addrspace(1)*, float, i32) local_unnamed_addr #1
|
|
|
|
|
+; CHECK-LLVM-SPV: declare {{.*}}spir_func float @[[FLOAT_FUNC_NAME]](float
|
|
|
|
|
+
|
|
|
|
|
+; Function Attrs: convergent norecurse nounwind
|
|
|
|
|
+define dso_local spir_func void @test_atomic_double(double addrspace(1)* %a) local_unnamed_addr #0 {
|
|
|
|
|
+entry:
|
|
|
|
|
+ ; CHECK-SPIRV: 7 AtomicFAddEXT [[TYPE_FLOAT_64]]
|
|
|
|
|
+ ; CHECK-LLVM-CL20: call spir_func double @[[DOUBLE_FUNC_NAME:_Z25atomic_fetch_add_explicit[[:alnum:]]+_Atomicdd[a-zA-Z0-9_]+]]({{.*}})
|
|
|
|
|
+ ; CHECK-LLVM-SPV: call spir_func double @[[DOUBLE_FUNC_NAME:_Z21__spirv_AtomicFAddEXT[[:alnum:]]+diid]]({{.*}})
|
|
|
|
|
+ %call = tail call spir_func double @_Z25atomic_fetch_add_explicitPU3AS1VU7_Atomicdd12memory_order(double addrspace(1)* %a, double 0.000000e+00, i32 0) #2
|
|
|
|
|
+ ret void
|
|
|
|
|
+}
|
|
|
|
|
+; Function Attrs: convergent
|
|
|
|
|
+declare spir_func double @_Z25atomic_fetch_add_explicitPU3AS1VU7_Atomicdd12memory_order(double addrspace(1)*, double, i32) local_unnamed_addr #1
|
|
|
|
|
+; CHECK-LLVM-SPV: declare {{.*}}spir_func double @[[DOUBLE_FUNC_NAME]](double
|
|
|
|
|
+
|
|
|
|
|
+; CHECK-LLVM-CL: declare {{.*}}spir_func float @[[FLOAT_FUNC_NAME]](float
|
|
|
|
|
+; CHECK-LLVM-CL: declare {{.*}}spir_func double @[[DOUBLE_FUNC_NAME]](double
|
|
|
|
|
+
|
|
|
|
|
+attributes #0 = { convergent norecurse nounwind "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
|
|
|
|
|
+attributes #1 = { convergent "frame-pointer"="none" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
|
|
|
|
|
+attributes #2 = { convergent nounwind }
|
|
|
|
|
+
|
|
|
|
|
+!llvm.module.flags = !{!0}
|
|
|
|
|
+!opencl.ocl.version = !{!1}
|
|
|
|
|
+!opencl.spir.version = !{!1}
|
|
|
|
|
+!llvm.ident = !{!2}
|
|
|
|
|
+
|
|
|
|
|
+!0 = !{i32 1, !"wchar_size", i32 4}
|
|
|
|
|
+!1 = !{i32 2, i32 0}
|
|
|
|
|
+!2 = !{!"clang version 13.0.0 (https://github.com/llvm/llvm-project.git 94aa388f0ce0723bb15503cf41c2c15b288375b9)"}
|
|
|
|
|
diff --git a/test/AtomicFAddExt.ll b/test/AtomicFAddExt.ll
|
|
|
|
|
index 011dd8a7..42bdfeea 100644
|
|
|
|
|
--- a/test/AtomicFAddExt.ll
|
|
|
|
|
+++ b/test/AtomicFAddExt.ll
|
|
|
|
|
@@ -4,20 +4,16 @@
|
|
|
|
|
; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
|
|
|
|
|
|
|
|
|
|
; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
|
|
|
|
|
-; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefix=CHECK-LLVM
|
|
|
|
|
+; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefixes=CHECK-LLVM-CL,CHECK-LLVM-CL12
|
|
|
|
|
|
|
|
|
|
-target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64"
|
|
|
|
|
-target triple = "spir64-unknown-unknown-sycldevice"
|
|
|
|
|
-
|
|
|
|
|
-%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range" = type { %"class._ZTSN2cl4sycl6detail5arrayILi1EEE.cl::sycl::detail::array" }
|
|
|
|
|
-%"class._ZTSN2cl4sycl6detail5arrayILi1EEE.cl::sycl::detail::array" = type { [1 x i64] }
|
|
|
|
|
-%"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id" = type { %"class._ZTSN2cl4sycl6detail5arrayILi1EEE.cl::sycl::detail::array" }
|
|
|
|
|
-
|
|
|
|
|
-$_ZTSZZ3addIfEvvENKUlRN2cl4sycl7handlerEE19_14clES3_EUlNS1_4itemILi1ELb1EEEE23_37 = comdat any
|
|
|
|
|
+; RUN: llvm-spirv --spirv-target-env=CL2.0 -r %t.spv -o %t.rev.bc
|
|
|
|
|
+; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefixes=CHECK-LLVM-CL,CHECK-LLVM-CL20
|
|
|
|
|
|
|
|
|
|
-$_ZTSZZ3addIdEvvENKUlRN2cl4sycl7handlerEE19_14clES3_EUlNS1_4itemILi1ELb1EEEE23_37 = comdat any
|
|
|
|
|
+; RUN: llvm-spirv --spirv-target-env=SPV-IR -r %t.spv -o %t.rev.bc
|
|
|
|
|
+; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefixes=CHECK-LLVM-SPV
|
|
|
|
|
|
|
|
|
|
-@__spirv_BuiltInGlobalInvocationId = external dso_local local_unnamed_addr addrspace(1) constant <3 x i64>, align 32
|
|
|
|
|
+target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64"
|
|
|
|
|
+target triple = "spir64-unknown-unknown-sycldevice"
|
|
|
|
|
|
|
|
|
|
; CHECK-SPIRV: Capability AtomicFloat32AddEXT
|
|
|
|
|
; CHECK-SPIRV: Capability AtomicFloat64AddEXT
|
|
|
|
|
@@ -25,62 +21,43 @@ $_ZTSZZ3addIdEvvENKUlRN2cl4sycl7handlerEE19_14clES3_EUlNS1_4itemILi1ELb1EEEE23_3
|
|
|
|
|
; CHECK-SPIRV: TypeFloat [[TYPE_FLOAT_32:[0-9]+]] 32
|
|
|
|
|
; CHECK-SPIRV: TypeFloat [[TYPE_FLOAT_64:[0-9]+]] 64
|
|
|
|
|
|
|
|
|
|
-; Function Attrs: convergent norecurse mustprogress
|
|
|
|
|
-define weak_odr dso_local spir_kernel void @_ZTSZZ3addIfEvvENKUlRN2cl4sycl7handlerEE19_14clES3_EUlNS1_4itemILi1ELb1EEEE23_37(float addrspace(1)* %_arg_, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_1, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_2, %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* byval(%"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id") align 8 %_arg_3, float addrspace(1)* %_arg_4, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_6, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_7, %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* byval(%"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id") align 8 %_arg_8) local_unnamed_addr #0 comdat !kernel_arg_buffer_location !4 {
|
|
|
|
|
+; Function Attrs: convergent norecurse nounwind
|
|
|
|
|
+define dso_local spir_func float @_Z14AtomicFloatIncRf(float addrspace(4)* align 4 dereferenceable(4) %Arg) local_unnamed_addr #0 {
|
|
|
|
|
entry:
|
|
|
|
|
- %0 = getelementptr inbounds %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id", %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* %_arg_3, i64 0, i32 0, i32 0, i64 0
|
|
|
|
|
- %1 = load i64, i64* %0, align 8
|
|
|
|
|
- %add.ptr.i29 = getelementptr inbounds float, float addrspace(1)* %_arg_, i64 %1
|
|
|
|
|
- %2 = getelementptr inbounds %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id", %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* %_arg_8, i64 0, i32 0, i32 0, i64 0
|
|
|
|
|
- %3 = load i64, i64* %2, align 8
|
|
|
|
|
- %add.ptr.i = getelementptr inbounds float, float addrspace(1)* %_arg_4, i64 %3
|
|
|
|
|
- %4 = load <3 x i64>, <3 x i64> addrspace(4)* addrspacecast (<3 x i64> addrspace(1)* @__spirv_BuiltInGlobalInvocationId to <3 x i64> addrspace(4)*), align 32, !noalias !5
|
|
|
|
|
- %5 = extractelement <3 x i64> %4, i64 0
|
|
|
|
|
+ %0 = addrspacecast float addrspace(4)* %Arg to float addrspace(1)*
|
|
|
|
|
; CHECK-SPIRV: 7 AtomicFAddEXT [[TYPE_FLOAT_32]]
|
|
|
|
|
- ; CHECK-LLVM: call spir_func float @[[FLOAT_FUNC_NAME:_Z21__spirv_AtomicFAddEXT[[:alnum:]]+]]({{.*}})
|
|
|
|
|
- %call3.i.i.i.i = tail call spir_func float @_Z21__spirv_AtomicFAddEXTPU3AS1fN5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagEf(float addrspace(1)* %add.ptr.i29, i32 1, i32 896, float 1.000000e+00) #2
|
|
|
|
|
- %add.i.i = fadd float %call3.i.i.i.i, 1.000000e+00
|
|
|
|
|
- %sext.i = shl i64 %5, 32
|
|
|
|
|
- %conv5.i = ashr exact i64 %sext.i, 32
|
|
|
|
|
- %ptridx.i.i = getelementptr inbounds float, float addrspace(1)* %add.ptr.i, i64 %conv5.i
|
|
|
|
|
- %ptridx.ascast.i.i = addrspacecast float addrspace(1)* %ptridx.i.i to float addrspace(4)*
|
|
|
|
|
- store float %add.i.i, float addrspace(4)* %ptridx.ascast.i.i, align 4, !tbaa !14
|
|
|
|
|
- ret void
|
|
|
|
|
+ ; CHECK-LLVM-CL12: call spir_func float @[[FLOAT_FUNC_NAME:_Z10atomic_add[[:alnum:]]+ff]]({{.*}})
|
|
|
|
|
+ ; CHECK-LLVM-CL20: call spir_func float @[[FLOAT_FUNC_NAME:_Z25atomic_fetch_add_explicit[[:alnum:]]+_Atomicff[a-zA-Z0-9_]+]]({{.*}})
|
|
|
|
|
+ ; CHECK-LLVM-SPV: call spir_func float @[[FLOAT_FUNC_NAME:_Z21__spirv_AtomicFAddEXT[[:alnum:]]+fiif]]({{.*}})
|
|
|
|
|
+ %call3.i.i = tail call spir_func float @_Z21__spirv_AtomicFAddEXTPU3AS1fN5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagEf(float addrspace(1)* %0, i32 1, i32 896, float 1.000000e+00) #2
|
|
|
|
|
+ ret float %call3.i.i
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
; Function Attrs: convergent
|
|
|
|
|
-; CHECK-LLVM: declare {{.*}}spir_func float @[[FLOAT_FUNC_NAME]](float addrspace(1)*, i32, i32, float)
|
|
|
|
|
declare dso_local spir_func float @_Z21__spirv_AtomicFAddEXTPU3AS1fN5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagEf(float addrspace(1)*, i32, i32, float) local_unnamed_addr #1
|
|
|
|
|
+; CHECK-LLVM-SPV: declare {{.*}}spir_func float @[[FLOAT_FUNC_NAME]](float
|
|
|
|
|
|
|
|
|
|
-; Function Attrs: convergent norecurse mustprogress
|
|
|
|
|
-define weak_odr dso_local spir_kernel void @_ZTSZZ3addIdEvvENKUlRN2cl4sycl7handlerEE19_14clES3_EUlNS1_4itemILi1ELb1EEEE23_37(double addrspace(1)* %_arg_, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_1, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_2, %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* byval(%"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id") align 8 %_arg_3, double addrspace(1)* %_arg_4, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_6, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_7, %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* byval(%"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id") align 8 %_arg_8) local_unnamed_addr #0 comdat !kernel_arg_buffer_location !4 {
|
|
|
|
|
+; Function Attrs: convergent norecurse nounwind
|
|
|
|
|
+define dso_local spir_func double @_Z15AtomicDoubleIncRd(double addrspace(4)* align 8 dereferenceable(8) %Arg) local_unnamed_addr #0 {
|
|
|
|
|
entry:
|
|
|
|
|
- %0 = getelementptr inbounds %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id", %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* %_arg_3, i64 0, i32 0, i32 0, i64 0
|
|
|
|
|
- %1 = load i64, i64* %0, align 8
|
|
|
|
|
- %add.ptr.i29 = getelementptr inbounds double, double addrspace(1)* %_arg_, i64 %1
|
|
|
|
|
- %2 = getelementptr inbounds %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id", %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* %_arg_8, i64 0, i32 0, i32 0, i64 0
|
|
|
|
|
- %3 = load i64, i64* %2, align 8
|
|
|
|
|
- %add.ptr.i = getelementptr inbounds double, double addrspace(1)* %_arg_4, i64 %3
|
|
|
|
|
- %4 = load <3 x i64>, <3 x i64> addrspace(4)* addrspacecast (<3 x i64> addrspace(1)* @__spirv_BuiltInGlobalInvocationId to <3 x i64> addrspace(4)*), align 32, !noalias !18
|
|
|
|
|
- %5 = extractelement <3 x i64> %4, i64 0
|
|
|
|
|
+ %0 = addrspacecast double addrspace(4)* %Arg to double addrspace(1)*
|
|
|
|
|
; CHECK-SPIRV: 7 AtomicFAddEXT [[TYPE_FLOAT_64]]
|
|
|
|
|
- ; CHECK-LLVM: call spir_func double @[[DOUBLE_FUNC_NAME:_Z21__spirv_AtomicFAddEXT[[:alnum:]]+]]({{.*}})
|
|
|
|
|
- %call3.i.i.i.i = tail call spir_func double @_Z21__spirv_AtomicFAddEXTPU3AS1dN5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagEd(double addrspace(1)* %add.ptr.i29, i32 1, i32 896, double 1.000000e+00) #2
|
|
|
|
|
- %add.i.i = fadd double %call3.i.i.i.i, 1.000000e+00
|
|
|
|
|
- %sext.i = shl i64 %5, 32
|
|
|
|
|
- %conv5.i = ashr exact i64 %sext.i, 32
|
|
|
|
|
- %ptridx.i.i = getelementptr inbounds double, double addrspace(1)* %add.ptr.i, i64 %conv5.i
|
|
|
|
|
- %ptridx.ascast.i.i = addrspacecast double addrspace(1)* %ptridx.i.i to double addrspace(4)*
|
|
|
|
|
- store double %add.i.i, double addrspace(4)* %ptridx.ascast.i.i, align 8, !tbaa !27
|
|
|
|
|
- ret void
|
|
|
|
|
+ ; CHECK-LLVM-CL12: call spir_func double @[[DOUBLE_FUNC_NAME:_Z10atomic_add[[:alnum:]]+dd]]({{.*}})
|
|
|
|
|
+ ; CHECK-LLVM-CL20: call spir_func double @[[DOUBLE_FUNC_NAME:_Z25atomic_fetch_add_explicit[[:alnum:]]+_Atomicdd[a-zA-Z0-9_]+]]({{.*}})
|
|
|
|
|
+ ; CHECK-LLVM-SPV: call spir_func double @[[DOUBLE_FUNC_NAME:_Z21__spirv_AtomicFAddEXT[[:alnum:]]+diid]]({{.*}})
|
|
|
|
|
+ %call3.i.i = tail call spir_func double @_Z21__spirv_AtomicFAddEXTPU3AS1dN5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagEd(double addrspace(1)* %0, i32 1, i32 896, double 1.000000e+00) #2
|
|
|
|
|
+ ret double %call3.i.i
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
; Function Attrs: convergent
|
|
|
|
|
-; CHECK-LLVM: declare {{.*}}spir_func double @[[DOUBLE_FUNC_NAME]](double addrspace(1)*, i32, i32, double)
|
|
|
|
|
declare dso_local spir_func double @_Z21__spirv_AtomicFAddEXTPU3AS1dN5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagEd(double addrspace(1)*, i32, i32, double) local_unnamed_addr #1
|
|
|
|
|
+; CHECK-LLVM-SPV: declare {{.*}}spir_func double @[[DOUBLE_FUNC_NAME]](double
|
|
|
|
|
|
|
|
|
|
-attributes #0 = { convergent norecurse }
|
|
|
|
|
-attributes #1 = { convergent }
|
|
|
|
|
+; CHECK-LLVM-CL: declare {{.*}}spir_func float @[[FLOAT_FUNC_NAME]](float
|
|
|
|
|
+; CHECK-LLVM-CL: declare {{.*}}spir_func double @[[DOUBLE_FUNC_NAME]](double
|
|
|
|
|
+
|
|
|
|
|
+attributes #0 = { convergent norecurse nounwind "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"="true" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
|
|
|
|
+attributes #1 = { convergent "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
|
|
|
|
attributes #2 = { convergent nounwind }
|
|
|
|
|
|
|
|
|
|
!llvm.module.flags = !{!0}
|
|
|
|
|
@@ -91,29 +68,5 @@ attributes #2 = { convergent nounwind }
|
|
|
|
|
!0 = !{i32 1, !"wchar_size", i32 4}
|
|
|
|
|
!1 = !{i32 1, i32 2}
|
|
|
|
|
!2 = !{i32 4, i32 100000}
|
|
|
|
|
-!3 = !{!"clang version 12.0.0"}
|
|
|
|
|
-!4 = !{i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1}
|
|
|
|
|
-!5 = !{!6, !8, !10, !12}
|
|
|
|
|
-!6 = distinct !{!6, !7, !"_ZN7__spirv29InitSizesSTGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEE8initSizeEv: %agg.result"}
|
|
|
|
|
-!7 = distinct !{!7, !"_ZN7__spirv29InitSizesSTGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEE8initSizeEv"}
|
|
|
|
|
-!8 = distinct !{!8, !9, !"_ZN7__spirvL22initGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEEET0_v: %agg.result"}
|
|
|
|
|
-!9 = distinct !{!9, !"_ZN7__spirvL22initGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEEET0_v"}
|
|
|
|
|
-!10 = distinct !{!10, !11, !"_ZN2cl4sycl6detail7Builder7getItemILi1ELb1EEENSt9enable_ifIXT0_EKNS0_4itemIXT_EXT0_EEEE4typeEv: %agg.result"}
|
|
|
|
|
-!11 = distinct !{!11, !"_ZN2cl4sycl6detail7Builder7getItemILi1ELb1EEENSt9enable_ifIXT0_EKNS0_4itemIXT_EXT0_EEEE4typeEv"}
|
|
|
|
|
-!12 = distinct !{!12, !13, !"_ZN2cl4sycl6detail7Builder10getElementILi1ELb1EEEDTcl7getItemIXT_EXT0_EEEEPNS0_4itemIXT_EXT0_EEE: %agg.result"}
|
|
|
|
|
-!13 = distinct !{!13, !"_ZN2cl4sycl6detail7Builder10getElementILi1ELb1EEEDTcl7getItemIXT_EXT0_EEEEPNS0_4itemIXT_EXT0_EEE"}
|
|
|
|
|
-!14 = !{!15, !15, i64 0}
|
|
|
|
|
-!15 = !{!"float", !16, i64 0}
|
|
|
|
|
-!16 = !{!"omnipotent char", !17, i64 0}
|
|
|
|
|
-!17 = !{!"Simple C++ TBAA"}
|
|
|
|
|
-!18 = !{!19, !21, !23, !25}
|
|
|
|
|
-!19 = distinct !{!19, !20, !"_ZN7__spirv29InitSizesSTGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEE8initSizeEv: %agg.result"}
|
|
|
|
|
-!20 = distinct !{!20, !"_ZN7__spirv29InitSizesSTGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEE8initSizeEv"}
|
|
|
|
|
-!21 = distinct !{!21, !22, !"_ZN7__spirvL22initGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEEET0_v: %agg.result"}
|
|
|
|
|
-!22 = distinct !{!22, !"_ZN7__spirvL22initGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEEET0_v"}
|
|
|
|
|
-!23 = distinct !{!23, !24, !"_ZN2cl4sycl6detail7Builder7getItemILi1ELb1EEENSt9enable_ifIXT0_EKNS0_4itemIXT_EXT0_EEEE4typeEv: %agg.result"}
|
|
|
|
|
-!24 = distinct !{!24, !"_ZN2cl4sycl6detail7Builder7getItemILi1ELb1EEENSt9enable_ifIXT0_EKNS0_4itemIXT_EXT0_EEEE4typeEv"}
|
|
|
|
|
-!25 = distinct !{!25, !26, !"_ZN2cl4sycl6detail7Builder10getElementILi1ELb1EEEDTcl7getItemIXT_EXT0_EEEEPNS0_4itemIXT_EXT0_EEE: %agg.result"}
|
|
|
|
|
-!26 = distinct !{!26, !"_ZN2cl4sycl6detail7Builder10getElementILi1ELb1EEEDTcl7getItemIXT_EXT0_EEEEPNS0_4itemIXT_EXT0_EEE"}
|
|
|
|
|
-!27 = !{!28, !28, i64 0}
|
|
|
|
|
-!28 = !{!"double", !16, i64 0}
|
|
|
|
|
+!3 = !{!"clang version 13.0.0"}
|
|
|
|
|
+
|
|
|
|
|
diff --git a/test/AtomicFMaxEXT.ll b/test/AtomicFMaxEXT.ll
|
|
|
|
|
index 1b81e53b..1c2eec93 100644
|
|
|
|
|
--- a/test/AtomicFMaxEXT.ll
|
|
|
|
|
+++ b/test/AtomicFMaxEXT.ll
|
|
|
|
|
@@ -4,20 +4,16 @@
|
|
|
|
|
; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
|
|
|
|
|
|
|
|
|
|
; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
|
|
|
|
|
-; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefix=CHECK-LLVM
|
|
|
|
|
+; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefixes=CHECK-LLVM-CL,CHECK-LLVM-CL12
|
|
|
|
|
|
|
|
|
|
-target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64"
|
|
|
|
|
-target triple = "spir64-unknown-unknown-sycldevice"
|
|
|
|
|
-
|
|
|
|
|
-%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range" = type { %"class._ZTSN2cl4sycl6detail5arrayILi1EEE.cl::sycl::detail::array" }
|
|
|
|
|
-%"class._ZTSN2cl4sycl6detail5arrayILi1EEE.cl::sycl::detail::array" = type { [1 x i64] }
|
|
|
|
|
-%"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id" = type { %"class._ZTSN2cl4sycl6detail5arrayILi1EEE.cl::sycl::detail::array" }
|
|
|
|
|
-
|
|
|
|
|
-$_ZTSZZ8max_testIfEvN2cl4sycl5queueEmENKUlRNS1_7handlerEE16_14clES4_EUlNS1_4itemILi1ELb1EEEE19_37 = comdat any
|
|
|
|
|
+; RUN: llvm-spirv --spirv-target-env=CL2.0 -r %t.spv -o %t.rev.bc
|
|
|
|
|
+; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefixes=CHECK-LLVM-CL,CHECK-LLVM-CL20
|
|
|
|
|
|
|
|
|
|
-$_ZTSZZ8max_testIdEvN2cl4sycl5queueEmENKUlRNS1_7handlerEE16_14clES4_EUlNS1_4itemILi1ELb1EEEE19_37 = comdat any
|
|
|
|
|
+; RUN: llvm-spirv --spirv-target-env=SPV-IR -r %t.spv -o %t.rev.bc
|
|
|
|
|
+; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefixes=CHECK-LLVM-SPV
|
|
|
|
|
|
|
|
|
|
-@__spirv_BuiltInGlobalInvocationId = external dso_local local_unnamed_addr addrspace(1) constant <3 x i64>, align 32
|
|
|
|
|
+target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64"
|
|
|
|
|
+target triple = "spir64-unknown-unknown-sycldevice"
|
|
|
|
|
|
|
|
|
|
; CHECK-SPIRV: Capability AtomicFloat32MinMaxEXT
|
|
|
|
|
; CHECK-SPIRV: Capability AtomicFloat64MinMaxEXT
|
|
|
|
|
@@ -25,65 +21,42 @@ $_ZTSZZ8max_testIdEvN2cl4sycl5queueEmENKUlRNS1_7handlerEE16_14clES4_EUlNS1_4item
|
|
|
|
|
; CHECK-SPIRV: TypeFloat [[TYPE_FLOAT_32:[0-9]+]] 32
|
|
|
|
|
; CHECK-SPIRV: TypeFloat [[TYPE_FLOAT_64:[0-9]+]] 64
|
|
|
|
|
|
|
|
|
|
-; Function Attrs: convergent norecurse
|
|
|
|
|
-define weak_odr dso_local spir_kernel void @_ZTSZZ8max_testIfEvN2cl4sycl5queueEmENKUlRNS1_7handlerEE16_14clES4_EUlNS1_4itemILi1ELb1EEEE19_37(float addrspace(1)* %_arg_, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_1, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_2, %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* byval(%"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id") align 8 %_arg_3, float addrspace(1)* %_arg_4, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_6, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_7, %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* byval(%"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id") align 8 %_arg_8) local_unnamed_addr #0 comdat !kernel_arg_buffer_location !4 {
|
|
|
|
|
+; Function Attrs: convergent norecurse nounwind
|
|
|
|
|
+define dso_local spir_func float @_Z14AtomicFloatMaxRf(float addrspace(4)* align 4 dereferenceable(4) %Arg) local_unnamed_addr #0 {
|
|
|
|
|
entry:
|
|
|
|
|
- %0 = getelementptr inbounds %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id", %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* %_arg_3, i64 0, i32 0, i32 0, i64 0
|
|
|
|
|
- %1 = load i64, i64* %0, align 8
|
|
|
|
|
- %add.ptr.i29 = getelementptr inbounds float, float addrspace(1)* %_arg_, i64 %1
|
|
|
|
|
- %2 = getelementptr inbounds %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id", %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* %_arg_8, i64 0, i32 0, i32 0, i64 0
|
|
|
|
|
- %3 = load i64, i64* %2, align 8
|
|
|
|
|
- %add.ptr.i = getelementptr inbounds float, float addrspace(1)* %_arg_4, i64 %3
|
|
|
|
|
- %4 = load <3 x i64>, <3 x i64> addrspace(4)* addrspacecast (<3 x i64> addrspace(1)* @__spirv_BuiltInGlobalInvocationId to <3 x i64> addrspace(4)*), align 32, !noalias !5
|
|
|
|
|
- %5 = extractelement <3 x i64> %4, i64 0
|
|
|
|
|
- %conv.i = trunc i64 %5 to i32
|
|
|
|
|
- %conv3.i = sitofp i32 %conv.i to float
|
|
|
|
|
- %add.i = fadd float %conv3.i, 1.000000e+00
|
|
|
|
|
+ %0 = addrspacecast float addrspace(4)* %Arg to float addrspace(1)*
|
|
|
|
|
; CHECK-SPIRV: 7 AtomicFMaxEXT [[TYPE_FLOAT_32]]
|
|
|
|
|
- ; CHECK-LLVM: call spir_func float @[[FLOAT_FUNC_NAME:_Z21__spirv_AtomicFMaxEXT[[:alnum:]]+]]({{.*}})
|
|
|
|
|
- %call3.i.i.i = tail call spir_func float @_Z21__spirv_AtomicFMaxEXTPU3AS1fN5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagEf(float addrspace(1)* %add.ptr.i29, i32 1, i32 896, float %add.i) #2
|
|
|
|
|
- %sext.i = shl i64 %5, 32
|
|
|
|
|
- %conv6.i = ashr exact i64 %sext.i, 32
|
|
|
|
|
- %ptridx.i.i = getelementptr inbounds float, float addrspace(1)* %add.ptr.i, i64 %conv6.i
|
|
|
|
|
- %ptridx.ascast.i.i = addrspacecast float addrspace(1)* %ptridx.i.i to float addrspace(4)*
|
|
|
|
|
- store float %call3.i.i.i, float addrspace(4)* %ptridx.ascast.i.i, align 4, !tbaa !14
|
|
|
|
|
- ret void
|
|
|
|
|
+ ; CHECK-LLVM-CL12: call spir_func float @[[FLOAT_FUNC_NAME:_Z10atomic_max[[:alnum:]]+ff]]({{.*}})
|
|
|
|
|
+ ; CHECK-LLVM-CL20: call spir_func float @[[FLOAT_FUNC_NAME:_Z25atomic_fetch_max_explicit[[:alnum:]]+_Atomicff[a-zA-Z0-9_]+]]({{.*}})
|
|
|
|
|
+ ; CHECK-LLVM-SPV: call spir_func float @[[FLOAT_FUNC_NAME:_Z21__spirv_AtomicFMaxEXT[[:alnum:]]+fiif]]({{.*}})
|
|
|
|
|
+ %call.i.i.i = tail call spir_func float @_Z21__spirv_AtomicFMaxEXTPU3AS1fN5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagEf(float addrspace(1)* %0, i32 1, i32 896, float 1.000000e+00) #2
|
|
|
|
|
+ ret float %call.i.i.i
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
; Function Attrs: convergent
|
|
|
|
|
-; CHECK-LLVM: declare {{.*}}spir_func float @[[FLOAT_FUNC_NAME]](float addrspace(1)*, i32, i32, float)
|
|
|
|
|
declare dso_local spir_func float @_Z21__spirv_AtomicFMaxEXTPU3AS1fN5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagEf(float addrspace(1)*, i32, i32, float) local_unnamed_addr #1
|
|
|
|
|
+; CHECK-LLVM-SPV: declare {{.*}}spir_func float @[[FLOAT_FUNC_NAME]](float
|
|
|
|
|
|
|
|
|
|
-; Function Attrs: convergent norecurse
|
|
|
|
|
-define weak_odr dso_local spir_kernel void @_ZTSZZ8max_testIdEvN2cl4sycl5queueEmENKUlRNS1_7handlerEE16_14clES4_EUlNS1_4itemILi1ELb1EEEE19_37(double addrspace(1)* %_arg_, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_1, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_2, %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* byval(%"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id") align 8 %_arg_3, double addrspace(1)* %_arg_4, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_6, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_7, %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* byval(%"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id") align 8 %_arg_8) local_unnamed_addr #0 comdat !kernel_arg_buffer_location !4 {
|
|
|
|
|
+; Function Attrs: convergent norecurse nounwind
|
|
|
|
|
+define dso_local spir_func double @_Z15AtomicDoubleMaxRd(double addrspace(4)* align 8 dereferenceable(8) %Arg) local_unnamed_addr #0 {
|
|
|
|
|
entry:
|
|
|
|
|
- %0 = getelementptr inbounds %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id", %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* %_arg_3, i64 0, i32 0, i32 0, i64 0
|
|
|
|
|
- %1 = load i64, i64* %0, align 8
|
|
|
|
|
- %add.ptr.i29 = getelementptr inbounds double, double addrspace(1)* %_arg_, i64 %1
|
|
|
|
|
- %2 = getelementptr inbounds %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id", %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* %_arg_8, i64 0, i32 0, i32 0, i64 0
|
|
|
|
|
- %3 = load i64, i64* %2, align 8
|
|
|
|
|
- %add.ptr.i = getelementptr inbounds double, double addrspace(1)* %_arg_4, i64 %3
|
|
|
|
|
- %4 = load <3 x i64>, <3 x i64> addrspace(4)* addrspacecast (<3 x i64> addrspace(1)* @__spirv_BuiltInGlobalInvocationId to <3 x i64> addrspace(4)*), align 32, !noalias !18
|
|
|
|
|
- %5 = extractelement <3 x i64> %4, i64 0
|
|
|
|
|
- %conv.i = trunc i64 %5 to i32
|
|
|
|
|
- %conv3.i = sitofp i32 %conv.i to double
|
|
|
|
|
- %add.i = fadd double %conv3.i, 1.000000e+00
|
|
|
|
|
+ %0 = addrspacecast double addrspace(4)* %Arg to double addrspace(1)*
|
|
|
|
|
; CHECK-SPIRV: 7 AtomicFMaxEXT [[TYPE_FLOAT_64]]
|
|
|
|
|
- ; CHECK-LLVM: call spir_func double @[[DOUBLE_FUNC_NAME:_Z21__spirv_AtomicFMaxEXT[[:alnum:]]+]]({{.*}})
|
|
|
|
|
- %call3.i.i.i = tail call spir_func double @_Z21__spirv_AtomicFMaxEXTPU3AS1dN5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagEd(double addrspace(1)* %add.ptr.i29, i32 1, i32 896, double %add.i) #2
|
|
|
|
|
- %sext.i = shl i64 %5, 32
|
|
|
|
|
- %conv6.i = ashr exact i64 %sext.i, 32
|
|
|
|
|
- %ptridx.i.i = getelementptr inbounds double, double addrspace(1)* %add.ptr.i, i64 %conv6.i
|
|
|
|
|
- %ptridx.ascast.i.i = addrspacecast double addrspace(1)* %ptridx.i.i to double addrspace(4)*
|
|
|
|
|
- store double %call3.i.i.i, double addrspace(4)* %ptridx.ascast.i.i, align 8, !tbaa !27
|
|
|
|
|
- ret void
|
|
|
|
|
+ ; CHECK-LLVM-CL12: call spir_func double @[[DOUBLE_FUNC_NAME:_Z10atomic_max[[:alnum:]]+dd]]({{.*}})
|
|
|
|
|
+ ; CHECK-LLVM-CL20: call spir_func double @[[DOUBLE_FUNC_NAME:_Z25atomic_fetch_max_explicit[[:alnum:]]+_Atomicdd[a-zA-Z0-9_]+]]({{.*}})
|
|
|
|
|
+ ; CHECK-LLVM-SPV: call spir_func double @[[DOUBLE_FUNC_NAME:_Z21__spirv_AtomicFMaxEXT[[:alnum:]]+diid]]({{.*}})
|
|
|
|
|
+ %call.i.i.i = tail call spir_func double @_Z21__spirv_AtomicFMaxEXTPU3AS1dN5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagEd(double addrspace(1)* %0, i32 1, i32 896, double 1.000000e+00) #2
|
|
|
|
|
+ ret double %call.i.i.i
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
; Function Attrs: convergent
|
|
|
|
|
-; CHECK-LLVM: declare {{.*}}spir_func double @[[DOUBLE_FUNC_NAME]](double addrspace(1)*, i32, i32, double)
|
|
|
|
|
declare dso_local spir_func double @_Z21__spirv_AtomicFMaxEXTPU3AS1dN5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagEd(double addrspace(1)*, i32, i32, double) local_unnamed_addr #1
|
|
|
|
|
+; CHECK-LLVM-SPV: declare {{.*}}spir_func double @[[DOUBLE_FUNC_NAME]](double
|
|
|
|
|
|
|
|
|
|
-attributes #0 = { convergent norecurse "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"="true" "stack-protector-buffer-size"="8" "uniform-work-group-size"="true" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
|
|
|
|
+; CHECK-LLVM-CL: declare {{.*}}spir_func float @[[FLOAT_FUNC_NAME]](float
|
|
|
|
|
+; CHECK-LLVM-CL: declare {{.*}}spir_func double @[[DOUBLE_FUNC_NAME]](double
|
|
|
|
|
+
|
|
|
|
|
+attributes #0 = { convergent norecurse nounwind "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"="true" "stack-protector-buffer-size"="8" "uniform-work-group-size"="true" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
|
|
|
|
attributes #1 = { convergent "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
|
|
|
|
attributes #2 = { convergent nounwind }
|
|
|
|
|
|
|
|
|
|
@@ -95,29 +68,5 @@ attributes #2 = { convergent nounwind }
|
|
|
|
|
!0 = !{i32 1, !"wchar_size", i32 4}
|
|
|
|
|
!1 = !{i32 1, i32 2}
|
|
|
|
|
!2 = !{i32 4, i32 100000}
|
|
|
|
|
-!3 = !{!"clang version 12.0.0"}
|
|
|
|
|
-!4 = !{i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1}
|
|
|
|
|
-!5 = !{!6, !8, !10, !12}
|
|
|
|
|
-!6 = distinct !{!6, !7, !"_ZN7__spirv29InitSizesSTGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEE8initSizeEv: %agg.result"}
|
|
|
|
|
-!7 = distinct !{!7, !"_ZN7__spirv29InitSizesSTGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEE8initSizeEv"}
|
|
|
|
|
-!8 = distinct !{!8, !9, !"_ZN7__spirvL22initGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEEET0_v: %agg.result"}
|
|
|
|
|
-!9 = distinct !{!9, !"_ZN7__spirvL22initGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEEET0_v"}
|
|
|
|
|
-!10 = distinct !{!10, !11, !"_ZN2cl4sycl6detail7Builder7getItemILi1ELb1EEENSt9enable_ifIXT0_EKNS0_4itemIXT_EXT0_EEEE4typeEv: %agg.result"}
|
|
|
|
|
-!11 = distinct !{!11, !"_ZN2cl4sycl6detail7Builder7getItemILi1ELb1EEENSt9enable_ifIXT0_EKNS0_4itemIXT_EXT0_EEEE4typeEv"}
|
|
|
|
|
-!12 = distinct !{!12, !13, !"_ZN2cl4sycl6detail7Builder10getElementILi1ELb1EEEDTcl7getItemIXT_EXT0_EEEEPNS0_4itemIXT_EXT0_EEE: %agg.result"}
|
|
|
|
|
-!13 = distinct !{!13, !"_ZN2cl4sycl6detail7Builder10getElementILi1ELb1EEEDTcl7getItemIXT_EXT0_EEEEPNS0_4itemIXT_EXT0_EEE"}
|
|
|
|
|
-!14 = !{!15, !15, i64 0}
|
|
|
|
|
-!15 = !{!"float", !16, i64 0}
|
|
|
|
|
-!16 = !{!"omnipotent char", !17, i64 0}
|
|
|
|
|
-!17 = !{!"Simple C++ TBAA"}
|
|
|
|
|
-!18 = !{!19, !21, !23, !25}
|
|
|
|
|
-!19 = distinct !{!19, !20, !"_ZN7__spirv29InitSizesSTGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEE8initSizeEv: %agg.result"}
|
|
|
|
|
-!20 = distinct !{!20, !"_ZN7__spirv29InitSizesSTGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEE8initSizeEv"}
|
|
|
|
|
-!21 = distinct !{!21, !22, !"_ZN7__spirvL22initGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEEET0_v: %agg.result"}
|
|
|
|
|
-!22 = distinct !{!22, !"_ZN7__spirvL22initGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEEET0_v"}
|
|
|
|
|
-!23 = distinct !{!23, !24, !"_ZN2cl4sycl6detail7Builder7getItemILi1ELb1EEENSt9enable_ifIXT0_EKNS0_4itemIXT_EXT0_EEEE4typeEv: %agg.result"}
|
|
|
|
|
-!24 = distinct !{!24, !"_ZN2cl4sycl6detail7Builder7getItemILi1ELb1EEENSt9enable_ifIXT0_EKNS0_4itemIXT_EXT0_EEEE4typeEv"}
|
|
|
|
|
-!25 = distinct !{!25, !26, !"_ZN2cl4sycl6detail7Builder10getElementILi1ELb1EEEDTcl7getItemIXT_EXT0_EEEEPNS0_4itemIXT_EXT0_EEE: %agg.result"}
|
|
|
|
|
-!26 = distinct !{!26, !"_ZN2cl4sycl6detail7Builder10getElementILi1ELb1EEEDTcl7getItemIXT_EXT0_EEEEPNS0_4itemIXT_EXT0_EEE"}
|
|
|
|
|
-!27 = !{!28, !28, i64 0}
|
|
|
|
|
-!28 = !{!"double", !16, i64 0}
|
|
|
|
|
+!3 = !{!"clang version 13.0.0"}
|
|
|
|
|
+
|
|
|
|
|
diff --git a/test/AtomicFMaxEXTForOCL.ll b/test/AtomicFMaxEXTForOCL.ll
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 00000000..1f2530d9
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/test/AtomicFMaxEXTForOCL.ll
|
|
|
|
|
@@ -0,0 +1,64 @@
|
|
|
|
|
+; RUN: llvm-as %s -o %t.bc
|
|
|
|
|
+; RUN: llvm-spirv %t.bc --spirv-ext=+SPV_EXT_shader_atomic_float_min_max -o %t.spv
|
|
|
|
|
+; RUN: spirv-val %t.spv
|
|
|
|
|
+; RUN: llvm-spirv -to-text %t.spv -o %t.spt
|
|
|
|
|
+; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
|
|
|
|
|
+
|
|
|
|
|
+; RUN: llvm-spirv --spirv-target-env=CL2.0 -r %t.spv -o %t.rev.bc
|
|
|
|
|
+; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefixes=CHECK-LLVM-CL,CHECK-LLVM-CL20
|
|
|
|
|
+
|
|
|
|
|
+; RUN: llvm-spirv --spirv-target-env=SPV-IR -r %t.spv -o %t.rev.bc
|
|
|
|
|
+; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefixes=CHECK-LLVM-SPV
|
|
|
|
|
+
|
|
|
|
|
+target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
|
|
|
|
|
+target triple = "spir-unknown-unknown"
|
|
|
|
|
+
|
|
|
|
|
+; CHECK-SPIRV: Capability AtomicFloat32MinMaxEXT
|
|
|
|
|
+; CHECK-SPIRV: Capability AtomicFloat64MinMaxEXT
|
|
|
|
|
+; CHECK-SPIRV: Extension "SPV_EXT_shader_atomic_float_min_max"
|
|
|
|
|
+; CHECK-SPIRV: TypeFloat [[TYPE_FLOAT_32:[0-9]+]] 32
|
|
|
|
|
+; CHECK-SPIRV: TypeFloat [[TYPE_FLOAT_64:[0-9]+]] 64
|
|
|
|
|
+
|
|
|
|
|
+; Function Attrs: convergent norecurse nounwind
|
|
|
|
|
+define dso_local spir_func void @test_float(float addrspace(1)* %a) local_unnamed_addr #0 {
|
|
|
|
|
+entry:
|
|
|
|
|
+ ; CHECK-SPIRV: 7 AtomicFMaxEXT [[TYPE_FLOAT_32]]
|
|
|
|
|
+ ; CHECK-LLVM-CL20: call spir_func float @[[FLOAT_FUNC_NAME:_Z25atomic_fetch_max_explicit[[:alnum:]]+_Atomicff[a-zA-Z0-9_]+]]({{.*}})
|
|
|
|
|
+ ; CHECK-LLVM-SPV: call spir_func float @[[FLOAT_FUNC_NAME:_Z21__spirv_AtomicFMaxEXT[[:alnum:]]+fiif]]({{.*}})
|
|
|
|
|
+ %call = tail call spir_func float @_Z25atomic_fetch_max_explicitPU3AS1VU7_Atomicff12memory_order(float addrspace(1)* %a, float 0.000000e+00, i32 0) #2
|
|
|
|
|
+ ret void
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+; Function Attrs: convergent
|
|
|
|
|
+declare spir_func float @_Z25atomic_fetch_max_explicitPU3AS1VU7_Atomicff12memory_order(float addrspace(1)*, float, i32) local_unnamed_addr #1
|
|
|
|
|
+; CHECK-LLVM-SPV: declare {{.*}}spir_func float @[[FLOAT_FUNC_NAME]](float
|
|
|
|
|
+
|
|
|
|
|
+; Function Attrs: convergent norecurse nounwind
|
|
|
|
|
+define dso_local spir_func void @test_double(double addrspace(1)* %a) local_unnamed_addr #0 {
|
|
|
|
|
+entry:
|
|
|
|
|
+ ; CHECK-SPIRV: 7 AtomicFMaxEXT [[TYPE_FLOAT_64]]
|
|
|
|
|
+ ; CHECK-LLVM-CL20: call spir_func double @[[DOUBLE_FUNC_NAME:_Z25atomic_fetch_max_explicit[[:alnum:]]+_Atomicdd[a-zA-Z0-9_]+]]({{.*}})
|
|
|
|
|
+ ; CHECK-LLVM-SPV: call spir_func double @[[DOUBLE_FUNC_NAME:_Z21__spirv_AtomicFMaxEXT[[:alnum:]]+diid]]({{.*}})
|
|
|
|
|
+ %call = tail call spir_func double @_Z25atomic_fetch_max_explicitPU3AS1VU7_Atomicdd12memory_order(double addrspace(1)* %a, double 0.000000e+00, i32 0) #2
|
|
|
|
|
+ ret void
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+; Function Attrs: convergent
|
|
|
|
|
+declare spir_func double @_Z25atomic_fetch_max_explicitPU3AS1VU7_Atomicdd12memory_order(double addrspace(1)*, double, i32) local_unnamed_addr #1
|
|
|
|
|
+; CHECK-LLVM-SPV: declare {{.*}}spir_func double @[[DOUBLE_FUNC_NAME]](double
|
|
|
|
|
+
|
|
|
|
|
+; CHECK-LLVM-CL: declare {{.*}}spir_func float @[[FLOAT_FUNC_NAME]](float
|
|
|
|
|
+; CHECK-LLVM-CL: declare {{.*}}spir_func double @[[DOUBLE_FUNC_NAME]](double
|
|
|
|
|
+
|
|
|
|
|
+attributes #0 = { convergent norecurse nounwind "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
|
|
|
|
|
+attributes #1 = { convergent "frame-pointer"="none" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
|
|
|
|
|
+attributes #2 = { convergent nounwind }
|
|
|
|
|
+
|
|
|
|
|
+!llvm.module.flags = !{!0}
|
|
|
|
|
+!opencl.ocl.version = !{!1}
|
|
|
|
|
+!opencl.spir.version = !{!1}
|
|
|
|
|
+!llvm.ident = !{!2}
|
|
|
|
|
+
|
|
|
|
|
+!0 = !{i32 1, !"wchar_size", i32 4}
|
|
|
|
|
+!1 = !{i32 2, i32 0}
|
|
|
|
|
+!2 = !{!"clang version 13.0.0 (https://github.com/llvm/llvm-project.git 94aa388f0ce0723bb15503cf41c2c15b288375b9)"}
|
|
|
|
|
diff --git a/test/AtomicFMinEXT.ll b/test/AtomicFMinEXT.ll
|
|
|
|
|
index 98c98b8e..9e40a669 100644
|
|
|
|
|
--- a/test/AtomicFMinEXT.ll
|
|
|
|
|
+++ b/test/AtomicFMinEXT.ll
|
|
|
|
|
@@ -4,20 +4,16 @@
|
|
|
|
|
; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
|
|
|
|
|
|
|
|
|
|
; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
|
|
|
|
|
-; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefix=CHECK-LLVM
|
|
|
|
|
+; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefixes=CHECK-LLVM-CL,CHECK-LLVM-CL12
|
|
|
|
|
|
|
|
|
|
-target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64"
|
|
|
|
|
-target triple = "spir64-unknown-unknown-sycldevice"
|
|
|
|
|
-
|
|
|
|
|
-%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range" = type { %"class._ZTSN2cl4sycl6detail5arrayILi1EEE.cl::sycl::detail::array" }
|
|
|
|
|
-%"class._ZTSN2cl4sycl6detail5arrayILi1EEE.cl::sycl::detail::array" = type { [1 x i64] }
|
|
|
|
|
-%"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id" = type { %"class._ZTSN2cl4sycl6detail5arrayILi1EEE.cl::sycl::detail::array" }
|
|
|
|
|
-
|
|
|
|
|
-$_ZTSZZ8min_testIfEvN2cl4sycl5queueEmENKUlRNS1_7handlerEE16_14clES4_EUlNS1_4itemILi1ELb1EEEE19_37 = comdat any
|
|
|
|
|
+; RUN: llvm-spirv --spirv-target-env=CL2.0 -r %t.spv -o %t.rev.bc
|
|
|
|
|
+; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefixes=CHECK-LLVM-CL,CHECK-LLVM-CL20
|
|
|
|
|
|
|
|
|
|
-$_ZTSZZ8min_testIdEvN2cl4sycl5queueEmENKUlRNS1_7handlerEE16_14clES4_EUlNS1_4itemILi1ELb1EEEE19_37 = comdat any
|
|
|
|
|
+; RUN: llvm-spirv --spirv-target-env=SPV-IR -r %t.spv -o %t.rev.bc
|
|
|
|
|
+; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefixes=CHECK-LLVM-SPV
|
|
|
|
|
|
|
|
|
|
-@__spirv_BuiltInGlobalInvocationId = external dso_local local_unnamed_addr addrspace(1) constant <3 x i64>, align 32
|
|
|
|
|
+target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64"
|
|
|
|
|
+target triple = "spir64-unknown-unknown-sycldevice"
|
|
|
|
|
|
|
|
|
|
; CHECK-SPIRV: Capability AtomicFloat32MinMaxEXT
|
|
|
|
|
; CHECK-SPIRV: Capability AtomicFloat64MinMaxEXT
|
|
|
|
|
@@ -25,65 +21,42 @@ $_ZTSZZ8min_testIdEvN2cl4sycl5queueEmENKUlRNS1_7handlerEE16_14clES4_EUlNS1_4item
|
|
|
|
|
; CHECK-SPIRV: TypeFloat [[TYPE_FLOAT_32:[0-9]+]] 32
|
|
|
|
|
; CHECK-SPIRV: TypeFloat [[TYPE_FLOAT_64:[0-9]+]] 64
|
|
|
|
|
|
|
|
|
|
-; Function Attrs: convergent norecurse
|
|
|
|
|
-define weak_odr dso_local spir_kernel void @_ZTSZZ8min_testIfEvN2cl4sycl5queueEmENKUlRNS1_7handlerEE16_14clES4_EUlNS1_4itemILi1ELb1EEEE19_37(float addrspace(1)* %_arg_, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_1, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_2, %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* byval(%"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id") align 8 %_arg_3, float addrspace(1)* %_arg_4, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_6, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_7, %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* byval(%"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id") align 8 %_arg_8) local_unnamed_addr #0 comdat !kernel_arg_buffer_location !4 {
|
|
|
|
|
+; Function Attrs: convergent norecurse nounwind
|
|
|
|
|
+define dso_local spir_func float @_Z14AtomicFloatMinRf(float addrspace(4)* align 4 dereferenceable(4) %Arg) local_unnamed_addr #0 {
|
|
|
|
|
entry:
|
|
|
|
|
- %0 = getelementptr inbounds %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id", %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* %_arg_3, i64 0, i32 0, i32 0, i64 0
|
|
|
|
|
- %1 = load i64, i64* %0, align 8
|
|
|
|
|
- %add.ptr.i29 = getelementptr inbounds float, float addrspace(1)* %_arg_, i64 %1
|
|
|
|
|
- %2 = getelementptr inbounds %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id", %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* %_arg_8, i64 0, i32 0, i32 0, i64 0
|
|
|
|
|
- %3 = load i64, i64* %2, align 8
|
|
|
|
|
- %add.ptr.i = getelementptr inbounds float, float addrspace(1)* %_arg_4, i64 %3
|
|
|
|
|
- %4 = load <3 x i64>, <3 x i64> addrspace(4)* addrspacecast (<3 x i64> addrspace(1)* @__spirv_BuiltInGlobalInvocationId to <3 x i64> addrspace(4)*), align 32, !noalias !5
|
|
|
|
|
- %5 = extractelement <3 x i64> %4, i64 0
|
|
|
|
|
- %conv.i = trunc i64 %5 to i32
|
|
|
|
|
- %conv3.i = sitofp i32 %conv.i to float
|
|
|
|
|
- %add.i = fadd float %conv3.i, 1.000000e+00
|
|
|
|
|
+ %0 = addrspacecast float addrspace(4)* %Arg to float addrspace(1)*
|
|
|
|
|
; CHECK-SPIRV: 7 AtomicFMinEXT [[TYPE_FLOAT_32]]
|
|
|
|
|
- ; CHECK-LLVM: call spir_func float @[[FLOAT_FUNC_NAME:_Z21__spirv_AtomicFMinEXT[[:alnum:]]+]]({{.*}})
|
|
|
|
|
- %call3.i.i.i = tail call spir_func float @_Z21__spirv_AtomicFMinEXTPU3AS1fN5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagEf(float addrspace(1)* %add.ptr.i29, i32 1, i32 896, float %add.i) #2
|
|
|
|
|
- %sext.i = shl i64 %5, 32
|
|
|
|
|
- %conv6.i = ashr exact i64 %sext.i, 32
|
|
|
|
|
- %ptridx.i.i = getelementptr inbounds float, float addrspace(1)* %add.ptr.i, i64 %conv6.i
|
|
|
|
|
- %ptridx.ascast.i.i = addrspacecast float addrspace(1)* %ptridx.i.i to float addrspace(4)*
|
|
|
|
|
- store float %call3.i.i.i, float addrspace(4)* %ptridx.ascast.i.i, align 4, !tbaa !14
|
|
|
|
|
- ret void
|
|
|
|
|
+ ; CHECK-LLVM-CL12: call spir_func float @[[FLOAT_FUNC_NAME:_Z10atomic_min[[:alnum:]]+ff]]({{.*}})
|
|
|
|
|
+ ; CHECK-LLVM-CL20: call spir_func float @[[FLOAT_FUNC_NAME:_Z25atomic_fetch_min_explicit[[:alnum:]]+_Atomicff[a-zA-Z0-9_]+]]({{.*}})
|
|
|
|
|
+ ; CHECK-LLVM-SPV: call spir_func float @[[FLOAT_FUNC_NAME:_Z21__spirv_AtomicFMinEXT[[:alnum:]]+fiif]]({{.*}})
|
|
|
|
|
+ %call.i.i.i = tail call spir_func float @_Z21__spirv_AtomicFMinEXTPU3AS1fN5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagEf(float addrspace(1)* %0, i32 1, i32 896, float 1.000000e+00) #2
|
|
|
|
|
+ ret float %call.i.i.i
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
; Function Attrs: convergent
|
|
|
|
|
-; CHECK-LLVM: declare {{.*}}spir_func float @[[FLOAT_FUNC_NAME]](float addrspace(1)*, i32, i32, float)
|
|
|
|
|
declare dso_local spir_func float @_Z21__spirv_AtomicFMinEXTPU3AS1fN5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagEf(float addrspace(1)*, i32, i32, float) local_unnamed_addr #1
|
|
|
|
|
+; CHECK-LLVM-SPV: declare {{.*}}spir_func float @[[FLOAT_FUNC_NAME]](float
|
|
|
|
|
|
|
|
|
|
-; Function Attrs: convergent norecurse
|
|
|
|
|
-define weak_odr dso_local spir_kernel void @_ZTSZZ8min_testIdEvN2cl4sycl5queueEmENKUlRNS1_7handlerEE16_14clES4_EUlNS1_4itemILi1ELb1EEEE19_37(double addrspace(1)* %_arg_, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_1, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_2, %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* byval(%"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id") align 8 %_arg_3, double addrspace(1)* %_arg_4, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_6, %"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range"* byval(%"class._ZTSN2cl4sycl5rangeILi1EEE.cl::sycl::range") align 8 %_arg_7, %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* byval(%"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id") align 8 %_arg_8) local_unnamed_addr #0 comdat !kernel_arg_buffer_location !4 {
|
|
|
|
|
+; Function Attrs: convergent norecurse nounwind
|
|
|
|
|
+define dso_local spir_func double @_Z15AtomicDoubleMinRd(double addrspace(4)* align 8 dereferenceable(8) %Arg) local_unnamed_addr #0 {
|
|
|
|
|
entry:
|
|
|
|
|
- %0 = getelementptr inbounds %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id", %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* %_arg_3, i64 0, i32 0, i32 0, i64 0
|
|
|
|
|
- %1 = load i64, i64* %0, align 8
|
|
|
|
|
- %add.ptr.i29 = getelementptr inbounds double, double addrspace(1)* %_arg_, i64 %1
|
|
|
|
|
- %2 = getelementptr inbounds %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id", %"class._ZTSN2cl4sycl2idILi1EEE.cl::sycl::id"* %_arg_8, i64 0, i32 0, i32 0, i64 0
|
|
|
|
|
- %3 = load i64, i64* %2, align 8
|
|
|
|
|
- %add.ptr.i = getelementptr inbounds double, double addrspace(1)* %_arg_4, i64 %3
|
|
|
|
|
- %4 = load <3 x i64>, <3 x i64> addrspace(4)* addrspacecast (<3 x i64> addrspace(1)* @__spirv_BuiltInGlobalInvocationId to <3 x i64> addrspace(4)*), align 32, !noalias !18
|
|
|
|
|
- %5 = extractelement <3 x i64> %4, i64 0
|
|
|
|
|
- %conv.i = trunc i64 %5 to i32
|
|
|
|
|
- %conv3.i = sitofp i32 %conv.i to double
|
|
|
|
|
- %add.i = fadd double %conv3.i, 1.000000e+00
|
|
|
|
|
+ %0 = addrspacecast double addrspace(4)* %Arg to double addrspace(1)*
|
|
|
|
|
; CHECK-SPIRV: 7 AtomicFMinEXT [[TYPE_FLOAT_64]]
|
|
|
|
|
- ; CHECK-LLVM: call spir_func double @[[DOUBLE_FUNC_NAME:_Z21__spirv_AtomicFMinEXT[[:alnum:]]+]]({{.*}})
|
|
|
|
|
- %call3.i.i.i = tail call spir_func double @_Z21__spirv_AtomicFMinEXTPU3AS1dN5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagEd(double addrspace(1)* %add.ptr.i29, i32 1, i32 896, double %add.i) #2
|
|
|
|
|
- %sext.i = shl i64 %5, 32
|
|
|
|
|
- %conv6.i = ashr exact i64 %sext.i, 32
|
|
|
|
|
- %ptridx.i.i = getelementptr inbounds double, double addrspace(1)* %add.ptr.i, i64 %conv6.i
|
|
|
|
|
- %ptridx.ascast.i.i = addrspacecast double addrspace(1)* %ptridx.i.i to double addrspace(4)*
|
|
|
|
|
- store double %call3.i.i.i, double addrspace(4)* %ptridx.ascast.i.i, align 8, !tbaa !27
|
|
|
|
|
- ret void
|
|
|
|
|
+ ; CHECK-LLVM-CL12: call spir_func double @[[DOUBLE_FUNC_NAME:_Z10atomic_min[[:alnum:]]+dd]]({{.*}})
|
|
|
|
|
+ ; CHECK-LLVM-CL20: call spir_func double @[[DOUBLE_FUNC_NAME:_Z25atomic_fetch_min_explicit[[:alnum:]]+_Atomicdd[a-zA-Z0-9_]+]]({{.*}})
|
|
|
|
|
+ ; CHECK-LLVM-SPV: call spir_func double @[[DOUBLE_FUNC_NAME:_Z21__spirv_AtomicFMinEXT[[:alnum:]]+diid]]({{.*}})
|
|
|
|
|
+ %call.i.i.i = tail call spir_func double @_Z21__spirv_AtomicFMinEXTPU3AS1dN5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagEd(double addrspace(1)* %0, i32 1, i32 896, double 1.000000e+00) #2
|
|
|
|
|
+ ret double %call.i.i.i
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
; Function Attrs: convergent
|
|
|
|
|
-; CHECK-LLVM: declare {{.*}}spir_func double @[[DOUBLE_FUNC_NAME]](double addrspace(1)*, i32, i32, double)
|
|
|
|
|
declare dso_local spir_func double @_Z21__spirv_AtomicFMinEXTPU3AS1dN5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagEd(double addrspace(1)*, i32, i32, double) local_unnamed_addr #1
|
|
|
|
|
+; CHECK-LLVM-SPV: declare {{.*}}spir_func double @[[DOUBLE_FUNC_NAME]](double
|
|
|
|
|
|
|
|
|
|
-attributes #0 = { convergent norecurse "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"="true" "stack-protector-buffer-size"="8" "uniform-work-group-size"="true" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
|
|
|
|
+; CHECK-LLVM-CL: declare {{.*}}spir_func float @[[FLOAT_FUNC_NAME]](float
|
|
|
|
|
+; CHECK-LLVM-CL: declare {{.*}}spir_func double @[[DOUBLE_FUNC_NAME]](double
|
|
|
|
|
+
|
|
|
|
|
+attributes #0 = { convergent norecurse nounwind "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"="true" "stack-protector-buffer-size"="8" "uniform-work-group-size"="true" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
|
|
|
|
attributes #1 = { convergent "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
|
|
|
|
attributes #2 = { convergent nounwind }
|
|
|
|
|
|
|
|
|
|
@@ -95,29 +68,5 @@ attributes #2 = { convergent nounwind }
|
|
|
|
|
!0 = !{i32 1, !"wchar_size", i32 4}
|
|
|
|
|
!1 = !{i32 1, i32 2}
|
|
|
|
|
!2 = !{i32 4, i32 100000}
|
|
|
|
|
-!3 = !{!"clang version 12.0.0 (https://github.com/otcshare/llvm.git 67add71766d55d6a8d8d894822f583d6365a3b7d)"}
|
|
|
|
|
-!4 = !{i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1}
|
|
|
|
|
-!5 = !{!6, !8, !10, !12}
|
|
|
|
|
-!6 = distinct !{!6, !7, !"_ZN7__spirv29InitSizesSTGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEE8initSizeEv: %agg.result"}
|
|
|
|
|
-!7 = distinct !{!7, !"_ZN7__spirv29InitSizesSTGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEE8initSizeEv"}
|
|
|
|
|
-!8 = distinct !{!8, !9, !"_ZN7__spirvL22initGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEEET0_v: %agg.result"}
|
|
|
|
|
-!9 = distinct !{!9, !"_ZN7__spirvL22initGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEEET0_v"}
|
|
|
|
|
-!10 = distinct !{!10, !11, !"_ZN2cl4sycl6detail7Builder7getItemILi1ELb1EEENSt9enable_ifIXT0_EKNS0_4itemIXT_EXT0_EEEE4typeEv: %agg.result"}
|
|
|
|
|
-!11 = distinct !{!11, !"_ZN2cl4sycl6detail7Builder7getItemILi1ELb1EEENSt9enable_ifIXT0_EKNS0_4itemIXT_EXT0_EEEE4typeEv"}
|
|
|
|
|
-!12 = distinct !{!12, !13, !"_ZN2cl4sycl6detail7Builder10getElementILi1ELb1EEEDTcl7getItemIXT_EXT0_EEEEPNS0_4itemIXT_EXT0_EEE: %agg.result"}
|
|
|
|
|
-!13 = distinct !{!13, !"_ZN2cl4sycl6detail7Builder10getElementILi1ELb1EEEDTcl7getItemIXT_EXT0_EEEEPNS0_4itemIXT_EXT0_EEE"}
|
|
|
|
|
-!14 = !{!15, !15, i64 0}
|
|
|
|
|
-!15 = !{!"float", !16, i64 0}
|
|
|
|
|
-!16 = !{!"omnipotent char", !17, i64 0}
|
|
|
|
|
-!17 = !{!"Simple C++ TBAA"}
|
|
|
|
|
-!18 = !{!19, !21, !23, !25}
|
|
|
|
|
-!19 = distinct !{!19, !20, !"_ZN7__spirv29InitSizesSTGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEE8initSizeEv: %agg.result"}
|
|
|
|
|
-!20 = distinct !{!20, !"_ZN7__spirv29InitSizesSTGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEE8initSizeEv"}
|
|
|
|
|
-!21 = distinct !{!21, !22, !"_ZN7__spirvL22initGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEEET0_v: %agg.result"}
|
|
|
|
|
-!22 = distinct !{!22, !"_ZN7__spirvL22initGlobalInvocationIdILi1EN2cl4sycl2idILi1EEEEET0_v"}
|
|
|
|
|
-!23 = distinct !{!23, !24, !"_ZN2cl4sycl6detail7Builder7getItemILi1ELb1EEENSt9enable_ifIXT0_EKNS0_4itemIXT_EXT0_EEEE4typeEv: %agg.result"}
|
|
|
|
|
-!24 = distinct !{!24, !"_ZN2cl4sycl6detail7Builder7getItemILi1ELb1EEENSt9enable_ifIXT0_EKNS0_4itemIXT_EXT0_EEEE4typeEv"}
|
|
|
|
|
-!25 = distinct !{!25, !26, !"_ZN2cl4sycl6detail7Builder10getElementILi1ELb1EEEDTcl7getItemIXT_EXT0_EEEEPNS0_4itemIXT_EXT0_EEE: %agg.result"}
|
|
|
|
|
-!26 = distinct !{!26, !"_ZN2cl4sycl6detail7Builder10getElementILi1ELb1EEEDTcl7getItemIXT_EXT0_EEEEPNS0_4itemIXT_EXT0_EEE"}
|
|
|
|
|
-!27 = !{!28, !28, i64 0}
|
|
|
|
|
-!28 = !{!"double", !16, i64 0}
|
|
|
|
|
+!3 = !{!"clang version 13.0.0"}
|
|
|
|
|
+
|
|
|
|
|
diff --git a/test/AtomicFMinEXTForOCL.ll b/test/AtomicFMinEXTForOCL.ll
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 00000000..6196b0f8
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/test/AtomicFMinEXTForOCL.ll
|
|
|
|
|
@@ -0,0 +1,64 @@
|
|
|
|
|
+; RUN: llvm-as %s -o %t.bc
|
|
|
|
|
+; RUN: llvm-spirv %t.bc --spirv-ext=+SPV_EXT_shader_atomic_float_min_max -o %t.spv
|
|
|
|
|
+; RUN: spirv-val %t.spv
|
|
|
|
|
+; RUN: llvm-spirv -to-text %t.spv -o %t.spt
|
|
|
|
|
+; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
|
|
|
|
|
+
|
|
|
|
|
+; RUN: llvm-spirv --spirv-target-env=CL2.0 -r %t.spv -o %t.rev.bc
|
|
|
|
|
+; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefixes=CHECK-LLVM-CL,CHECK-LLVM-CL20
|
|
|
|
|
+
|
|
|
|
|
+; RUN: llvm-spirv --spirv-target-env=SPV-IR -r %t.spv -o %t.rev.bc
|
|
|
|
|
+; RUN: llvm-dis %t.rev.bc -o - | FileCheck %s --check-prefixes=CHECK-LLVM-SPV
|
|
|
|
|
+
|
|
|
|
|
+target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
|
|
|
|
|
+target triple = "spir-unknown-unknown"
|
|
|
|
|
+
|
|
|
|
|
+; CHECK-SPIRV: Capability AtomicFloat32MinMaxEXT
|
|
|
|
|
+; CHECK-SPIRV: Capability AtomicFloat64MinMaxEXT
|
|
|
|
|
+; CHECK-SPIRV: Extension "SPV_EXT_shader_atomic_float_min_max"
|
|
|
|
|
+; CHECK-SPIRV: TypeFloat [[TYPE_FLOAT_32:[0-9]+]] 32
|
|
|
|
|
+; CHECK-SPIRV: TypeFloat [[TYPE_FLOAT_64:[0-9]+]] 64
|
|
|
|
|
+
|
|
|
|
|
+; Function Attrs: convergent norecurse nounwind
|
|
|
|
|
+define dso_local spir_func void @test_float(float addrspace(1)* %a) local_unnamed_addr #0 {
|
|
|
|
|
+entry:
|
|
|
|
|
+ ; CHECK-SPIRV: 7 AtomicFMinEXT [[TYPE_FLOAT_32]]
|
|
|
|
|
+ ; CHECK-LLVM-CL20: call spir_func float @[[FLOAT_FUNC_NAME:_Z25atomic_fetch_min_explicit[[:alnum:]]+_Atomicff[a-zA-Z0-9_]+]]({{.*}})
|
|
|
|
|
+ ; CHECK-LLVM-SPV: call spir_func float @[[FLOAT_FUNC_NAME:_Z21__spirv_AtomicFMinEXT[[:alnum:]]+fiif]]({{.*}})
|
|
|
|
|
+ %call = tail call spir_func float @_Z25atomic_fetch_min_explicitPU3AS1VU7_Atomicff12memory_order(float addrspace(1)* %a, float 0.000000e+00, i32 0) #2
|
|
|
|
|
+ ret void
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+; Function Attrs: convergent
|
|
|
|
|
+declare spir_func float @_Z25atomic_fetch_min_explicitPU3AS1VU7_Atomicff12memory_order(float addrspace(1)*, float, i32) local_unnamed_addr #1
|
|
|
|
|
+; CHECK-LLVM-SPV: declare {{.*}}spir_func float @[[FLOAT_FUNC_NAME]](float
|
|
|
|
|
+
|
|
|
|
|
+; Function Attrs: convergent norecurse nounwind
|
|
|
|
|
+define dso_local spir_func void @test_double(double addrspace(1)* %a) local_unnamed_addr #0 {
|
|
|
|
|
+entry:
|
|
|
|
|
+ ; CHECK-SPIRV: 7 AtomicFMinEXT [[TYPE_FLOAT_64]]
|
|
|
|
|
+ ; CHECK-LLVM-CL20: call spir_func double @[[DOUBLE_FUNC_NAME:_Z25atomic_fetch_min_explicit[[:alnum:]]+_Atomicdd[a-zA-Z0-9_]+]]({{.*}})
|
|
|
|
|
+ ; CHECK-LLVM-SPV: call spir_func double @[[DOUBLE_FUNC_NAME:_Z21__spirv_AtomicFMinEXT[[:alnum:]]+diid]]({{.*}})
|
|
|
|
|
+ %call = tail call spir_func double @_Z25atomic_fetch_min_explicitPU3AS1VU7_Atomicdd12memory_order(double addrspace(1)* %a, double 0.000000e+00, i32 0) #2
|
|
|
|
|
+ ret void
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+; Function Attrs: convergent
|
|
|
|
|
+declare spir_func double @_Z25atomic_fetch_min_explicitPU3AS1VU7_Atomicdd12memory_order(double addrspace(1)*, double, i32) local_unnamed_addr #1
|
|
|
|
|
+; CHECK-LLVM-SPV: declare {{.*}}spir_func double @[[DOUBLE_FUNC_NAME]](double
|
|
|
|
|
+
|
|
|
|
|
+; CHECK-LLVM-CL: declare {{.*}}spir_func float @[[FLOAT_FUNC_NAME]](float
|
|
|
|
|
+; CHECK-LLVM-CL: declare {{.*}}spir_func double @[[DOUBLE_FUNC_NAME]](double
|
|
|
|
|
+
|
|
|
|
|
+attributes #0 = { convergent norecurse nounwind "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
|
|
|
|
|
+attributes #1 = { convergent "frame-pointer"="none" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
|
|
|
|
|
+attributes #2 = { convergent nounwind }
|
|
|
|
|
+
|
|
|
|
|
+!llvm.module.flags = !{!0}
|
|
|
|
|
+!opencl.ocl.version = !{!1}
|
|
|
|
|
+!opencl.spir.version = !{!1}
|
|
|
|
|
+!llvm.ident = !{!2}
|
|
|
|
|
+
|
|
|
|
|
+!0 = !{i32 1, !"wchar_size", i32 4}
|
|
|
|
|
+!1 = !{i32 2, i32 0}
|
|
|
|
|
+!2 = !{!"clang version 13.0.0 (https://github.com/llvm/llvm-project.git 94aa388f0ce0723bb15503cf41c2c15b288375b9)"}
|
|
|
|
|
diff --git a/test/InvalidAtomicBuiltins.cl b/test/InvalidAtomicBuiltins.cl
|
|
|
|
|
index b8ec5b89..2182f070 100644
|
|
|
|
|
--- a/test/InvalidAtomicBuiltins.cl
|
|
|
|
|
+++ b/test/InvalidAtomicBuiltins.cl
|
|
|
|
|
@@ -41,13 +41,9 @@ float __attribute__((overloadable)) atomic_fetch_xor(volatile generic atomic_flo
|
|
|
|
|
double __attribute__((overloadable)) atomic_fetch_and(volatile generic atomic_double *object, double operand, memory_order order);
|
|
|
|
|
double __attribute__((overloadable)) atomic_fetch_max(volatile generic atomic_double *object, double operand, memory_order order);
|
|
|
|
|
double __attribute__((overloadable)) atomic_fetch_min(volatile generic atomic_double *object, double operand, memory_order order);
|
|
|
|
|
-float __attribute__((overloadable)) atomic_fetch_add_explicit(volatile generic atomic_float *object, float operand, memory_order order);
|
|
|
|
|
-float __attribute__((overloadable)) atomic_fetch_sub_explicit(volatile generic atomic_float *object, float operand, memory_order order);
|
|
|
|
|
float __attribute__((overloadable)) atomic_fetch_or_explicit(volatile generic atomic_float *object, float operand, memory_order order);
|
|
|
|
|
float __attribute__((overloadable)) atomic_fetch_xor_explicit(volatile generic atomic_float *object, float operand, memory_order order);
|
|
|
|
|
double __attribute__((overloadable)) atomic_fetch_and_explicit(volatile generic atomic_double *object, double operand, memory_order order);
|
|
|
|
|
-double __attribute__((overloadable)) atomic_fetch_max_explicit(volatile generic atomic_double *object, double operand, memory_order order);
|
|
|
|
|
-double __attribute__((overloadable)) atomic_fetch_min_explicit(volatile generic atomic_double *object, double operand, memory_order order);
|
|
|
|
|
|
|
|
|
|
__kernel void test_atomic_fn(volatile __global float *p,
|
|
|
|
|
volatile __global double *pp,
|
|
|
|
|
@@ -86,11 +82,7 @@ __kernel void test_atomic_fn(volatile __global float *p,
|
|
|
|
|
d = atomic_fetch_and(pp, val, order);
|
|
|
|
|
d = atomic_fetch_min(pp, val, order);
|
|
|
|
|
d = atomic_fetch_max(pp, val, order);
|
|
|
|
|
- f = atomic_fetch_add_explicit(p, val, order);
|
|
|
|
|
- f = atomic_fetch_sub_explicit(p, val, order);
|
|
|
|
|
f = atomic_fetch_or_explicit(p, val, order);
|
|
|
|
|
f = atomic_fetch_xor_explicit(p, val, order);
|
|
|
|
|
d = atomic_fetch_and_explicit(pp, val, order);
|
|
|
|
|
- d = atomic_fetch_min_explicit(pp, val, order);
|
|
|
|
|
- d = atomic_fetch_max_explicit(pp, val, order);
|
|
|
|
|
}
|
|
|
|
|
--
|
|
|
|
|
2.17.1
|
|
|
|
|
|