summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Sotkin <alexey.sotkin@intel.com>2018-03-06 19:17:47 +0300
committerAlexey Sotkin <alexey.sotkin@intel.com>2018-04-03 17:17:38 +0300
commitcc3e0f0b690ec774a0522d22b7ceaf2a3702566b (patch)
tree6c25d3c21aba649050cb54cbecfe15dd8a83e34e
parent5d0e2816c2649937ad731f7b72d04311e7fa2e65 (diff)
Upgrade SPIRV translator from LLVM 4.0 to the curent SVN revision 327279
Change-Id: I10dc4476c2851a54434a47406fff0840da0b9951
-rw-r--r--lib/SPIRV/Mangler/Mangler.cpp2
-rw-r--r--lib/SPIRV/Mangler/ManglingUtils.cpp2
-rw-r--r--lib/SPIRV/Mangler/ManglingUtils.h2
-rw-r--r--lib/SPIRV/OCL20To12.cpp2
-rw-r--r--lib/SPIRV/OCL20ToSPIRV.cpp39
-rw-r--r--lib/SPIRV/OCL21ToSPIRV.cpp6
-rw-r--r--lib/SPIRV/OCLTypeToSPIRV.cpp4
-rw-r--r--lib/SPIRV/OCLUtil.cpp12
-rw-r--r--lib/SPIRV/OCLUtil.h6
-rw-r--r--lib/SPIRV/SPIRVInternal.h23
-rw-r--r--lib/SPIRV/SPIRVLowerConstExpr.cpp12
-rw-r--r--lib/SPIRV/SPIRVLowerMemmove.cpp24
-rw-r--r--lib/SPIRV/SPIRVLowerOCLBlocks.cpp14
-rw-r--r--lib/SPIRV/SPIRVReader.cpp160
-rw-r--r--lib/SPIRV/SPIRVToOCL20.cpp16
-rw-r--r--lib/SPIRV/SPIRVUtil.cpp41
-rw-r--r--lib/SPIRV/SPIRVWriter.cpp56
-rw-r--r--lib/SPIRV/SPIRVWriterPass.cpp2
-rw-r--r--lib/SPIRV/libSPIRV/SPIRVDecorate.cpp24
-rw-r--r--lib/SPIRV/libSPIRV/SPIRVEntry.h30
-rw-r--r--lib/SPIRV/libSPIRV/SPIRVInstruction.h11
-rw-r--r--lib/SPIRV/libSPIRV/SPIRVModule.cpp11
-rw-r--r--lib/SPIRV/libSPIRV/SPIRVUtil.h2
-rw-r--r--test/CreatePipeFromPipeStorage.ll16
-rw-r--r--test/OpFMod.spt4
-rw-r--r--test/OpLine.ll4
-rw-r--r--test/OpSwitch32.ll14
-rw-r--r--test/OpSwitch64.ll20
-rw-r--r--test/composite_construct_struct.spt4
-rw-r--r--test/composite_construct_vector.spt4
-rw-r--r--test/copy_object.spt2
-rw-r--r--test/half_extension.ll8
-rw-r--r--test/half_no_extension.ll10
-rw-r--r--test/layout.ll2
-rw-r--r--test/lifetime.ll28
-rw-r--r--test/memory_access.ll22
-rw-r--r--test/multi_md.ll2
-rw-r--r--test/transcoding/OpImageQuerySize.ll2
-rwxr-xr-xtest/transcoding/OpVariable_Initializer.ll2
-rw-r--r--test/transcoding/device_execution_multiple_blocks.ll2
-rw-r--r--test/transcoding/device_execution_vaargs.ll2
-rw-r--r--test/transcoding/extract_insert_value.ll18
-rw-r--r--test/transcoding/global-constant-expression.ll4
-rw-r--r--test/transcoding/llvm.memmove.ll8
-rw-r--r--test/transcoding/llvm.memset.ll2
-rw-r--r--test/unreachable.ll8
-rw-r--r--tools/llvm-spirv/llvm-spirv.cpp74
47 files changed, 353 insertions, 410 deletions
diff --git a/lib/SPIRV/Mangler/Mangler.cpp b/lib/SPIRV/Mangler/Mangler.cpp
index 5b891c8..18ffee7 100644
--- a/lib/SPIRV/Mangler/Mangler.cpp
+++ b/lib/SPIRV/Mangler/Mangler.cpp
@@ -193,7 +193,7 @@ private:
//
// NameMangler
//
- NameMangler::NameMangler(SPIRversion version):m_spir_version(version) {};
+ NameMangler::NameMangler(SPIRversion version):m_spir_version(version) {}
MangleError NameMangler::mangle(const FunctionDescriptor& fd, std::string& mangledName ) {
if (fd.isNull()) {
diff --git a/lib/SPIRV/Mangler/ManglingUtils.cpp b/lib/SPIRV/Mangler/ManglingUtils.cpp
index 4ee3fc2..2ecdcdc 100644
--- a/lib/SPIRV/Mangler/ManglingUtils.cpp
+++ b/lib/SPIRV/Mangler/ManglingUtils.cpp
@@ -175,7 +175,7 @@ namespace SPIR {
return readableAttribute[attribute];
}
- const SPIRversion getSupportedVersion(TypePrimitiveEnum t) {
+ SPIRversion getSupportedVersion(TypePrimitiveEnum t) {
return primitiveSupportedVersions[t];
}
diff --git a/lib/SPIRV/Mangler/ManglingUtils.h b/lib/SPIRV/Mangler/ManglingUtils.h
index 943ceac..96cf98f 100644
--- a/lib/SPIRV/Mangler/ManglingUtils.h
+++ b/lib/SPIRV/Mangler/ManglingUtils.h
@@ -23,7 +23,7 @@ namespace SPIR {
const char* getMangledAttribute(TypeAttributeEnum attribute);
const char* getReadableAttribute(TypeAttributeEnum attribute);
- const SPIRversion getSupportedVersion(TypePrimitiveEnum t);
+ SPIRversion getSupportedVersion(TypePrimitiveEnum t);
const char* getSPIRVersionAsString(SPIRversion version);
const char* mangledPrimitiveStringfromName(std::string type);
diff --git a/lib/SPIRV/OCL20To12.cpp b/lib/SPIRV/OCL20To12.cpp
index 1331cfc..1d94f24 100644
--- a/lib/SPIRV/OCL20To12.cpp
+++ b/lib/SPIRV/OCL20To12.cpp
@@ -122,7 +122,7 @@ void OCL20To12::visitCallAtomicWorkItemFence(CallInst* CI) {
report_fatal_error("OCL 2.0 builtin atomic_work_item_fence used in 1.2",
false);
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
mutateCallInstOCL(M, CI, [=](CallInst *, std::vector<Value *> &Args){
Args.resize(1);
Args[0] = getInt32(M, std::get<0>(Lit));
diff --git a/lib/SPIRV/OCL20ToSPIRV.cpp b/lib/SPIRV/OCL20ToSPIRV.cpp
index d786d73..c3e3eb6 100644
--- a/lib/SPIRV/OCL20ToSPIRV.cpp
+++ b/lib/SPIRV/OCL20ToSPIRV.cpp
@@ -138,7 +138,7 @@ public:
/// Transform atomic_compare_exchange call.
/// In atomic_compare_exchange, the expected value parameter is a pointer.
- /// However in SPIR-V it is a value. The transformation adds a load
+ /// However in SPIR-V it is a value. The transformation adds a load
/// instruction, result of which is passed to atomic_compare_exchange as
/// argument.
/// The transformation adds a store instruction after the call, to update the
@@ -542,7 +542,7 @@ OCL20ToSPIRV::visitCallNDRange(CallInst *CI,
// global work size
// local work size
// The arguments need to add missing members.
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
mutateCallInstSPIRV(M, CI, [=](CallInst *, std::vector<Value *> &Args){
for (size_t I = 1, E = Args.size(); I != E; ++I)
Args[I] = getScalarOrArray(Args[I], Len, CI);
@@ -581,7 +581,7 @@ OCL20ToSPIRV::visitCallNDRange(CallInst *CI,
void
OCL20ToSPIRV::visitCallAsyncWorkGroupCopy(CallInst* CI,
const std::string &DemangledName) {
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
mutateCallInstSPIRV(M, CI, [=](CallInst *, std::vector<Value *> &Args){
if (DemangledName == OCLUtil::kOCLBuiltinName::AsyncWorkGroupCopy) {
Args.insert(Args.begin()+3, addSizet(1));
@@ -594,7 +594,7 @@ OCL20ToSPIRV::visitCallAsyncWorkGroupCopy(CallInst* CI,
CallInst *
OCL20ToSPIRV::visitCallAtomicCmpXchg(CallInst* CI,
const std::string& DemangledName) {
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
Value *Expected = nullptr;
CallInst *NewCI = nullptr;
mutateCallInstOCL(M, CI, [&](CallInst * CI, std::vector<Value *> &Args,
@@ -628,7 +628,7 @@ OCL20ToSPIRV::visitCallAtomicInit(CallInst* CI) {
void
OCL20ToSPIRV::visitCallAllAny(spv::Op OC, CallInst* CI) {
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
auto Args = getArguments(CI);
assert(Args.size() == 1);
@@ -676,7 +676,7 @@ OCL20ToSPIRV::visitCallMemFence(CallInst* CI) {
void OCL20ToSPIRV::transMemoryBarrier(CallInst* CI,
AtomicWorkItemFenceLiterals Lit) {
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
mutateCallInstSPIRV(M, CI, [=](CallInst *, std::vector<Value *> &Args){
Args.resize(2);
Args[0] = addInt32(map<Scope>(std::get<2>(Lit)));
@@ -795,7 +795,7 @@ OCL20ToSPIRV::visitCallAtomicCpp11(CallInst* CI,
void
OCL20ToSPIRV::transAtomicBuiltin(CallInst* CI,
OCLBuiltinTransInfo& Info) {
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
mutateCallInstSPIRV(M, CI, [=](CallInst * CI, std::vector<Value *> &Args){
Info.PostProc(Args);
// Order of args in OCL20:
@@ -830,7 +830,7 @@ OCL20ToSPIRV::transAtomicBuiltin(CallInst* CI,
void
OCL20ToSPIRV::visitCallBarrier(CallInst* CI) {
auto Lit = getBarrierLiterals(CI);
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
mutateCallInstSPIRV(M, CI, [=](CallInst *, std::vector<Value *> &Args){
Args.resize(3);
Args[0] = addInt32(map<Scope>(std::get<2>(Lit)));
@@ -885,7 +885,7 @@ void OCL20ToSPIRV::visitCallConvert(CallInst* CI,
!(isa<IntegerType>(SrcTy) && IsTargetInt)) {
Rounding = DemangledName.substr(Loc, 4);
}
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
mutateCallInstSPIRV(M, CI, [=](CallInst *, std::vector<Value *> &Args){
return getSPIRVFuncName(OC, TargetTyName + Sat + Rounding);
}, &Attrs);
@@ -969,7 +969,7 @@ void OCL20ToSPIRV::visitCallGroupBuiltin(CallInst* CI,
void
OCL20ToSPIRV::transBuiltin(CallInst* CI,
OCLBuiltinTransInfo& Info) {
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
Op OC = OpNop;
unsigned ExtOp = ~0U;
if (StringRef(Info.UniqName).startswith(kSPIRVName::Prefix))
@@ -1024,7 +1024,7 @@ OCL20ToSPIRV::visitCallPipeBuiltin(CallInst* CI,
void OCL20ToSPIRV::visitCallReadImageMSAA(CallInst *CI, StringRef MangledName,
const std::string &DemangledName) {
assert(MangledName.find("msaa") != StringRef::npos);
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
mutateCallInstSPIRV(
M, CI,
[=](CallInst *, std::vector<Value *> &Args) {
@@ -1039,7 +1039,7 @@ void OCL20ToSPIRV::visitCallReadImageMSAA(CallInst *CI, StringRef MangledName,
void OCL20ToSPIRV::visitCallReadImageWithSampler(
CallInst *CI, StringRef MangledName, const std::string &DemangledName) {
assert (MangledName.find(kMangledName::Sampler) != StringRef::npos);
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
bool isRetScalar = !CI->getType()->isVectorTy();
mutateCallInstSPIRV(
M, CI,
@@ -1093,10 +1093,11 @@ void OCL20ToSPIRV::visitCallReadImageWithSampler(
void
OCL20ToSPIRV::visitCallGetImageSize(CallInst* CI,
StringRef MangledName, const std::string& DemangledName) {
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
StringRef TyName;
SmallVector<StringRef, 4> SubStrs;
auto IsImg = isOCLImageType(CI->getArgOperand(0)->getType(), &TyName);
+ (void)IsImg;
assert(IsImg);
std::string ImageTyName = TyName.str();
if (hasAccessQualifiedName(TyName))
@@ -1285,7 +1286,7 @@ OCL20ToSPIRV::visitCallToAddr(CallInst* CI, StringRef MangledName,
void OCL20ToSPIRV::visitCallRelational(CallInst *CI,
const std::string &DemangledName) {
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
Op OC = OpNop;
OCLSPIRVBuiltinMap::find(DemangledName, &OC);
std::string SPIRVName = getSPIRVFuncName(OC);
@@ -1368,7 +1369,7 @@ OCL20ToSPIRV::visitCallVecLoadStore(CallInst* CI,
void OCL20ToSPIRV::visitCallGetFence(CallInst *CI, StringRef MangledName,
const std::string &DemangledName) {
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
Op OC = OpNop;
OCLSPIRVBuiltinMap::find(DemangledName, &OC);
std::string SPIRVName = getSPIRVFuncName(OC);
@@ -1425,7 +1426,7 @@ void OCL20ToSPIRV::visitCallScalToVec(CallInst *CI, StringRef MangledName,
ScalarPos.push_back(1);
}
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
mutateCallInstSPIRV(
M, CI,
[=](CallInst *, std::vector<Value *> &Args) {
@@ -1454,7 +1455,7 @@ void OCL20ToSPIRV::visitCallScalToVec(CallInst *CI, StringRef MangledName,
void OCL20ToSPIRV::visitCallGetImageChannel(CallInst *CI, StringRef MangledName,
const std::string &DemangledName,
unsigned int Offset) {
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
Op OC = OpNop;
OCLSPIRVBuiltinMap::find(DemangledName, &OC);
std::string SPIRVName = getSPIRVFuncName(OC);
@@ -1490,7 +1491,7 @@ void OCL20ToSPIRV::visitSubgroupBlockReadINTEL(CallInst *CI, StringRef MangledNa
Info.Postfix += "_us";
else
Info.Postfix += "_ui";
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
mutateCallInstSPIRV(M, CI,
[=](CallInst *, std::vector<Value *> &Args) {
Info.PostProc(Args);
@@ -1520,7 +1521,7 @@ void OCL20ToSPIRV::visitSubgroupBlockWriteINTEL(CallInst *CI, StringRef MangledN
default: break;
}
}
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
mutateCallInstSPIRV(M, CI,
[=](CallInst *, std::vector<Value *> &Args) {
Info.PostProc(Args);
diff --git a/lib/SPIRV/OCL21ToSPIRV.cpp b/lib/SPIRV/OCL21ToSPIRV.cpp
index 85acae4..7b68351 100644
--- a/lib/SPIRV/OCL21ToSPIRV.cpp
+++ b/lib/SPIRV/OCL21ToSPIRV.cpp
@@ -178,7 +178,7 @@ OCL21ToSPIRV::visitCallInst(CallInst& CI) {
void OCL21ToSPIRV::visitCallConvert(CallInst* CI,
StringRef MangledName, Op OC) {
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
mutateCallInstSPIRV(M, CI, [=](CallInst *, std::vector<Value *> &Args){
Args.pop_back();
return getSPIRVFuncName(OC, kSPIRVPostfix::Divider +
@@ -209,7 +209,7 @@ void
OCL21ToSPIRV::visitCallSubGroupBarrier(CallInst *CI) {
DEBUG(dbgs() << "[visitCallSubGroupBarrier] "<< *CI << '\n');
auto Lit = getBarrierLiterals(CI);
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
mutateCallInstSPIRV(M, CI, [=](CallInst *, std::vector<Value *> &Args){
Args.resize(3);
Args[0] = addInt32(map<Scope>(std::get<2>(Lit)));
@@ -221,7 +221,7 @@ OCL21ToSPIRV::visitCallSubGroupBarrier(CallInst *CI) {
void
OCL21ToSPIRV::transBuiltin(CallInst* CI, Op OC) {
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
assert(OC != OpExtInst && "not supported");
mutateCallInstSPIRV(M, CI, [=](CallInst *, std::vector<Value *> &Args){
return getSPIRVFuncName(OC);
diff --git a/lib/SPIRV/OCLTypeToSPIRV.cpp b/lib/SPIRV/OCLTypeToSPIRV.cpp
index 5ebff5d..1f794a1 100644
--- a/lib/SPIRV/OCLTypeToSPIRV.cpp
+++ b/lib/SPIRV/OCLTypeToSPIRV.cpp
@@ -286,7 +286,7 @@ OCLTypeToSPIRV::adaptFunctionArguments(Function* F) {
auto FT = F->getFunctionType();
auto PI = FT->param_begin();
auto Arg = F->arg_begin();
- for (unsigned I = 0; I < F->getArgumentList().size(); ++I, ++PI, ++Arg) {
+ for (unsigned I = 0; I < F->arg_size(); ++I, ++PI, ++Arg) {
auto NewTy = *PI;
if (isPointerToOpaqueStructType(NewTy)) {
auto STName = NewTy->getPointerElementType()->getStructName();
@@ -296,7 +296,7 @@ OCLTypeToSPIRV::adaptFunctionArguments(Function* F) {
STName == kSPR2TypeName::Pipe) {
auto Ty = STName.str();
auto AccStr = getAccessQualifier(Ty);
- addAdaptedType(Arg, getOrCreateOpaquePtrType(M,
+ addAdaptedType(&*Arg, getOrCreateOpaquePtrType(M,
mapOCLTypeNameToSPIRV(Ty, AccStr)));
Changed = true;
}
diff --git a/lib/SPIRV/OCLUtil.cpp b/lib/SPIRV/OCLUtil.cpp
index 10a660c..0b9f7bf 100644
--- a/lib/SPIRV/OCLUtil.cpp
+++ b/lib/SPIRV/OCLUtil.cpp
@@ -472,7 +472,7 @@ public:
assert(F && "lack of necessary information");
// handle [read|write]pipe builtins (plus two i32 literal args
// required by SPIR 2.0 provisional specification):
- if (F->getArgumentList().size() == 6) {
+ if (F->arg_size() == 6) {
// with 4 arguments (plus two i32 literals):
// int read_pipe (read_only pipe gentype p, reserve_id_t reserve_id, uint index, gentype *ptr)
// int write_pipe (write_only pipe gentype p, reserve_id_t reserve_id, uint index, const gentype *ptr)
@@ -480,7 +480,7 @@ public:
addVoidPtrArg(3);
addUnsignedArg(4);
addUnsignedArg(5);
- } else if (F->getArgumentList().size() == 4) {
+ } else if (F->arg_size() == 4) {
// with 2 arguments (plus two i32 literals):
// int read_pipe (read_only pipe gentype p, gentype *ptr)
// int write_pipe (write_only pipe gentype p, const gentype *ptr)
@@ -536,7 +536,7 @@ Function * F; // SPIRV decorated function
CallInst *
mutateCallInstOCL(Module *M, CallInst *CI,
std::function<std::string (CallInst *, std::vector<Value *> &)>ArgMutate,
- AttributeSet *Attrs) {
+ AttributeList *Attrs) {
OCLBuiltinFuncMangleInfo BtnInfo(CI->getCalledFunction());
return mutateCallInst(M, CI, ArgMutate, &BtnInfo, Attrs);
}
@@ -546,7 +546,7 @@ mutateCallInstOCL(Module *M, CallInst *CI,
std::function<std::string (CallInst *, std::vector<Value *> &,
Type *&RetTy)> ArgMutate,
std::function<Instruction *(CallInst *)> RetMutate,
- AttributeSet *Attrs) {
+ AttributeList *Attrs) {
OCLBuiltinFuncMangleInfo BtnInfo(CI->getCalledFunction());
return mutateCallInst(M, CI, ArgMutate, RetMutate, &BtnInfo, Attrs);
}
@@ -554,7 +554,7 @@ mutateCallInstOCL(Module *M, CallInst *CI,
void
mutateFunctionOCL(Function *F,
std::function<std::string (CallInst *, std::vector<Value *> &)>ArgMutate,
- AttributeSet *Attrs) {
+ AttributeList *Attrs) {
OCLBuiltinFuncMangleInfo BtnInfo(F);
return mutateFunction(F, ArgMutate, &BtnInfo, Attrs, false);
}
@@ -585,7 +585,7 @@ isSamplerInitializer(Instruction *Inst) {
if (Names.second == getSPIRVTypeName(kSPIRVTypeName::Sampler) &&
Names.first == getSPIRVTypeName(kSPIRVTypeName::ConstantSampler))
return true;
-
+
return false;
}
diff --git a/lib/SPIRV/OCLUtil.h b/lib/SPIRV/OCLUtil.h
index 8a4e261..f9d5369 100644
--- a/lib/SPIRV/OCLUtil.h
+++ b/lib/SPIRV/OCLUtil.h
@@ -341,7 +341,7 @@ mapSPIRVMemOrderToOCL(unsigned Sema) {
CallInst *
mutateCallInstOCL(Module *M, CallInst *CI,
std::function<std::string (CallInst *, std::vector<Value *> &)>ArgMutate,
- AttributeSet *Attrs = nullptr);
+ AttributeList *Attrs = nullptr);
/// Mutate call instruction to call OpenCL builtin function.
Instruction *
@@ -349,13 +349,13 @@ mutateCallInstOCL(Module *M, CallInst *CI,
std::function<std::string (CallInst *, std::vector<Value *> &,
Type *&RetTy)> ArgMutate,
std::function<Instruction *(CallInst *)> RetMutate,
- AttributeSet *Attrs = nullptr);
+ AttributeList *Attrs = nullptr);
/// Mutate a function to OpenCL builtin function.
void
mutateFunctionOCL(Function *F,
std::function<std::string (CallInst *, std::vector<Value *> &)>ArgMutate,
- AttributeSet *Attrs = nullptr);
+ AttributeList *Attrs = nullptr);
/// Check if instruction is bitcast from spirv.ConstantSampler to spirv.Sampler
bool
diff --git a/lib/SPIRV/SPIRVInternal.h b/lib/SPIRV/SPIRVInternal.h
index 1bc7fe4..d29bda7 100644
--- a/lib/SPIRV/SPIRVInternal.h
+++ b/lib/SPIRV/SPIRVInternal.h
@@ -77,13 +77,6 @@ typedef SPIRVMap<std::string, Op, SPIRVOpaqueType>
#define SPCV_CAST "spcv.cast"
#define LLVM_MEMCPY "llvm.memcpy"
-namespace kOCLTypeQualifierName {
- const static char *Const = "const";
- const static char *Volatile = "volatile";
- const static char *Restrict = "restrict";
- const static char *Pipe = "pipe";
-}
-
template<> inline void
SPIRVMap<unsigned, Op>::init() {
#define _SPIRV_OP(x,y) add(Instruction::x, Op##y);
@@ -542,7 +535,7 @@ void getFunctionTypeParameterTypes(llvm::FunctionType* FT,
Function *getOrCreateFunction(Module *M, Type *RetTy,
ArrayRef<Type *> ArgTypes, StringRef Name,
BuiltinFuncMangleInfo *Mangle = nullptr,
- AttributeSet *Attrs = nullptr, bool takeName = true);
+ AttributeList *Attrs = nullptr, bool takeName = true);
/// Get function call arguments.
/// \param Start Starting index.
@@ -641,7 +634,7 @@ bool hasArrayArg(Function *F);
/// \return mutated call instruction.
CallInst *mutateCallInst(Module *M, CallInst *CI,
std::function<std::string (CallInst *, std::vector<Value *> &)>ArgMutate,
- BuiltinFuncMangleInfo *Mangle = nullptr, AttributeSet *Attrs = nullptr,
+ BuiltinFuncMangleInfo *Mangle = nullptr, AttributeList *Attrs = nullptr,
bool takeName = false);
/// Mutates function call instruction by changing the arguments and return
@@ -653,14 +646,14 @@ Instruction *mutateCallInst(Module *M, CallInst *CI,
std::function<std::string (CallInst *, std::vector<Value *> &,
Type *&RetTy)> ArgMutate,
std::function<Instruction *(CallInst *)> RetMutate,
- BuiltinFuncMangleInfo *Mangle = nullptr, AttributeSet *Attrs = nullptr,
+ BuiltinFuncMangleInfo *Mangle = nullptr, AttributeList *Attrs = nullptr,
bool takeName = false);
/// Mutate call instruction to call SPIR-V builtin function.
CallInst *
mutateCallInstSPIRV(Module *M, CallInst *CI,
std::function<std::string (CallInst *, std::vector<Value *> &)>ArgMutate,
- AttributeSet *Attrs = nullptr);
+ AttributeList *Attrs = nullptr);
/// Mutate call instruction to call SPIR-V builtin function.
Instruction *
@@ -668,7 +661,7 @@ mutateCallInstSPIRV(Module *M, CallInst *CI,
std::function<std::string (CallInst *, std::vector<Value *> &,
Type *&RetTy)> ArgMutate,
std::function<Instruction *(CallInst *)> RetMutate,
- AttributeSet *Attrs = nullptr);
+ AttributeList *Attrs = nullptr);
/// Mutate function by change the arguments.
/// \param ArgMutate mutates the function arguments.
@@ -676,12 +669,12 @@ mutateCallInstSPIRV(Module *M, CallInst *CI,
/// different type needs to be created.
void mutateFunction(Function *F,
std::function<std::string (CallInst *, std::vector<Value *> &)>ArgMutate,
- BuiltinFuncMangleInfo *Mangle = nullptr, AttributeSet *Attrs = nullptr,
+ BuiltinFuncMangleInfo *Mangle = nullptr, AttributeList *Attrs = nullptr,
bool TakeName = true);
/// Add a call instruction at \p Pos.
CallInst *addCallInst(Module *M, StringRef FuncName, Type *RetTy,
- ArrayRef<Value *> Args, AttributeSet *Attrs, Instruction *Pos,
+ ArrayRef<Value *> Args, AttributeList *Attrs, Instruction *Pos,
BuiltinFuncMangleInfo *Mangle = nullptr,
StringRef InstName = SPIR_TEMP_NAME_PREFIX_CALL,
bool TakeFuncName = true);
@@ -690,7 +683,7 @@ CallInst *addCallInst(Module *M, StringRef FuncName, Type *RetTy,
CallInst *
addCallInstSPIRV(Module *M, StringRef FuncName, Type *RetTy,
ArrayRef<Value *> Args,
- AttributeSet *Attrs, Instruction *Pos, StringRef InstName);
+ AttributeList *Attrs, Instruction *Pos, StringRef InstName);
/// Add a call of spir_block_bind function.
CallInst *
diff --git a/lib/SPIRV/SPIRVLowerConstExpr.cpp b/lib/SPIRV/SPIRVLowerConstExpr.cpp
index 9ed1fa9..17569f6 100644
--- a/lib/SPIRV/SPIRVLowerConstExpr.cpp
+++ b/lib/SPIRV/SPIRVLowerConstExpr.cpp
@@ -114,15 +114,15 @@ SPIRVLowerConstExpr::runOnModule(Module& Module) {
void
SPIRVLowerConstExpr::visit(Module *M) {
- for (auto I = M->begin(), E = M->end(); I != E; ++I) {
+ for (auto &I : M->functions()) {
std::map<ConstantExpr*, Instruction *> CMap;
std::list<Instruction *> WorkList;
- auto FBegin = I->begin();
- for (auto &BI:*I) {
- for (auto &II:BI) {
+ for (auto &BI : I) {
+ for (auto &II : BI) {
WorkList.push_back(&II);
}
}
+ auto FBegin = I.begin();
while (!WorkList.empty()) {
auto II = WorkList.front();
WorkList.pop_front();
@@ -132,7 +132,7 @@ SPIRVLowerConstExpr::visit(Module *M) {
if (auto CE = dyn_cast<ConstantExpr>(Op)) {
SPIRVDBG(dbgs() << "[lowerConstantExpressions] " << *CE;)
auto ReplInst = CE->getAsInstruction();
- auto InsPoint = II->getParent() == FBegin ? II : &FBegin->back();
+ auto InsPoint = II->getParent() == &*FBegin ? II : &FBegin->back();
ReplInst->insertBefore(InsPoint);
SPIRVDBG(dbgs() << " -> " << *ReplInst << '\n';)
WorkList.push_front(ReplInst);
@@ -143,7 +143,7 @@ SPIRVLowerConstExpr::visit(Module *M) {
*U << '\n';)
if (auto InstUser = dyn_cast<Instruction>(U)) {
// Only replace users in scope of current function
- if (InstUser->getParent()->getParent() == I)
+ if (InstUser->getParent()->getParent() == &I)
Users.push_back(InstUser);
}
}
diff --git a/lib/SPIRV/SPIRVLowerMemmove.cpp b/lib/SPIRV/SPIRVLowerMemmove.cpp
index cd9056c..8f4154a 100644
--- a/lib/SPIRV/SPIRVLowerMemmove.cpp
+++ b/lib/SPIRV/SPIRVLowerMemmove.cpp
@@ -54,7 +54,7 @@ using namespace SPIRV;
namespace SPIRV {
cl::opt<bool> SPIRVLowerMemmoveValidate("spvmemmove-validate",
- cl::desc("Validate module after lowering llvm.memmove instructions into "
+ cl::desc("Validate module after lowering llvm.memmove instructions into "
"llvm.memcpy"));
class SPIRVLowerMemmove: public ModulePass,
@@ -69,13 +69,13 @@ public:
auto *Dest = I.getRawDest();
auto *Src = I.getRawSource();
auto *SrcTy = Src->getType();
- if (!isa<ConstantInt>(I.getLength()))
- // ToDo: for non-constant length, could use a loop to copy a
+ if (!isa<ConstantInt>(I.getLength()))
+ // ToDo: for non-constant length, could use a loop to copy a
// fixed length chunk at a time. For now simply fail
- report_fatal_error("llvm.memmove of non-constant length not supported",
+ report_fatal_error("llvm.memmove of non-constant length not supported",
false);
auto *Length = cast<ConstantInt>(I.getLength());
- if (isa<BitCastInst>(Src))
+ if (isa<BitCastInst>(Src))
// The source could be bit-cast from another type,
// need the original type for the allocation of the temporary variable
SrcTy = cast<BitCastInst>(Src)->getOperand(0)->getType();
@@ -87,18 +87,18 @@ public:
NumElements = Builder.getInt32(SrcTy->getArrayNumElements());
ElementsCount = SrcTy->getArrayNumElements();
}
- if (Mod->getDataLayout()->getTypeSizeInBits(SrcTy->getPointerElementType())
+ if (Mod->getDataLayout().getTypeSizeInBits(SrcTy->getPointerElementType())
* ElementsCount != Length->getZExtValue() * 8)
- report_fatal_error("Size of the memcpy should match the allocated memory",
+ report_fatal_error("Size of the memcpy should match the allocated memory",
false);
- auto *Alloca = Builder.CreateAlloca(SrcTy->getPointerElementType(),
+ auto *Alloca = Builder.CreateAlloca(SrcTy->getPointerElementType(),
NumElements);
- auto *LifetimeStart = Builder.CreateLifetimeStart(Alloca);
- auto *FirstCpy = Builder.CreateMemCpy(Alloca, Src, Length, Align, Volatile);
- auto *SecondCpy = Builder.CreateMemCpy(Dest, Alloca, Length, Align,
+ Builder.CreateLifetimeStart(Alloca);
+ Builder.CreateMemCpy(Alloca, Src, Length, Align, Volatile);
+ auto *SecondCpy = Builder.CreateMemCpy(Dest, Alloca, Length, Align,
Volatile);
- auto *LifetimeEnd = Builder.CreateLifetimeEnd(Alloca);
+ Builder.CreateLifetimeEnd(Alloca);
SecondCpy->takeName(&I);
I.replaceAllUsesWith(SecondCpy);
diff --git a/lib/SPIRV/SPIRVLowerOCLBlocks.cpp b/lib/SPIRV/SPIRVLowerOCLBlocks.cpp
index b4106a6..55fea33 100644
--- a/lib/SPIRV/SPIRVLowerOCLBlocks.cpp
+++ b/lib/SPIRV/SPIRVLowerOCLBlocks.cpp
@@ -51,7 +51,7 @@
#include "llvm/Analysis/AssumptionCache.h"
#include "llvm/Analysis/CallGraph.h"
#include "llvm/IR/Verifier.h"
-#include "llvm/Bitcode/ReaderWriter.h"
+#include "llvm/Bitcode/BitcodeWriter.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
@@ -352,14 +352,17 @@ private:
DEBUG(dbgs() << "[lowerReturnBlock] inline " << F->getName() << '\n');
auto CG = &getAnalysis<CallGraphWrapperPass>().getCallGraph();
auto ACT = &getAnalysis<AssumptionCacheTracker>();
- InlineFunctionInfo IFI(CG, ACT);
+ std::function<AssumptionCache &(Function &)> GetAssumptionCache = [&](
+ Function &F) -> AssumptionCache & { return ACT->getAssumptionCache(F); };
+ InlineFunctionInfo IFI(CG, &GetAssumptionCache);
InlineFunction(CI, IFI);
Inlined = true;
}
return changed || Inlined;
}
- /// Looking for a global variables initialized by opencl.block*. If found, check
+ /// Looking for a global variables initialized by opencl.block*. If found,
+ /// check
/// its users. If users are trivially dead, erase them. If the global variable
/// has no users left after that, erase it too.
void EraseUselessGlobalVars() {
@@ -459,9 +462,8 @@ private:
ValueToValueMapTy VMap;
// If any of the arguments to the function are in the VMap,
// the arguments are deleted from the resultant function.
- VMap[FirstArg] = llvm::UndefValue::get(FirstArg->getType());
- Function *NF = CloneFunction(&F, VMap, true);
- F.getParent()->getFunctionList().insert(F, NF);
+ VMap[&*FirstArg] = llvm::UndefValue::get(FirstArg->getType());
+ Function *NF = CloneFunction(&F, VMap);
NF->takeName(&F);
// Redirect all users of the old function to the new one.
diff --git a/lib/SPIRV/SPIRVReader.cpp b/lib/SPIRV/SPIRVReader.cpp
index 808ea58..2391b83 100644
--- a/lib/SPIRV/SPIRVReader.cpp
+++ b/lib/SPIRV/SPIRVReader.cpp
@@ -51,22 +51,22 @@
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/IR/Constants.h"
-#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/DIBuilder.h"
+#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
+#include "llvm/IR/LegacyPassManager.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Operator.h"
#include "llvm/IR/Type.h"
-#include "llvm/IR/LegacyPassManager.h"
#include "llvm/Support/Casting.h"
+#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
-#include "llvm/Support/Dwarf.h"
+#include "llvm/BinaryFormat/Dwarf.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/raw_ostream.h"
-#include "llvm/Support/CommandLine.h"
#include <algorithm>
#include <cstdlib>
@@ -103,10 +103,17 @@ cl::opt<bool> SPIRVGenImgTypeAccQualPostfix("spirv-gen-image-type-acc-postfix",
const char* kPlaceholderPrefix = "placeholder.";
// Save the translated LLVM before validation for debugging purpose.
-static bool DbgSaveTmpLLVM = true;
+static bool DbgSaveTmpLLVM = false;
static const char *DbgTmpLLVMFileName = "_tmp_llvmbil.ll";
-typedef std::pair < unsigned, AttributeSet > AttributeWithIndex;
+namespace kOCLTypeQualifierName {
+ const static char *Const = "const";
+ const static char *Volatile = "volatile";
+ const static char *Restrict = "restrict";
+ const static char *Pipe = "pipe";
+}
+
+typedef std::pair < unsigned, AttributeList > AttributeWithIndex;
static bool
isOpenCLKernel(SPIRVFunction *BF) {
@@ -141,14 +148,6 @@ getMDTwoInt(LLVMContext *Context, unsigned Int1, unsigned Int2) {
return MDNode::get(*Context, ValueVec);
}
-static MDNode*
-getMDString(LLVMContext *Context, const std::string& Str) {
- std::vector<Metadata*> ValueVec;
- if (!Str.empty())
- ValueVec.push_back(MDString::get(*Context, Str));
- return MDNode::get(*Context, ValueVec);
-}
-
static void
addOCLVersionMetadata(LLVMContext *Context, Module *M,
const std::string &MDName, unsigned Major, unsigned Minor) {
@@ -193,7 +192,7 @@ public:
std::string Path;
splitFileName(File, BaseName, Path);
Builder.createCompileUnit(dwarf::DW_LANG_C99,
- BaseName, Path, "spirv", false, "", 0, "", DIBuilder::LineTablesOnly);
+ Builder.createFile(BaseName, Path), "spirv", false, "", 0, "", DICompileUnit::LineTablesOnly);
}
void addDbgInfoVersion() {
@@ -908,9 +907,8 @@ SPIRVToLLVM::setLLVMLoopMetadata(SPIRVLoopMerge* LM, BranchInst* BI) {
return;
llvm::MDString *Name = nullptr;
auto Temp = MDNode::getTemporary(*Context, None);
- auto Self = MDNode::get(*Context, Temp);
+ auto Self = MDNode::get(*Context, Temp.get());
Self->replaceOperandWith(0, Self);
- MDNode::deleteTemporary(Temp);
if (LM->getLoopControl() == LoopControlMaskNone) {
BI->setMetadata("llvm.loop", Self);
@@ -1121,8 +1119,8 @@ SPIRVToLLVM::postProcessOCLBuiltinWithArrayArguments(Function* F,
auto T = I->getType();
if (!T->isArrayTy())
continue;
- auto Alloca = new AllocaInst(T, "", &(*FBegin));
- auto Store = new StoreInst(I, Alloca, false, CI);
+ auto Alloca = new AllocaInst(T, 0, "", &(*FBegin));
+ new StoreInst(I, Alloca, false, CI);
auto Zero = ConstantInt::getNullValue(Type::getInt32Ty(T->getContext()));
Value *Index[] = {Zero, Zero};
I = GetElementPtrInst::CreateInBounds(Alloca, Index, "", CI);
@@ -1136,7 +1134,7 @@ SPIRVToLLVM::postProcessOCLBuiltinWithArrayArguments(Function* F,
Instruction *
SPIRVToLLVM::postProcessOCLReadImage(SPIRVInstruction *BI, CallInst* CI,
const std::string &FuncName) {
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
StringRef ImageTypeName;
bool isDepthImage = false;
if (isOCLImageType(
@@ -1188,7 +1186,7 @@ SPIRVToLLVM::postProcessOCLReadImage(SPIRVInstruction *BI, CallInst* CI,
CallInst*
SPIRVToLLVM::postProcessOCLWriteImage(SPIRVInstruction *BI, CallInst *CI,
const std::string &DemangledName) {
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
return mutateCallInstOCL(M, CI, [=](CallInst *, std::vector<Value *> &Args) {
llvm::Type *T = Args[2]->getType();
if (Args.size() > 4) {
@@ -1224,7 +1222,7 @@ SPIRVToLLVM::postProcessOCLBuildNDRange(SPIRVInstruction *BI, CallInst *CI,
Instruction *
SPIRVToLLVM::postProcessGroupAllAny(CallInst *CI,
const std::string &DemangledName) {
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
return mutateCallInstSPIRV(
M, CI,
[=](CallInst *, std::vector<Value *> &Args, llvm::Type *&RetTy) {
@@ -1244,7 +1242,7 @@ SPIRVToLLVM::postProcessGroupAllAny(CallInst *CI,
CallInst *
SPIRVToLLVM::expandOCLBuiltinWithScalarArg(CallInst* CI,
const std::string &FuncName) {
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
if (!CI->getOperand(0)->getType()->isVectorTy() &&
CI->getOperand(1)->getType()->isVectorTy()) {
return mutateCallInstOCL(M, CI, [=](CallInst *, std::vector<Value *> &Args){
@@ -1351,13 +1349,13 @@ SPIRVToLLVM::transValueWithoutDecoration(SPIRVValue *BV, Function *F,
const llvm::fltSemantics *FS = nullptr;
switch (BT->getFloatBitWidth()) {
case 16:
- FS = &APFloat::IEEEhalf;
+ FS = &APFloat::IEEEhalf();
break;
case 32:
- FS = &APFloat::IEEEsingle;
+ FS = &APFloat::IEEEsingle();
break;
case 64:
- FS = &APFloat::IEEEdouble;
+ FS = &APFloat::IEEEdouble();
break;
default:
llvm_unreachable("invalid float type");
@@ -1457,13 +1455,15 @@ SPIRVToLLVM::transValueWithoutDecoration(SPIRVValue *BV, Function *F,
SPIRVStorageClassKind BS = BVar->getStorageClass();
if (BS == StorageClassFunction && !Init) {
assert (BB && "Invalid BB");
- return mapValue(BV, new AllocaInst(Ty, BV->getName(), BB));
+ return mapValue(BV, new AllocaInst(Ty, 0, BV->getName(), BB));
}
auto AddrSpace = SPIRSPIRVAddrSpaceMap::rmap(BS);
auto LVar = new GlobalVariable(*M, Ty, IsConst, LinkageTy, Initializer,
BV->getName(), 0, GlobalVariable::NotThreadLocal, AddrSpace);
- LVar->setUnnamedAddr(IsConst && Ty->isArrayTy() &&
- Ty->getArrayElementType()->isIntegerTy(8));
+ LVar->setUnnamedAddr((IsConst && Ty->isArrayTy() &&
+ Ty->getArrayElementType()->isIntegerTy(8))
+ ? GlobalValue::UnnamedAddr::Global
+ : GlobalValue::UnnamedAddr::None);
SPIRVBuiltinVariableKind BVKind;
if (BVar->isBuiltin(&BVKind))
BuiltinGVMap[LVar] = BVKind;
@@ -1613,21 +1613,13 @@ SPIRVToLLVM::transValueWithoutDecoration(SPIRVValue *BV, Function *F,
case OpCopyMemorySized: {
SPIRVCopyMemorySized *BC = static_cast<SPIRVCopyMemorySized *>(BV);
- std::string FuncName = "llvm.memcpy";
- SPIRVType* BS = BC->getSource()->getType();
- SPIRVType* BT = BC->getTarget()->getType();
- Type *Int1Ty = Type::getInt1Ty(*Context);
- Type* Int32Ty = Type::getInt32Ty(*Context);
- Type* VoidTy = Type::getVoidTy(*Context);
- Type* SrcTy = transType(BS);
- Type* TrgTy = transType(BT);
- Type* SizeTy = transType(BC->getSize()->getType());
-
- ostringstream TempName;
- TempName << ".p"
- << SPIRSPIRVAddrSpaceMap::rmap(BT->getPointerStorageClass())
- << "i8";
- Value *Src = nullptr;
+ CallInst *CI = nullptr;
+ llvm::Value *Dst = transValue(BC->getTarget(), F, BB);
+ unsigned Align = BC->getAlignment();
+ llvm::Value *Size = transValue(BC->getSize(), F, BB);
+ bool isVolatile = BC->SPIRVMemoryAccess::isVolatile();
+ IRBuilder<> Builder(BB);
+
// If we copy from zero-initialized array, we can optimize it to llvm.memset
if (BC->getSource()->getOpCode() == OpBitcast) {
SPIRVValue *Source =
@@ -1638,44 +1630,21 @@ SPIRVToLLVM::transValueWithoutDecoration(SPIRVValue *BV, Function *F,
SPIRVType *Ty = static_cast<SPIRVConstantNull*>(Init)->getType();
if (isa<OpTypeArray>(Ty)) {
SPIRVTypeArray *AT = static_cast<SPIRVTypeArray*>(Ty);
- SrcTy = transType(AT->getArrayElementType());
+ Type *SrcTy = transType(AT->getArrayElementType());
assert(SrcTy->isIntegerTy(8));
- Src = ConstantInt::get(SrcTy, 0);
- FuncName = "llvm.memset";
+ llvm::Value *Src = ConstantInt::get(SrcTy, 0);
+ CI = Builder.CreateMemSet(Dst, Src, Size, Align, isVolatile);
}
}
}
}
- if (!Src) {
- Src = transValue(BC->getSource(), F, BB);
- TempName << ".p"
- << SPIRSPIRVAddrSpaceMap::rmap(BS->getPointerStorageClass())
- << "i8";
+ if (!CI) {
+ llvm::Value *Src = transValue(BC->getSource(), F, BB);
+ CI = Builder.CreateMemCpy(Dst, Align, Src, Align, Size, isVolatile);
}
- Type* ArgTy[] = { TrgTy, SrcTy, SizeTy, Int32Ty, Int1Ty };
-
- FuncName += TempName.str();
- if (BC->getSize()->getType()->getBitWidth() == 32)
- FuncName += ".i32";
- else
- FuncName += ".i64";
-
- FunctionType *FT = FunctionType::get(VoidTy, ArgTy, false);
- Function *Func = dyn_cast<Function>(M->getOrInsertFunction(FuncName, FT));
- assert(Func && Func->getFunctionType() == FT && "Function type mismatch");
- Func->setLinkage(GlobalValue::ExternalLinkage);
-
if (isFuncNoUnwind())
- Func->addFnAttr(Attribute::NoUnwind);
-
- Value *Arg[] = { transValue(BC->getTarget(), Func, BB), Src,
- dyn_cast<llvm::ConstantInt>(transValue(BC->getSize(),
- Func, BB)),
- ConstantInt::get(Int32Ty,
- BC->SPIRVMemoryAccess::getAlignment()),
- ConstantInt::get(Int1Ty,
- BC->SPIRVMemoryAccess::isVolatile())};
- return mapValue( BV, CallInst::Create(Func, Arg, "", BB));
+ CI->getFunction()->addFnAttr(Attribute::NoUnwind);
+ return mapValue(BV, CI);
}
case OpSelect: {
@@ -1727,8 +1696,8 @@ SPIRVToLLVM::transValueWithoutDecoration(SPIRVValue *BV, Function *F,
case OpCopyObject: {
SPIRVCopyObject *CO = static_cast<SPIRVCopyObject *>(BV);
- AllocaInst* AI = new AllocaInst(transType(CO->getOperand()->getType()), "", BB);
- StoreInst* SI = new StoreInst(transValue(CO->getOperand(), F, BB), AI, BB);
+ AllocaInst* AI = new AllocaInst(transType(CO->getOperand()->getType()), 0, "", BB);
+ new StoreInst(transValue(CO->getOperand(), F, BB), AI, BB);
LoadInst* LI = new LoadInst(AI, "", BB);
return mapValue(BV, LI);
}
@@ -1771,6 +1740,8 @@ SPIRVToLLVM::transValueWithoutDecoration(SPIRVValue *BV, Function *F,
case OpTypeStruct:
return mapValue(BV, ConstantStruct::get(
dyn_cast<StructType>(transType(CC->getType())), CV));
+ default:
+ llvm_unreachable("Unhandled type!");
}
}
@@ -2014,13 +1985,13 @@ SPIRVToLLVM::transFunction(SPIRVFunction *BF) {
if (BA->hasDecorate(DecorationMaxByteOffset, 0, &MaxOffset)) {
AttrBuilder Builder;
Builder.addDereferenceableAttr(MaxOffset);
- I->addAttr(AttributeSet::get(*Context, I->getArgNo() + 1, Builder));
+ I->addAttrs(Builder);
}
}
BF->foreachReturnValueAttr([&](SPIRVFuncParamAttrKind Kind){
if (Kind == FunctionParameterAttributeNoWrite)
return;
- F->addAttribute(AttributeSet::ReturnIndex,
+ F->addAttribute(AttributeList::ReturnIndex,
SPIRSPIRVFuncParamAttrMap::rmap(Kind));
});
@@ -2240,25 +2211,9 @@ SPIRVToLLVM::transEnqueuedBlock(SPIRVValue *SInvoke, SPIRVValue *SCaptured,
// We can't make any guesses about type of captured data, so
// let's copy it through memcpy
- std::string MemCpyName = "llvm.memcpy.p0i8.p0i8";
- MemCpyName += (LCaptSize->getType()->getBitWidth() == 32) ? ".i32" : ".i64";
- SmallVector<Type*, 8> MemCpyArgTys = {
- Int8PtrTy, Int8PtrTy, // src and dst pointers
- LCaptSize->getType(), // size
- Int32Ty, // alignment
- Type::getInt1Ty(*Context) // isVolatile
- };
-
- FunctionType *MemCpyTy =
- FunctionType::get(Type::getVoidTy(*Context), MemCpyArgTys, false);
- Function *MemCpy =
- dyn_cast<Function>(M->getOrInsertFunction(MemCpyName, MemCpyTy));
- assert(MemCpy && "Can't create memcpy intrinsic");
- MemCpy->setLinkage(GlobalValue::ExternalLinkage);
- SmallVector<Value*, 8> MemCpyArgs =
- { CapturedGEPCast, LCaptured, LCaptSize, LCaptAlignment,
- ConstantInt::get(Type::getInt1Ty(*Context), SCaptured->isVolatile()) };
- Builder.CreateCall(MemCpy, MemCpyArgs);
+ Builder.CreateMemCpy(CapturedGEPCast, LCaptAlignment->getZExtValue(),
+ LCaptured, LCaptAlignment->getZExtValue(), LCaptSize,
+ SCaptured->isVolatile());
// Fix invoke function to correctly process its first argument
adaptBlockInvoke(LInvoke, BlockTy);
@@ -2490,6 +2445,7 @@ SPIRVToLLVM::transSPIRVBuiltinFromInst(SPIRVInstruction *BI, BasicBlock *BB) {
"Invalid type of CreatePipeFromStorage");
auto PipeType = static_cast<SPIRVTypePipe*>(CPFPS->getType());
switch (PipeType->getAccessQualifier()) {
+ default:
case AccessQualifierReadOnly: Suffix = "_read"; break;
case AccessQualifierWriteOnly: Suffix = "_write"; break;
case AccessQualifierReadWrite: Suffix = "_read_write"; break;
@@ -2761,13 +2717,13 @@ SPIRVToLLVM::transOCLBuiltinFromExtInst(SPIRVExtInst *BC, BasicBlock *BB) {
assert(BB && "Invalid BB");
std::string MangledName;
SPIRVWord EntryPoint = BC->getExtOp();
- SPIRVExtInstSetKind Set = BM->getBuiltinSet(BC->getExtSetId());
bool IsVarArg = false;
bool IsPrintf = false;
std::string UnmangledName;
auto BArgs = BC->getArguments();
- assert (Set == SPIRVEIS_OpenCL && "Not OpenCL extended instruction");
+ assert(BM->getBuiltinSet(BC->getExtSetId()) == SPIRVEIS_OpenCL &&
+ "Not OpenCL extended instruction");
if (EntryPoint == OpenCLLIB::Printf)
IsPrintf = true;
else {
@@ -3076,7 +3032,7 @@ SPIRVToLLVM::transLinkageType(const SPIRVValue* V) {
Instruction *SPIRVToLLVM::transOCLAllAny(SPIRVInstruction *I, BasicBlock *BB) {
CallInst *CI = cast<CallInst>(transSPIRVBuiltinFromInst(I, BB));
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
return cast<Instruction>(mapValue(
I, mutateCallInstOCL(
M, CI,
@@ -3100,7 +3056,7 @@ Instruction *SPIRVToLLVM::transOCLAllAny(SPIRVInstruction *I, BasicBlock *BB) {
Instruction *SPIRVToLLVM::transOCLRelational(SPIRVInstruction *I, BasicBlock *BB) {
CallInst *CI = cast<CallInst>(transSPIRVBuiltinFromInst(I, BB));
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
return cast<Instruction>(mapValue(
I, mutateCallInstOCL(
M, CI,
diff --git a/lib/SPIRV/SPIRVToOCL20.cpp b/lib/SPIRV/SPIRVToOCL20.cpp
index 9fe3632..6094cbd 100644
--- a/lib/SPIRV/SPIRVToOCL20.cpp
+++ b/lib/SPIRV/SPIRVToOCL20.cpp
@@ -197,7 +197,7 @@ SPIRVToOCL20::visitCallInst(CallInst& CI) {
}
void SPIRVToOCL20::visitCallSPIRVMemoryBarrier(CallInst* CI) {
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
mutateCallInstOCL(M, CI, [=](CallInst *, std::vector<Value *> &Args){
auto getArg = [=](unsigned I){
return cast<ConstantInt>(Args[I])->getZExtValue();
@@ -238,7 +238,7 @@ void SPIRVToOCL20::visitCallSPRIVImageQuerySize(CallInst *CI) {
imgArray = true;
}
- AttributeSet attributes = CI->getCalledFunction()->getAttributes();
+ AttributeList attributes = CI->getCalledFunction()->getAttributes();
BuiltinFuncMangleInfo mangle;
Type * int32Ty = Type::getInt32Ty(*Ctx);
Instruction * getImageSize = nullptr;
@@ -333,7 +333,7 @@ void SPIRVToOCL20::visitCallSPRIVImageQuerySize(CallInst *CI) {
}
void SPIRVToOCL20::visitCallSPIRVAtomicBuiltin(CallInst* CI, Op OC) {
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
Instruction * pInsertBefore = CI;
mutateCallInstOCL(M, CI, [=](CallInst *, std::vector<Value *> &Args, Type *& RetTy){
@@ -369,7 +369,7 @@ void SPIRVToOCL20::visitCallSPIRVAtomicBuiltin(CallInst* CI, Op OC) {
// OCL built-ins returns boolean value and stores a new/original
// value by pointer passed as 2nd argument (aka expected) while SPIR-V
// instructions returns this new/original value as a resulting value.
- AllocaInst *pExpected = new AllocaInst(CI->getType(), "expected",
+ AllocaInst *pExpected = new AllocaInst(CI->getType(), 0, "expected",
&(*pInsertBefore->getParent()->getParent()->getEntryBlock().getFirstInsertionPt()));
pExpected->setAlignment(CI->getType()->getScalarSizeInBits() / 8);
new StoreInst(Args[1], pExpected, pInsertBefore);
@@ -397,7 +397,7 @@ void SPIRVToOCL20::visitCallSPIRVAtomicBuiltin(CallInst* CI, Op OC) {
}
void SPIRVToOCL20::visitCallSPIRVBuiltin(CallInst* CI, Op OC) {
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
mutateCallInstOCL(M, CI, [=](CallInst *, std::vector<Value *> &Args){
return OCLSPIRVBuiltinMap::rmap(OC);
}, &Attrs);
@@ -422,7 +422,7 @@ void SPIRVToOCL20::visitCallSPIRVGroupBuiltin(CallInst* CI, Op OC) {
DemangledName = Prefix + kSPIRVName::GroupPrefix +
SPIRSPIRVGroupOperationMap::rmap(GO) + '_' + Op.str();
}
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
mutateCallInstOCL(M, CI, [=](CallInst *, std::vector<Value *> &Args){
Args.erase(Args.begin(), Args.begin() + (HasGroupOperation ? 2 : 1));
if (OC == OpGroupBroadcast)
@@ -449,7 +449,7 @@ void SPIRVToOCL20::visitCallSPIRVPipeBuiltin(CallInst* CI, Op OC) {
if (HasScope)
DemangledName = getGroupBuiltinPrefix(CI) + DemangledName;
- AttributeSet Attrs = CI->getCalledFunction()->getAttributes();
+ AttributeList Attrs = CI->getCalledFunction()->getAttributes();
mutateCallInstOCL(M, CI, [=](CallInst *, std::vector<Value *> &Args){
if (HasScope)
Args.erase(Args.begin(), Args.begin() + 1);
@@ -537,7 +537,7 @@ void SPIRVToOCL20::visitCastInst(CastInst &Cast) {
if(isa<ZExtInst>(Cast) || isa<UIToFPInst>(Cast))
mangle.addUnsignedArg(0);
- AttributeSet attributes;
+ AttributeList attributes;
CallInst *call = addCallInst(M, castBuiltInName, dstVecTy, Cast.getOperand(0),
&attributes, &Cast, &mangle, Cast.getName(), false);
Cast.replaceAllUsesWith(call);
diff --git a/lib/SPIRV/SPIRVUtil.cpp b/lib/SPIRV/SPIRVUtil.cpp
index d420044..332315b 100644
--- a/lib/SPIRV/SPIRVUtil.cpp
+++ b/lib/SPIRV/SPIRVUtil.cpp
@@ -49,7 +49,7 @@
#include "OCLUtil.h"
#include "llvm/ADT/StringSwitch.h"
-#include "llvm/Bitcode/ReaderWriter.h"
+#include "llvm/Bitcode/BitcodeWriter.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
@@ -81,13 +81,12 @@ EnableDbgOutput("spirv-debug",
void
addFnAttr(LLVMContext *Context, CallInst *Call, Attribute::AttrKind Attr) {
- Call->addAttribute(AttributeSet::FunctionIndex, Attr);
+ Call->addAttribute(AttributeList::FunctionIndex, Attr);
}
void
removeFnAttr(LLVMContext *Context, CallInst *Call, Attribute::AttrKind Attr) {
- Call->removeAttribute(AttributeSet::FunctionIndex,
- Attribute::get(*Context, Attr));
+ Call->removeAttribute(AttributeList::FunctionIndex, Attr);
}
Value *
@@ -104,13 +103,13 @@ removeCast(Value *V) {
void
saveLLVMModule(Module *M, const std::string &OutputFile) {
std::error_code EC;
- tool_output_file Out(OutputFile.c_str(), EC, sys::fs::F_None);
+ ToolOutputFile Out(OutputFile.c_str(), EC, sys::fs::F_None);
if (EC) {
SPIRVDBG(errs() << "Fails to open output file: " << EC.message();)
return;
}
- WriteBitcodeToFile(M, Out.os());
+ WriteBitcodeToFile(*M, Out.os());
Out.keep();
}
@@ -302,7 +301,7 @@ isSPIRVType(llvm::Type* Ty, StringRef BaseTyName, StringRef *Postfix) {
Function *
getOrCreateFunction(Module *M, Type *RetTy, ArrayRef<Type *> ArgTypes,
- StringRef Name, BuiltinFuncMangleInfo *Mangle, AttributeSet *Attrs,
+ StringRef Name, BuiltinFuncMangleInfo *Mangle, AttributeList *Attrs,
bool takeName) {
std::string MangledName = Name;
bool isVarArg = false;
@@ -645,7 +644,7 @@ hasArrayArg(Function *F) {
CallInst *
mutateCallInst(Module *M, CallInst *CI,
std::function<std::string (CallInst *, std::vector<Value *> &)>ArgMutate,
- BuiltinFuncMangleInfo *Mangle, AttributeSet *Attrs, bool TakeFuncName) {
+ BuiltinFuncMangleInfo *Mangle, AttributeList *Attrs, bool TakeFuncName) {
DEBUG(dbgs() << "[mutateCallInst] " << *CI);
auto Args = getArguments(CI);
@@ -668,7 +667,7 @@ mutateCallInst(Module *M, CallInst *CI,
std::function<std::string (CallInst *, std::vector<Value *> &,
Type *&RetTy)>ArgMutate,
std::function<Instruction *(CallInst *)> RetMutate,
- BuiltinFuncMangleInfo *Mangle, AttributeSet *Attrs, bool TakeFuncName) {
+ BuiltinFuncMangleInfo *Mangle, AttributeList *Attrs, bool TakeFuncName) {
DEBUG(dbgs() << "[mutateCallInst] " << *CI);
auto Args = getArguments(CI);
@@ -692,7 +691,7 @@ mutateCallInst(Module *M, CallInst *CI,
void
mutateFunction(Function *F,
std::function<std::string (CallInst *, std::vector<Value *> &)>ArgMutate,
- BuiltinFuncMangleInfo *Mangle, AttributeSet *Attrs,
+ BuiltinFuncMangleInfo *Mangle, AttributeList *Attrs,
bool TakeFuncName) {
auto M = F->getParent();
for (auto I = F->user_begin(), E = F->user_end(); I != E;) {
@@ -706,7 +705,7 @@ mutateFunction(Function *F,
CallInst *
mutateCallInstSPIRV(Module *M, CallInst *CI,
std::function<std::string (CallInst *, std::vector<Value *> &)>ArgMutate,
- AttributeSet *Attrs) {
+ AttributeList *Attrs) {
BuiltinFuncMangleInfo BtnInfo;
return mutateCallInst(M, CI, ArgMutate, &BtnInfo, Attrs);
}
@@ -716,14 +715,14 @@ mutateCallInstSPIRV(Module *M, CallInst *CI,
std::function<std::string (CallInst *, std::vector<Value *> &,
Type *&RetTy)> ArgMutate,
std::function<Instruction *(CallInst *)> RetMutate,
- AttributeSet *Attrs) {
+ AttributeList *Attrs) {
BuiltinFuncMangleInfo BtnInfo;
return mutateCallInst(M, CI, ArgMutate, RetMutate, &BtnInfo, Attrs);
}
CallInst *
addCallInst(Module *M, StringRef FuncName, Type *RetTy, ArrayRef<Value *> Args,
- AttributeSet *Attrs, Instruction *Pos, BuiltinFuncMangleInfo *Mangle,
+ AttributeList *Attrs, Instruction *Pos, BuiltinFuncMangleInfo *Mangle,
StringRef InstName, bool TakeFuncName) {
auto F = getOrCreateFunction(M, RetTy, getTypes(Args),
@@ -736,7 +735,7 @@ addCallInst(Module *M, StringRef FuncName, Type *RetTy, ArrayRef<Value *> Args,
CallInst *
addCallInstSPIRV(Module *M, StringRef FuncName, Type *RetTy, ArrayRef<Value *> Args,
- AttributeSet *Attrs, Instruction *Pos, StringRef InstName) {
+ AttributeList *Attrs, Instruction *Pos, StringRef InstName) {
BuiltinFuncMangleInfo BtnInfo;
return addCallInst(M, FuncName, RetTy, Args, Attrs, Pos, &BtnInfo,
InstName);
@@ -1060,8 +1059,8 @@ transTypeDesc(Type *Ty, const BuiltinArgTypeMangleInfo &Info) {
if (Ty->isPointerTy()) {
auto ET = Ty->getPointerElementType();
SPIR::ParamType *EPT = nullptr;
- if (auto FT = dyn_cast<FunctionType>(ET)) {
- assert(isVoidFuncTy(FT) && "Not supported");
+ if (isa<FunctionType>(ET)) {
+ assert(isVoidFuncTy(cast<FunctionType>(ET)) && "Not supported");
EPT = new SPIR::BlockType;
} else if (auto StructTy = dyn_cast<StructType>(ET)) {
DEBUG(dbgs() << "ptr to struct: " << *Ty << '\n');
@@ -1134,10 +1133,8 @@ getScalarOrArray(Value *V, unsigned Size, Instruction *Pos) {
assert(GEP->getNumOperands() == 3 && "must be a GEP from an array");
auto P = GEP->getOperand(0);
assert(P->getType()->getPointerElementType()->getArrayNumElements() == Size);
- auto Index0 = GEP->getOperand(1);
- assert(dyn_cast<ConstantInt>(Index0)->getZExtValue() == 0);
- auto Index1 = GEP->getOperand(2);
- assert(dyn_cast<ConstantInt>(Index1)->getZExtValue() == 0);
+ assert(dyn_cast<ConstantInt>(GEP->getOperand(1))->getZExtValue() == 0);
+ assert(dyn_cast<ConstantInt>(GEP->getOperand(2))->getZExtValue() == 0);
return new LoadInst(P, "", Pos);
}
@@ -1166,7 +1163,7 @@ getScalarOrArrayConstantInt(Instruction *Pos, Type *T, unsigned Len, uint64_t V,
auto AT = ArrayType::get(ET, Len);
std::vector<Constant *> EV(Len, ConstantInt::get(ET, V, isSigned));
auto CA = ConstantArray::get(AT, EV);
- auto Alloca = new AllocaInst(AT, "", Pos);
+ auto Alloca = new AllocaInst(AT, 0, "", Pos);
new StoreInst(CA, Alloca, Pos);
auto Zero = ConstantInt::getNullValue(Type::getInt32Ty(T->getContext()));
Value *Index[] = {Zero, Zero};
@@ -1208,7 +1205,7 @@ getSPIRVTypeName(StringRef BaseName, StringRef Postfixes) {
bool
isSPIRVConstantName(StringRef TyName) {
- if (TyName == getSPIRVTypeName(kSPIRVTypeName::ConstantSampler) ||
+ if (TyName == getSPIRVTypeName(kSPIRVTypeName::ConstantSampler) ||
TyName == getSPIRVTypeName(kSPIRVTypeName::ConstantPipeStorage))
return true;
diff --git a/lib/SPIRV/SPIRVWriter.cpp b/lib/SPIRV/SPIRVWriter.cpp
index 127262d..c4a2541 100644
--- a/lib/SPIRV/SPIRVWriter.cpp
+++ b/lib/SPIRV/SPIRVWriter.cpp
@@ -57,7 +57,7 @@
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/Triple.h"
-#include "llvm/Bitcode/ReaderWriter.h"
+#include "llvm/Bitcode/BitcodeWriter.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/DebugInfo.h"
@@ -137,10 +137,10 @@ public:
auto DL = I->getDebugLoc();
if (DL) {
auto File = BM->getString(DL->getFilename().str());
- BM->addLine(BV, File, DL->getLine(), DL->getColumn());
+ BM->addLine(BV, File->getId(), DL->getLine(), DL->getColumn());
}
} else if (auto F = dyn_cast<Function>(V)) {
- if (auto DIS = getDISubprogram(F)) {
+ if (auto DIS = F->getSubprogram()) {
auto File = BM->getString(DIS->getFilename().str());
BM->addLine(BV, File->getId(), DIS->getLine(), 0);
}
@@ -165,7 +165,7 @@ public:
DbgTran(nullptr, SMod){
}
- virtual const char* getPassName() const {
+ virtual StringRef getPassName() const {
return "LLVMToSPIRV";
}
@@ -411,7 +411,7 @@ static bool recursiveType(const StructType *ST, const Type *Ty) {
SmallPtrSet<const StructType *, 4> Seen;
std::function<bool(const Type *Ty)> Run = [&](const Type *Ty) {
- if (!isa<CompositeType>(Ty))
+ if (!isa<CompositeType>(Ty) && !Ty->isPointerTy())
return false;
if (auto *StructTy = dyn_cast<StructType>(Ty)) {
@@ -423,8 +423,8 @@ static bool recursiveType(const StructType *ST, const Type *Ty) {
Seen.insert(StructTy);
- return find_if(StructTy->subtype_begin(), StructTy->subtype_end(), Run) !=
- StructTy->subtype_end();
+ return find_if(StructTy->element_begin(), StructTy->element_end(), Run) !=
+ StructTy->element_end();
}
if (auto *PtrTy = dyn_cast<PointerType>(Ty))
@@ -531,6 +531,7 @@ LLVMToSPIRV::transType(Type *T) {
if (T->isStructTy() && !T->isSized()) {
auto ST = dyn_cast<StructType>(T);
+ (void)ST; // Silence warning
assert(!ST->getName().startswith(kSPR2TypeName::Pipe));
assert(!ST->getName().startswith(kSPR2TypeName::ImagePrefix));
return mapType(T, BM->addOpaqueType(T->getStructName()));
@@ -555,7 +556,7 @@ LLVMToSPIRV::transType(Type *T) {
for (unsigned I = 0, E = T->getStructNumElements(); I != E; ++I) {
auto *ElemTy = ST->getElementType(I);
- if (isa<CompositeType>(ElemTy) && recursiveType(ST, ElemTy))
+ if ((isa<CompositeType>(ElemTy) || isa<PointerType>(ElemTy)) && recursiveType(ST, ElemTy))
ForwardRefs.push_back(I);
else
Struct->setMemberType(I, transType(ST->getElementType(I)));
@@ -573,7 +574,8 @@ LLVMToSPIRV::transType(Type *T) {
SPIRVType *RT = transType(FT->getReturnType());
std::vector<SPIRVType *> PT;
for (FunctionType::param_iterator I = FT->param_begin(),
- E = FT->param_end(); I != E; ++I)
+ E = FT->param_end();
+ I != E; ++I)
PT.push_back(transType(*I));
return mapType(T, BM->addFunctionType(RT, PT));
}
@@ -586,21 +588,20 @@ SPIRVType *
LLVMToSPIRV::transSPIRVOpaqueType(Type *T) {
auto ET = T->getPointerElementType();
auto ST = cast<StructType>(ET);
- auto AddrSpc = T->getPointerAddressSpace();
auto STName = ST->getStructName();
assert (STName.startswith(kSPIRVTypeName::PrefixAndDelim) &&
"Invalid SPIR-V opaque type name");
SmallVector<std::string, 8> Postfixes;
auto TN = decodeSPIRVTypeName(STName, Postfixes);
if (TN == kSPIRVTypeName::Pipe) {
- assert(AddrSpc == SPIRAS_Global);
+ assert(T->getPointerAddressSpace() == SPIRAS_Global);
assert(Postfixes.size() == 1 && "Invalid pipe type ops");
auto PipeT = BM->addPipeType();
PipeT->setPipeAcessQualifier(static_cast<spv::AccessQualifier>(
atoi(Postfixes[0].c_str())));
return mapType(T, PipeT);
} else if (TN == kSPIRVTypeName::Image) {
- assert(AddrSpc == SPIRAS_Global);
+ assert(T->getPointerAddressSpace() == SPIRAS_Global);
// The sampled type needs to be translated through LLVM type to guarantee
// uniqueness.
auto SampledT = transType(getLLVMTypeForSPIRVImageSampledTypePostfix(
@@ -679,9 +680,9 @@ LLVMToSPIRV::transFunctionDecl(Function *F) {
Attrs.getAttribute(ArgNo + 1, Attribute::Dereferenceable)
.getDereferenceableBytes());
}
- if (Attrs.hasAttribute(AttributeSet::ReturnIndex, Attribute::ZExt))
+ if (Attrs.hasAttribute(AttributeList::ReturnIndex, Attribute::ZExt))
BF->addDecorate(DecorationFuncParamAttr, FunctionParameterAttributeZext);
- if (Attrs.hasAttribute(AttributeSet::ReturnIndex, Attribute::SExt))
+ if (Attrs.hasAttribute(AttributeList::ReturnIndex, Attribute::SExt))
BF->addDecorate(DecorationFuncParamAttr, FunctionParameterAttributeSext);
DbgTran.transDbgInfo(F, BF);
SPIRVDBG(dbgs() << "[transFunction] " << *F << " => ";
@@ -844,8 +845,10 @@ LLVMToSPIRV::transLifetimeIntrinsicInst(Op OC, IntrinsicInst *II, SPIRVBasicBloc
auto Op1 = II->getOperand(1);
if (auto AI = dyn_cast<AllocaInst>(Op1)) {
- assert(!Size ||
- M->getDataLayout()->getTypeSizeInBits(AI->getAllocatedType()) == Size * 8 &&
+ (void)AI;
+ assert((!Size ||
+ M->getDataLayout().getTypeSizeInBits(AI->getAllocatedType()) ==
+ (uint64_t)(Size * 8)) &&
"Size of the argument should match the allocated memory");
return BM->addLifetimeInst(OC, transValue(Op1, BB), Size, BB);
}
@@ -853,13 +856,15 @@ LLVMToSPIRV::transLifetimeIntrinsicInst(Op OC, IntrinsicInst *II, SPIRVBasicBloc
assert(isa<BitCastInst>(Op1));
for (const auto &U : Op1->users()) {
auto BCU = dyn_cast<IntrinsicInst>(U);
+ (void)BCU;
assert(BCU && (BCU->getIntrinsicID() == Intrinsic::lifetime_start ||
BCU->getIntrinsicID() == Intrinsic::lifetime_end) &&
"The only users of this bitcast instruction are lifetime intrinsics");
}
auto AI = dyn_cast<AllocaInst>(dyn_cast<BitCastInst>(Op1)->getOperand(0));
assert(AI && (!Size ||
- M->getDataLayout()->getTypeSizeInBits(AI->getAllocatedType()) == Size * 8) &&
+ M->getDataLayout().getTypeSizeInBits(AI->getAllocatedType()) ==
+ (uint64_t)(Size * 8)) &&
"Size of the argument should match the allocated memory");
auto LT = BM->addLifetimeInst(OC, transValue(AI, BB), Size, BB);
auto BC = LT->getPrevious();
@@ -1003,7 +1008,7 @@ LLVMToSPIRV::transValueWithoutDecoration(Value *V, SPIRVBasicBlock *BB,
return mapValue(V, BI);
}
- if (auto U = dyn_cast<UnreachableInst>(V))
+ if (dyn_cast<UnreachableInst>(V))
return mapValue(V, BM->addUnreachableInst(BB));
if (auto RI = dyn_cast<ReturnInst>(V)) {
@@ -1035,11 +1040,9 @@ LLVMToSPIRV::transValueWithoutDecoration(Value *V, SPIRVBasicBlock *BB,
std::vector<SPIRVSwitch::PairTy> Pairs;
auto Select = transValue(Switch->getCondition(), BB);
- unsigned BitWidth = Select->getType()->getBitWidth();
-
for (auto I = Switch->case_begin(), E = Switch->case_end(); I != E; ++I) {
SPIRVSwitch::LiteralTy Lit;
- uint64_t CaseValue = I.getCaseValue()->getZExtValue();
+ uint64_t CaseValue = I->getCaseValue()->getZExtValue();
Lit.push_back(CaseValue);
assert(Select->getType()->getBitWidth() <= 64 && "unexpected selector bitwidth");
@@ -1047,7 +1050,7 @@ LLVMToSPIRV::transValueWithoutDecoration(Value *V, SPIRVBasicBlock *BB,
Lit.push_back(CaseValue >> 32);
Pairs.push_back(std::make_pair(Lit,
- static_cast<SPIRVBasicBlock*>(transValue(I.getCaseSuccessor(),
+ static_cast<SPIRVBasicBlock*>(transValue(I->getCaseSuccessor(),
nullptr))));
}
@@ -1192,9 +1195,10 @@ LLVMToSPIRV::transAlign(Value *V, SPIRVValue *BV) {
bool
LLVMToSPIRV::transBuiltinSet() {
SPIRVWord Ver = 0;
- SourceLanguage Kind = BM->getSourceLanguage(&Ver);
- assert((Kind == SourceLanguageOpenCL_C ||
- Kind == SourceLanguageOpenCL_CPP ) && "not supported");
+ (void)Ver;
+ assert((BM->getSourceLanguage(&Ver) == SourceLanguageOpenCL_C ||
+ BM->getSourceLanguage(&Ver) == SourceLanguageOpenCL_CPP) &&
+ "not supported");
std::stringstream SS;
SS << "OpenCL.std";
return BM->importBuiltinSet(SS.str(), &ExtSetId);
@@ -1455,7 +1459,7 @@ LLVMToSPIRV::mutateFuncArgType(const std::map<unsigned, Type*>& ChangedType,
if (OrigTy == I.second)
continue;
SPIRVDBG(dbgs() << "[mutate arg type] " << *Call << ", " << *Arg << '\n');
- auto CastF = M->getOrInsertFunction(SPCV_CAST, I.second, OrigTy, nullptr);
+ auto CastF = M->getOrInsertFunction(SPCV_CAST, I.second, OrigTy);
std::vector<Value *> Args;
Args.push_back(Arg);
auto Cast = CallInst::Create(CastF, Args, "", Call);
diff --git a/lib/SPIRV/SPIRVWriterPass.cpp b/lib/SPIRV/SPIRVWriterPass.cpp
index c5c2095..7a65dae 100644
--- a/lib/SPIRV/SPIRVWriterPass.cpp
+++ b/lib/SPIRV/SPIRVWriterPass.cpp
@@ -33,7 +33,7 @@ namespace {
explicit WriteSPIRVPass(raw_ostream &o)
: ModulePass(ID), OS(o) {}
- const char *getPassName() const override { return "SPIRV Writer"; }
+ StringRef getPassName() const override { return "SPIRV Writer"; }
bool runOnModule(Module &M) override {
// FIXME: at the moment LLVM/SPIR-V translation errors are ignored.
diff --git a/lib/SPIRV/libSPIRV/SPIRVDecorate.cpp b/lib/SPIRV/libSPIRV/SPIRVDecorate.cpp
index 087efbf..b02c007 100644
--- a/lib/SPIRV/libSPIRV/SPIRVDecorate.cpp
+++ b/lib/SPIRV/libSPIRV/SPIRVDecorate.cpp
@@ -52,22 +52,22 @@ operator<< (spv_ostream &O, const std::multiset<T *, B>& V) {
}
SPIRVDecorateGeneric::SPIRVDecorateGeneric(Op OC, SPIRVWord WC,
- Decoration TheDec,
- SPIRVEntry *TheTarget)
- : SPIRVAnnotationGeneric(TheTarget->getModule(), WC, OC,
- TheTarget->getId()),
- Dec(TheDec), Owner(nullptr) {
+ Decoration TheDec,
+ SPIRVEntry *TheTarget)
+ : SPIRVAnnotationGeneric(TheTarget->getModule(), WC, OC,
+ TheTarget->getId()),
+ Dec(TheDec), Owner(nullptr) {
validate();
updateModuleVersion();
}
SPIRVDecorateGeneric::SPIRVDecorateGeneric(Op OC, SPIRVWord WC,
- Decoration TheDec,
- SPIRVEntry *TheTarget,
- SPIRVWord V)
- : SPIRVAnnotationGeneric(TheTarget->getModule(), WC, OC,
- TheTarget->getId()),
- Dec(TheDec), Owner(nullptr) {
+ Decoration TheDec,
+ SPIRVEntry *TheTarget,
+ SPIRVWord V)
+ : SPIRVAnnotationGeneric(TheTarget->getModule(), WC, OC,
+ TheTarget->getId()),
+ Dec(TheDec), Owner(nullptr) {
Literals.push_back(V);
validate();
updateModuleVersion();
@@ -84,7 +84,7 @@ SPIRVDecorateGeneric::getDecorateKind()const {
SPIRVWord
SPIRVDecorateGeneric::getLiteral(size_t i) const {
- assert(i <= Literals.size() && "Out of bounds");
+ assert(i <= Literals.size() && "Out of bounds");
return Literals[i];
}
diff --git a/lib/SPIRV/libSPIRV/SPIRVEntry.h b/lib/SPIRV/libSPIRV/SPIRVEntry.h
index b994bf1..6a935d7 100644
--- a/lib/SPIRV/libSPIRV/SPIRVEntry.h
+++ b/lib/SPIRV/libSPIRV/SPIRVEntry.h
@@ -705,9 +705,9 @@ bool isa(SPIRVEntry *E) {
// to be implemented.
// Each time a new class is implemented, remove the corresponding typedef.
// This is also an indication of how much work is left.
-#define _SPIRV_OP(x, ...) typedef SPIRVEntryOpCodeOnly<Op##x> SPIRV##x;
+#define _SPIRV_OP(x) typedef SPIRVEntryOpCodeOnly<Op##x> SPIRV##x;
_SPIRV_OP(Nop)
-_SPIRV_OP(SourceContinued, 2)
+_SPIRV_OP(SourceContinued)
_SPIRV_OP(TypeMatrix)
_SPIRV_OP(TypeRuntimeArray)
_SPIRV_OP(SpecConstantTrue)
@@ -757,19 +757,19 @@ _SPIRV_OP(EndPrimitive)
_SPIRV_OP(EmitStreamVertex)
_SPIRV_OP(EndStreamPrimitive)
_SPIRV_OP(Kill)
-_SPIRV_OP(ImageSparseSampleImplicitLod, 305)
-_SPIRV_OP(ImageSparseSampleExplicitLod, 306)
-_SPIRV_OP(ImageSparseSampleDrefImplicitLod, 307)
-_SPIRV_OP(ImageSparseSampleDrefExplicitLod, 308)
-_SPIRV_OP(ImageSparseSampleProjImplicitLod, 309)
-_SPIRV_OP(ImageSparseSampleProjExplicitLod, 310)
-_SPIRV_OP(ImageSparseSampleProjDrefImplicitLod, 311)
-_SPIRV_OP(ImageSparseSampleProjDrefExplicitLod, 312)
-_SPIRV_OP(ImageSparseFetch, 313)
-_SPIRV_OP(ImageSparseGather, 314)
-_SPIRV_OP(ImageSparseDrefGather, 315)
-_SPIRV_OP(ImageSparseTexelsResident, 316)
-_SPIRV_OP(NoLine, 317)
+_SPIRV_OP(ImageSparseSampleImplicitLod)
+_SPIRV_OP(ImageSparseSampleExplicitLod)
+_SPIRV_OP(ImageSparseSampleDrefImplicitLod)
+_SPIRV_OP(ImageSparseSampleDrefExplicitLod)
+_SPIRV_OP(ImageSparseSampleProjImplicitLod)
+_SPIRV_OP(ImageSparseSampleProjExplicitLod)
+_SPIRV_OP(ImageSparseSampleProjDrefImplicitLod)
+_SPIRV_OP(ImageSparseSampleProjDrefExplicitLod)
+_SPIRV_OP(ImageSparseFetch)
+_SPIRV_OP(ImageSparseGather)
+_SPIRV_OP(ImageSparseDrefGather)
+_SPIRV_OP(ImageSparseTexelsResident)
+_SPIRV_OP(NoLine)
_SPIRV_OP(TypeNamedBarrier)
_SPIRV_OP(NamedBarrierInitialize)
_SPIRV_OP(MemoryNamedBarrier)
diff --git a/lib/SPIRV/libSPIRV/SPIRVInstruction.h b/lib/SPIRV/libSPIRV/SPIRVInstruction.h
index ae5d778..b82cb4a 100644
--- a/lib/SPIRV/libSPIRV/SPIRVInstruction.h
+++ b/lib/SPIRV/libSPIRV/SPIRVInstruction.h
@@ -629,6 +629,8 @@ protected:
op2Ty = getValueType(Op2);
}
+ (void)op1Ty;
+ (void)op2Ty;
if (isBinaryOpCode(OpCode)) {
assert(getValueType(Op1)== getValueType(Op2) &&
"Invalid type for binary instruction");
@@ -899,6 +901,9 @@ protected:
if (getValue(Op1)->isForward() || getValue(Op2)->isForward())
return;
+ (void)op1Ty;
+ (void)op2Ty;
+ (void)resTy;
if (getValueType(Op1)->isTypeVector()) {
op1Ty = getValueType(Op1)->getVectorComponentType();
op2Ty = getValueType(Op2)->getVectorComponentType();
@@ -979,6 +984,7 @@ protected:
SPIRVType *conTy = getValueType(Condition)->isTypeVector() ?
getValueType(Condition)->getVectorComponentType() :
getValueType(Condition);
+ (void)conTy;
assert(conTy->isTypeBool() && "Invalid type");
assert(getType() == getValueType(Op1) && getType() == getValueType(Op2) &&
"Inconsistent type");
@@ -1223,6 +1229,8 @@ protected:
SPIRVType *opTy = Type->isTypeVector() ?
getValueType(Op)->getVectorComponentType() : getValueType(Op);
+ (void)resTy;
+ (void)opTy;
assert(getType() == getValueType(Op) &&
"Inconsistent type");
assert((resTy->isTypeInt() || resTy->isTypeFloat()) &&
@@ -1800,8 +1808,7 @@ protected:
getValue(Vector2)->isForward())
return;
assert(getValueType(Vector1) == getValueType(Vector2));
- size_t CompCount = Type->getVectorComponentCount();
- assert(Components.size() == CompCount);
+ assert(Components.size() == Type->getVectorComponentCount());
assert(Components.size() > 1);
}
SPIRVId Vector1;
diff --git a/lib/SPIRV/libSPIRV/SPIRVModule.cpp b/lib/SPIRV/libSPIRV/SPIRVModule.cpp
index b1887c0..33dfeb4 100644
--- a/lib/SPIRV/libSPIRV/SPIRVModule.cpp
+++ b/lib/SPIRV/libSPIRV/SPIRVModule.cpp
@@ -562,9 +562,10 @@ SPIRVModuleImpl::addEntry(SPIRVEntry *Entry) {
}
}
if (ValidateCapability) {
- for (auto &I:Entry->getRequiredCapability()) {
- assert(CapMap.count(I));
- }
+ assert(none_of(
+ Entry->getRequiredCapability().begin(),
+ Entry->getRequiredCapability().end(),
+ [this](SPIRVCapabilityKind &val) { return !CapMap.count(val); }));
}
return Entry;
}
@@ -844,8 +845,8 @@ const SPIRVDecorateGeneric *
SPIRVModuleImpl::addDecorate(SPIRVDecorateGeneric *Dec) {
add(Dec);
SPIRVId Id = Dec->getTargetId();
- SPIRVEntry *Target = nullptr;
- bool Found = exist(Id, &Target);
+ bool Found = exist(Id);
+ (void)Found;
assert (Found && "Decorate target does not exist");
if (!Dec->getOwner())
DecorateSet.insert(Dec);
diff --git a/lib/SPIRV/libSPIRV/SPIRVUtil.h b/lib/SPIRV/libSPIRV/SPIRVUtil.h
index 2cfeebb..0e7d875 100644
--- a/lib/SPIRV/libSPIRV/SPIRVUtil.h
+++ b/lib/SPIRV/libSPIRV/SPIRVUtil.h
@@ -89,6 +89,7 @@ public:
static Ty2 map(Ty1 Key) {
Ty2 Val;
bool Found = find(Key, &Val);
+ (void)Found;
assert (Found && "Invalid key");
return Val;
}
@@ -96,6 +97,7 @@ public:
static Ty1 rmap(Ty2 Key) {
Ty1 Val;
bool Found = rfind(Key, &Val);
+ (void)Found;
assert (Found && "Invalid key");
return Val;
}
diff --git a/test/CreatePipeFromPipeStorage.ll b/test/CreatePipeFromPipeStorage.ll
index 98a3486..af280e8 100644
--- a/test/CreatePipeFromPipeStorage.ll
+++ b/test/CreatePipeFromPipeStorage.ll
@@ -63,16 +63,16 @@ entry:
; CHECK-LLVM: %[[ID0:[0-9]+]] = addrspacecast %"[[CL_PIPE_STORAGE_NAME]]" addrspace(1)* @mygpipe to %"[[CL_PIPE_STORAGE_NAME]]" addrspace(4)*
- ; CHECK-LLVM: %[[ID1:[0-9]+]] = getelementptr %"[[CL_PIPE_STORAGE_NAME]]" addrspace(4)* %[[ID0]], i32 0, i32 0
+ ; CHECK-LLVM: %[[ID1:[0-9]+]] = getelementptr %"[[CL_PIPE_STORAGE_NAME]]", %"[[CL_PIPE_STORAGE_NAME]]" addrspace(4)* %[[ID0]], i32 0, i32 0
; CHECK-SPIRV: PtrCastToGeneric {{[0-9]+}} [[SPIRV0:[0-9]+]] [[PIPE_STORAGE_ID]]
; CHECK-SPIRV: PtrAccessChain {{[0-9]+}} [[SPIRV1:[0-9]+]] [[SPIRV0]] [[CONSTANT_ZERO_ID]] [[CONSTANT_ZERO_ID]]
%0 = addrspacecast %"class.cl::pipe_storage<int __attribute__((ext_vector_type(4))), 1>" addrspace(1)* @mygpipe to %"class.cl::pipe_storage<int __attribute__((ext_vector_type(4))), 1>" addrspace(4)*
- %1 = getelementptr %"class.cl::pipe_storage<int __attribute__((ext_vector_type(4))), 1>" addrspace(4)* %0, i32 0, i32 0
+ %1 = getelementptr %"class.cl::pipe_storage<int __attribute__((ext_vector_type(4))), 1>", %"class.cl::pipe_storage<int __attribute__((ext_vector_type(4))), 1>" addrspace(4)* %0, i32 0, i32 0
- ; CHECK-LLVM: %[[PIPE_STORAGE_1:[0-9]+]] = load %spirv.PipeStorage addrspace(1)* addrspace(4)* %[[ID1]], align 4
+ ; CHECK-LLVM: %[[PIPE_STORAGE_1:[0-9]+]] = load %spirv.PipeStorage addrspace(1)*, %spirv.PipeStorage addrspace(1)* addrspace(4)* %[[ID1]], align 4
; CHECK-LLVM: %[[WRITE_PIPE:[0-9]+]] = call spir_func %spirv.Pipe._1 addrspace(1)* @_Z39__spirv_CreatePipeFromPipeStorage_writePU3AS119__spirv_PipeStorage(%spirv.PipeStorage addrspace(1)* %[[PIPE_STORAGE_1]])
; CHECK-LLVM: %[[WRITE_PIPE_WRAPPER:[0-9]+]] = addrspacecast %"[[CL_WRITE_PIPE_NAME]]"* %mywpipe to %"[[CL_WRITE_PIPE_NAME]]" addrspace(4)*
; CHECK-LLVM: call spir_func void @_ZNU3AS42cl4pipeIDv4_iLNS_11pipe_accessE1EEC1EPU3AS1NS_7__spirv10OpTypePipeILNS3_15AccessQualifierE1EEE(%"[[CL_WRITE_PIPE_NAME]]" addrspace(4)* nocapture %[[WRITE_PIPE_WRAPPER]], %spirv.Pipe._1 addrspace(1)* %[[WRITE_PIPE]])
@@ -82,13 +82,13 @@ entry:
; CHECK-SPIRV: PtrCastToGeneric {{[0-9]+}} [[GENERIC_WRITE_PIPE_WRAPPER_ID:[0-9]+]] [[WRITE_PIPE_WRAPPER_ID]]
; CHECK-SPIRV: FunctionCall {{[0-9]+}} {{[0-9]+}} [[WRITE_PIPE_WRAPPER_CTOR]] [[GENERIC_WRITE_PIPE_WRAPPER_ID]] [[WRITE_PIPE_ID]]
- %2 = load %spirv.PipeStorage addrspace(1)* addrspace(4)* %1, align 4
+ %2 = load %spirv.PipeStorage addrspace(1)*, %spirv.PipeStorage addrspace(1)* addrspace(4)* %1, align 4
%3 = tail call spir_func %spirv.Pipe._1 addrspace(1)* @_Z39__spirv_CreatePipeFromPipeStorage_writePU3AS1K19__spirv_PipeStorage(%spirv.PipeStorage addrspace(1)* %2)
%4 = addrspacecast %"class.cl::pipe<int __attribute__((ext_vector_type(4))), cl::pipe_access::write>"* %mywpipe to %"class.cl::pipe<int __attribute__((ext_vector_type(4))), cl::pipe_access::write>" addrspace(4)*
call spir_func void @_ZNU3AS42cl4pipeIDv4_iLNS_11pipe_accessE1EEC1EPU3AS1NS_7__spirv10OpTypePipeILNS3_15AccessQualifierE1EEE(%"class.cl::pipe<int __attribute__((ext_vector_type(4))), cl::pipe_access::write>" addrspace(4)* %4, %spirv.Pipe._1 addrspace(1)* %3)
- ; CHECK-LLVM: %[[PIPE_STORAGE_2:[0-9]+]] = load %spirv.PipeStorage addrspace(1)* addrspace(4)* %[[ID1]], align 4
+ ; CHECK-LLVM: %[[PIPE_STORAGE_2:[0-9]+]] = load %spirv.PipeStorage addrspace(1)*, %spirv.PipeStorage addrspace(1)* addrspace(4)* %[[ID1]], align 4
; CHECK-LLVM: %[[READ_PIPE:[0-9]+]] = call spir_func %spirv.Pipe._0 addrspace(1)* @_Z38__spirv_CreatePipeFromPipeStorage_readPU3AS119__spirv_PipeStorage(%spirv.PipeStorage addrspace(1)* %[[PIPE_STORAGE_2]])
; CHECK-LLVM: %[[READ_PIPE_WRAPPER:[0-9]+]] = addrspacecast %"[[CL_READ_PIPE_NAME]]"* %myrpipe to %"[[CL_READ_PIPE_NAME]]" addrspace(4)*
; CHECK-LLVM: call spir_func void @_ZNU3AS42cl4pipeIDv4_iLNS_11pipe_accessE0EEC1EPU3AS1NS_7__spirv10OpTypePipeILNS3_15AccessQualifierE0EEE(%"[[CL_READ_PIPE_NAME]]" addrspace(4)* nocapture %[[READ_PIPE_WRAPPER]], %spirv.Pipe._0 addrspace(1)* %[[READ_PIPE]])
@@ -98,7 +98,7 @@ entry:
; CHECK-SPIRV: PtrCastToGeneric {{[0-9]+}} [[GENERIC_READ_PIPE_WRAPPER_ID:[0-9]+]] [[READ_PIPE_WRAPPER_ID]]
; CHECK-SPIRV: FunctionCall {{[0-9]+}} {{[0-9]+}} [[READ_PIPE_WRAPPER_CTOR]] [[GENERIC_READ_PIPE_WRAPPER_ID]] [[READ_PIPE_ID]]
- %5 = load %spirv.PipeStorage addrspace(1)* addrspace(4)* %1, align 4
+ %5 = load %spirv.PipeStorage addrspace(1)*, %spirv.PipeStorage addrspace(1)* addrspace(4)* %1, align 4
%6 = tail call spir_func %spirv.Pipe._0 addrspace(1)* @_Z38__spirv_CreatePipeFromPipeStorage_readPU3AS1K19__spirv_PipeStorage(%spirv.PipeStorage addrspace(1)* %5)
%7 = addrspacecast %"class.cl::pipe<int __attribute__((ext_vector_type(4))), cl::pipe_access::read>"* %myrpipe to %"class.cl::pipe<int __attribute__((ext_vector_type(4))), cl::pipe_access::read>" addrspace(4)*
call spir_func void @_ZNU3AS42cl4pipeIDv4_iLNS_11pipe_accessE0EEC1EPU3AS1NS_7__spirv10OpTypePipeILNS3_15AccessQualifierE0EEE(%"class.cl::pipe<int __attribute__((ext_vector_type(4))), cl::pipe_access::read>" addrspace(4)* %7, %spirv.Pipe._0 addrspace(1)* %6)
@@ -117,7 +117,7 @@ entry:
; Function Attrs: nounwind
define linkonce_odr spir_func void @_ZNU3AS42cl4pipeIDv4_iLNS_11pipe_accessE0EEC2EPU3AS1NS_7__spirv10OpTypePipeILNS3_15AccessQualifierE0EEE(%"class.cl::pipe<int __attribute__((ext_vector_type(4))), cl::pipe_access::read>" addrspace(4)* nocapture %this, %spirv.Pipe._0 addrspace(1)* %handle) unnamed_addr align 2 {
entry:
- %_handle = getelementptr inbounds %"class.cl::pipe<int __attribute__((ext_vector_type(4))), cl::pipe_access::read>" addrspace(4)* %this, i32 0, i32 0
+ %_handle = getelementptr inbounds %"class.cl::pipe<int __attribute__((ext_vector_type(4))), cl::pipe_access::read>", %"class.cl::pipe<int __attribute__((ext_vector_type(4))), cl::pipe_access::read>" addrspace(4)* %this, i32 0, i32 0
store %spirv.Pipe._0 addrspace(1)* %handle, %spirv.Pipe._0 addrspace(1)* addrspace(4)* %_handle, align 4, !tbaa !11
ret void
}
@@ -135,7 +135,7 @@ entry:
; Function Attrs: nounwind
define linkonce_odr spir_func void @_ZNU3AS42cl4pipeIDv4_iLNS_11pipe_accessE1EEC2EPU3AS1NS_7__spirv10OpTypePipeILNS3_15AccessQualifierE1EEE(%"class.cl::pipe<int __attribute__((ext_vector_type(4))), cl::pipe_access::write>" addrspace(4)* nocapture %this, %spirv.Pipe._1 addrspace(1)* %handle) unnamed_addr align 2 {
entry:
- %_handle = getelementptr inbounds %"class.cl::pipe<int __attribute__((ext_vector_type(4))), cl::pipe_access::write>" addrspace(4)* %this, i32 0, i32 0
+ %_handle = getelementptr inbounds %"class.cl::pipe<int __attribute__((ext_vector_type(4))), cl::pipe_access::write>", %"class.cl::pipe<int __attribute__((ext_vector_type(4))), cl::pipe_access::write>" addrspace(4)* %this, i32 0, i32 0
store %spirv.Pipe._1 addrspace(1)* %handle, %spirv.Pipe._1 addrspace(1)* addrspace(4)* %_handle, align 4, !tbaa !13
ret void
}
diff --git a/test/OpFMod.spt b/test/OpFMod.spt
index 6d2a040..b7f6feb 100644
--- a/test/OpFMod.spt
+++ b/test/OpFMod.spt
@@ -60,6 +60,6 @@
; CHECK-LLVM: %frem.res = frem double %[[dividend:[0-9]+]], %[[divisor:[0-9]+]]
; CHECK-LLVM: %copysign = call spir_func double @_Z8copysigndd(double %frem.res, double %[[divisor]]) #0
-; CHECK-LLVM: %[[ptr:[0-9]+]] = getelementptr inbounds double addrspace(1)* %res, i64 %{{[0-9]*}}
+; CHECK-LLVM: %[[ptr:[0-9]+]] = getelementptr inbounds double, double addrspace(1)* %res, i64 %{{[0-9]*}}
; CHECK-LLVM: store double %copysign, double addrspace(1)* %[[ptr]], align 8
- \ No newline at end of file
+
diff --git a/test/OpLine.ll b/test/OpLine.ll
index 9599b11..bd5ed53 100644
--- a/test/OpLine.ll
+++ b/test/OpLine.ll
@@ -17,6 +17,10 @@
; RUN: llvm-spirv -to-text %t.spv -o -| FileCheck %s --check-prefix=CHECK-SPIRV
; RUN: llvm-spirv -r %t.spv -o - | llvm-dis -o - | FileCheck %s --check-prefix=CHECK-LLVM
+; XFAIL: *
+; This is requires debug metadata update.
+; We also should remove checks for LLVM IR stuff like labels, names, etc.
+
; CHECK-SPIRV: String [[str:[0-9]+]] "/tmp.cl"
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"
diff --git a/test/OpSwitch32.ll b/test/OpSwitch32.ll
index a7a8075..2326ca6 100644
--- a/test/OpSwitch32.ll
+++ b/test/OpSwitch32.ll
@@ -42,7 +42,7 @@ entry:
%call = call spir_func i64 @_Z13get_global_idj(i32 0) #2
%conv = trunc i64 %call to i32
store i32 %conv, i32* %tid, align 4
- %0 = load i32* %tid, align 4
+ %0 = load i32, i32* %tid, align 4
switch i32 %0, label %sw.epilog [
i32 0, label %sw.bb
i32 1, label %sw.bb1
@@ -51,20 +51,20 @@ entry:
;CHECK-LLVM: sw.bb
;CHECK-LLVM: preds = %entry
sw.bb: ; preds = %entry
- %1 = load i32* %tid, align 4
+ %1 = load i32, i32* %tid, align 4
%idxprom = sext i32 %1 to i64
- %2 = load i32 addrspace(1)** %res.addr, align 8
- %arrayidx = getelementptr inbounds i32 addrspace(1)* %2, i64 %idxprom
+ %2 = load i32 addrspace(1)*, i32 addrspace(1)** %res.addr, align 8
+ %arrayidx = getelementptr inbounds i32, i32 addrspace(1)* %2, i64 %idxprom
store i32 1, i32 addrspace(1)* %arrayidx, align 4
br label %sw.epilog
;CHECK-LLVM: sw.bb1
;CHECK-LLVM: preds = %entry
sw.bb1: ; preds = %entry
- %3 = load i32* %tid, align 4
+ %3 = load i32, i32* %tid, align 4
%idxprom2 = sext i32 %3 to i64
- %4 = load i32 addrspace(1)** %res.addr, align 8
- %arrayidx3 = getelementptr inbounds i32 addrspace(1)* %4, i64 %idxprom2
+ %4 = load i32 addrspace(1)*, i32 addrspace(1)** %res.addr, align 8
+ %arrayidx3 = getelementptr inbounds i32, i32 addrspace(1)* %4, i64 %idxprom2
store i32 2, i32 addrspace(1)* %arrayidx3, align 4
br label %sw.epilog
diff --git a/test/OpSwitch64.ll b/test/OpSwitch64.ll
index b4593e4..bd60e54 100644
--- a/test/OpSwitch64.ll
+++ b/test/OpSwitch64.ll
@@ -45,7 +45,7 @@ entry:
store i32 addrspace(1)* %res, i32 addrspace(1)** %res.addr, align 8
%call = call spir_func i64 @_Z13get_global_idj(i32 0) #2
store i64 %call, i64* %tid, align 8
- %0 = load i64* %tid, align 8
+ %0 = load i64, i64* %tid, align 8
switch i64 %0, label %sw.epilog [
i64 0, label %sw.bb
i64 1, label %sw.bb1
@@ -55,27 +55,27 @@ entry:
;CHECK-LLVM: sw.bb
;CHECK-LLVM: preds = %entry
sw.bb: ; preds = %entry
- %1 = load i64* %tid, align 8
- %2 = load i32 addrspace(1)** %res.addr, align 8
- %arrayidx = getelementptr inbounds i32 addrspace(1)* %2, i64 %1
+ %1 = load i64, i64* %tid, align 8
+ %2 = load i32 addrspace(1)*, i32 addrspace(1)** %res.addr, align 8
+ %arrayidx = getelementptr inbounds i32, i32 addrspace(1)* %2, i64 %1
store i32 1, i32 addrspace(1)* %arrayidx, align 4
br label %sw.epilog
;CHECK-LLVM: sw.bb1
;CHECK-LLVM: preds = %entry
sw.bb1: ; preds = %entry
- %3 = load i64* %tid, align 8
- %4 = load i32 addrspace(1)** %res.addr, align 8
- %arrayidx2 = getelementptr inbounds i32 addrspace(1)* %4, i64 %3
+ %3 = load i64, i64* %tid, align 8
+ %4 = load i32 addrspace(1)*, i32 addrspace(1)** %res.addr, align 8
+ %arrayidx2 = getelementptr inbounds i32, i32 addrspace(1)* %4, i64 %3
store i32 2, i32 addrspace(1)* %arrayidx2, align 4
br label %sw.epilog
;CHECK-LLVM: sw.bb3
;CHECK-LLVM: preds = %entry
sw.bb3: ; preds = %entry
- %5 = load i64* %tid, align 8
- %6 = load i32 addrspace(1)** %res.addr, align 8
- %arrayidx4 = getelementptr inbounds i32 addrspace(1)* %6, i64 %5
+ %5 = load i64, i64* %tid, align 8
+ %6 = load i32 addrspace(1)*, i32 addrspace(1)** %res.addr, align 8
+ %arrayidx4 = getelementptr inbounds i32, i32 addrspace(1)* %6, i64 %5
store i32 3, i32 addrspace(1)* %arrayidx4, align 4
br label %sw.epilog
diff --git a/test/composite_construct_struct.spt b/test/composite_construct_struct.spt
index f70c280..a3c20c8 100644
--- a/test/composite_construct_struct.spt
+++ b/test/composite_construct_struct.spt
@@ -52,5 +52,5 @@
; CHECK-LLVM: %[[struct0_type:[0-9]+]] = type { <2 x i32>, %[[struct1_type:[0-9]+]] }
; CHECK-LLVM: %[[struct1_type]] = type { i32, i8 }
-; CHECK-LLVM: %[[struct:[0-9]+]] = getelementptr inbounds %[[struct0_type]] addrspace(1)* %in, i64 %{{[0-9]*}}
-; CHECK-LLVM: store %[[struct0_type]] { <2 x i32> <i32 -2100480000, i32 2100480000>, %[[struct1_type]] { i32 -2100483600, i8 -128 } }, %[[struct0_type]] addrspace(1)* %[[struct]] \ No newline at end of file
+; CHECK-LLVM: %[[struct:[0-9]+]] = getelementptr inbounds %[[struct0_type]], %[[struct0_type]] addrspace(1)* %in, i64 %{{[0-9]*}}
+; CHECK-LLVM: store %[[struct0_type]] { <2 x i32> <i32 -2100480000, i32 2100480000>, %[[struct1_type]] { i32 -2100483600, i8 -128 } }, %[[struct0_type]] addrspace(1)* %[[struct]]
diff --git a/test/composite_construct_vector.spt b/test/composite_construct_vector.spt
index 1a2b1da..d9456c7 100644
--- a/test/composite_construct_vector.spt
+++ b/test/composite_construct_vector.spt
@@ -45,5 +45,5 @@
; RUN: llvm-spirv -r %t.spv -o %t.bc
; RUN: llvm-dis < %t.bc | FileCheck %s --check-prefix=CHECK-LLVM
-; CHECK-LLVM: %[[vector:[0-9]+]] = getelementptr inbounds <4 x i32> addrspace(1)* %in, i64 %{{[0-9]*}}
-; CHECK-LLVM: store <4 x i32> <i32 -123, i32 -122, i32 -121, i32 -119>, <4 x i32> addrspace(1)* %[[vector]] \ No newline at end of file
+; CHECK-LLVM: %[[vector:[0-9]+]] = getelementptr inbounds <4 x i32>, <4 x i32> addrspace(1)* %in, i64 %{{[0-9]*}}
+; CHECK-LLVM: store <4 x i32> <i32 -123, i32 -122, i32 -121, i32 -119>, <4 x i32> addrspace(1)* %[[vector]]
diff --git a/test/copy_object.spt b/test/copy_object.spt
index 5f08373..24b12c0 100644
--- a/test/copy_object.spt
+++ b/test/copy_object.spt
@@ -47,4 +47,4 @@
; CHECK-LLVM-NOT: CopyObject
; CHECK-LLVM: %[[char:[0-9]+]] = alloca i8
; CHECK-LLVM: store i8 -20, i8* %[[char]]
-; CHECK-LLVM: %{{[0-9]*}} = load i8* %[[char]]
+; CHECK-LLVM: %{{[0-9]*}} = load i8, i8* %[[char]]
diff --git a/test/half_extension.ll b/test/half_extension.ll
index 76a31be..73d774f 100644
--- a/test/half_extension.ll
+++ b/test/half_extension.ll
@@ -25,16 +25,16 @@ entry:
%x = alloca half, align 2
%y = alloca half, align 2
store half 0xH2E66, half* %x, align 2
- %0 = load half* %x, align 2
+ %0 = load half, half* %x, align 2
%conv = fpext half %0 to float
%add = fadd float %conv, 2.000000e+00
%conv1 = fptrunc float %add to half
store half %conv1, half* %x, align 2
- %1 = load half* %x, align 2
- %2 = load half* %x, align 2
+ %1 = load half, half* %x, align 2
+ %2 = load half, half* %x, align 2
%add2 = fadd half %1, %2
store half %add2, half* %y, align 2
- %3 = load half* %y, align 2
+ %3 = load half, half* %y, align 2
ret half %3
}
diff --git a/test/half_no_extension.ll b/test/half_no_extension.ll
index 8769212..4cbdf17 100644
--- a/test/half_no_extension.ll
+++ b/test/half_no_extension.ll
@@ -25,12 +25,12 @@ entry:
%data = alloca <4 x float>, align 16
store <4 x float> addrspace(1)* %p, <4 x float> addrspace(1)** %p.addr, align 8
store half addrspace(1)* %f, half addrspace(1)** %f.addr, align 8
- %0 = load <4 x float> addrspace(1)** %p.addr, align 8
- %arrayidx = getelementptr inbounds <4 x float> addrspace(1)* %0, i64 0
- %1 = load <4 x float> addrspace(1)* %arrayidx, align 16
+ %0 = load <4 x float> addrspace(1)*, <4 x float> addrspace(1)** %p.addr, align 8
+ %arrayidx = getelementptr inbounds <4 x float>, <4 x float> addrspace(1)* %0, i64 0
+ %1 = load <4 x float>, <4 x float> addrspace(1)* %arrayidx, align 16
store <4 x float> %1, <4 x float>* %data, align 16
- %2 = load <4 x float>* %data, align 16
- %3 = load half addrspace(1)** %f.addr, align 8
+ %2 = load <4 x float>, <4 x float>* %data, align 16
+ %3 = load half addrspace(1)*, half addrspace(1)** %f.addr, align 8
call spir_func void @_Z17vstorea_half4_rtpDv4_fmPU3AS1Dh(<4 x float> %2, i64 0, half addrspace(1)* %3)
ret void
}
diff --git a/test/layout.ll b/test/layout.ll
index 7420977..d98f714 100644
--- a/test/layout.ll
+++ b/test/layout.ll
@@ -121,7 +121,7 @@ target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:2
target triple = "spir"
@v = addrspace(1) global [2 x i32] [i32 1, i32 2], align 4
-@s = addrspace(1) global i32 addrspace(1)* getelementptr inbounds ([2 x i32] addrspace(1)* @v, i32 0, i32 0), align 4
+@s = addrspace(1) global i32 addrspace(1)* getelementptr inbounds ([2 x i32], [2 x i32] addrspace(1)* @v, i32 0, i32 0), align 4
%struct.A = type { i32, %struct.C }
%struct.C = type { i32, %struct.B }
diff --git a/test/lifetime.ll b/test/lifetime.ll
index 3f396f0..a54c039 100644
--- a/test/lifetime.ll
+++ b/test/lifetime.ll
@@ -10,10 +10,10 @@
; CHECK-SPIRV: 3 LifetimeStop [[tmp]] 0
; CHECK-LLVM: %[[tmp1:[0-9]+]] = bitcast i32* %{{[0-9]+}} to i8*
-; CHECK-LLVM: call void @llvm.lifetime.start(i64 -1, i8* %[[tmp1]])
-; CHECK-LLVM: call void @llvm.lifetime.end(i64 -1, i8* %[[tmp1]])
-; CHECK-LLVM: declare void @llvm.lifetime.start(i64, i8* nocapture)
-; CHECK-LLVM: declare void @llvm.lifetime.end(i64, i8* nocapture)
+; CHECK-LLVM: call void @llvm.lifetime.start.p0i8(i64 -1, i8* %[[tmp1]])
+; CHECK-LLVM: call void @llvm.lifetime.end.p0i8(i64 -1, i8* %[[tmp1]])
+; CHECK-LLVM: declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture)
+; CHECK-LLVM: declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture)
; ModuleID = 'main'
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
@@ -25,26 +25,26 @@ define spir_kernel void @lifetime_simple(i32 addrspace(1)* nocapture %res, i32 a
%2 = call spir_func i64 @_Z13get_global_idj(i32 0) #1
%3 = shl i64 %2, 32
%4 = ashr exact i64 %3, 32
- %5 = getelementptr inbounds i32 addrspace(1)* %lhs, i64 %4
- %6 = load i32 addrspace(1)* %5, align 4
- %7 = getelementptr inbounds i32 addrspace(1)* %rhs, i64 %4
- %8 = load i32 addrspace(1)* %7, align 4
+ %5 = getelementptr inbounds i32, i32 addrspace(1)* %lhs, i64 %4
+ %6 = load i32, i32 addrspace(1)* %5, align 4
+ %7 = getelementptr inbounds i32, i32 addrspace(1)* %rhs, i64 %4
+ %8 = load i32, i32 addrspace(1)* %7, align 4
%9 = sub i32 %6, %8
%10 = bitcast i32* %1 to i8*
- call void @llvm.lifetime.start(i64 -1, i8* %10)
+ call void @llvm.lifetime.start.p0i8(i64 -1, i8* %10)
store i32 %9, i32* %1
- %11 = load i32* %1
- call void @llvm.lifetime.end(i64 -1, i8* %10)
- %12 = getelementptr inbounds i32 addrspace(1)* %res, i64 %4
+ %11 = load i32, i32* %1
+ call void @llvm.lifetime.end.p0i8(i64 -1, i8* %10)
+ %12 = getelementptr inbounds i32, i32 addrspace(1)* %res, i64 %4
store i32 %11, i32 addrspace(1)* %12, align 4
ret void
}
; Function Attrs: nounwind
-declare void @llvm.lifetime.start(i64, i8* nocapture) #0
+declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) #0
; Function Attrs: nounwind
-declare void @llvm.lifetime.end(i64, i8* nocapture) #0
+declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #0
; Function Attrs: nounwind readnone
declare spir_func i64 @_Z13get_global_idj(i32) #1
diff --git a/test/memory_access.ll b/test/memory_access.ll
index bc3e42d..4ead0b8 100644
--- a/test/memory_access.ll
+++ b/test/memory_access.ll
@@ -22,11 +22,11 @@
; CHECK-SPIRV: 3 Store {{[0-9]+}} {{[0-9]+}}
; CHECK-LLVM: store volatile i32 addrspace(4)* %0, i32 addrspace(4)** %ptr, align 8
-; CHECK-LLVM: load volatile i32 addrspace(4)** %ptr, align 8
-; CHECK-LLVM: load i32 addrspace(4)* %1, align 4
-; CHECK-LLVM: load volatile i32 addrspace(4)** %ptr, align 8
-; CHECK-LLVM: load volatile i32 addrspace(4)** %ptr
-; CHECK-LLVM: load volatile i32 addrspace(4)** %ptr, align 8, !nontemporal ![[NTMetadata:[0-9]+]]
+; CHECK-LLVM: load volatile i32 addrspace(4)*, i32 addrspace(4)** %ptr, align 8
+; CHECK-LLVM: load i32, i32 addrspace(4)* %1, align 4
+; CHECK-LLVM: load volatile i32 addrspace(4)*, i32 addrspace(4)** %ptr, align 8
+; CHECK-LLVM: load volatile i32 addrspace(4)*, i32 addrspace(4)** %ptr
+; CHECK-LLVM: load volatile i32 addrspace(4)*, i32 addrspace(4)** %ptr, align 8, !nontemporal ![[NTMetadata:[0-9]+]]
; CHECK-LLVM: store i32 %call.old, i32 addrspace(4)* %arrayidx, align 4, !nontemporal ![[NTMetadata:[0-9]+]]
; CHECK-LLVM: store i32 addrspace(4)* %5, i32 addrspace(4)** %ptr
; CHECK-LLVM: ![[NTMetadata:[0-9]+]] = !{i32 1}
@@ -41,13 +41,13 @@ entry:
%ptr = alloca i32 addrspace(4)*, align 8
%0 = addrspacecast i32 addrspace(1)* %oldValues to i32 addrspace(4)*
store volatile i32 addrspace(4)* %0, i32 addrspace(4)** %ptr, align 8
- %1 = load volatile i32 addrspace(4)** %ptr, align 8
- %2 = load i32 addrspace(4)* %1, align 4
+ %1 = load volatile i32 addrspace(4)*, i32 addrspace(4)** %ptr, align 8
+ %2 = load i32, i32 addrspace(4)* %1, align 4
%call = call spir_func i32 @_Z14atomic_cmpxchgPVU3AS1iii(i32 addrspace(1)* %destMemory, i32 %2, i32 %newValue)
- %3 = load volatile i32 addrspace(4)** %ptr, align 8
- %4 = load volatile i32 addrspace(4)** %ptr
- %5 = load volatile i32 addrspace(4)** %ptr, align 8, !nontemporal !9
- %arrayidx = getelementptr inbounds i32 addrspace(4)* %3, i64 0
+ %3 = load volatile i32 addrspace(4)*, i32 addrspace(4)** %ptr, align 8
+ %4 = load volatile i32 addrspace(4)*, i32 addrspace(4)** %ptr
+ %5 = load volatile i32 addrspace(4)*, i32 addrspace(4)** %ptr, align 8, !nontemporal !9
+ %arrayidx = getelementptr inbounds i32, i32 addrspace(4)* %3, i64 0
store i32 %call, i32 addrspace(4)* %arrayidx, align 4, !nontemporal !9
store i32 addrspace(4)* %5, i32 addrspace(4)** %ptr
ret void
diff --git a/test/multi_md.ll b/test/multi_md.ll
index 4a5f760..d6454ff 100644
--- a/test/multi_md.ll
+++ b/test/multi_md.ll
@@ -46,7 +46,7 @@ attributes #0 = { nounwind }
; "cl_images" should be encoded as BasicImage capability,
; but images are not used in this test case, so this capability is not required.
-; CHECK-DAG-NOT: 4 Extension "cl_images"
+; CHECK-NOT: 4 Extension "cl_images"
; CHECK-DAG: 8 Extension "cl_khr_int64_base_atomics"
; CHECK-DAG: 9 Extension "cl_khr_int64_extended_atomics"
; CHECK: 3 Source 3 200000
diff --git a/test/transcoding/OpImageQuerySize.ll b/test/transcoding/OpImageQuerySize.ll
index b9c4301..4b64d22 100644
--- a/test/transcoding/OpImageQuerySize.ll
+++ b/test/transcoding/OpImageQuerySize.ll
@@ -230,7 +230,7 @@ define spir_kernel void @test_image2d_array_depth_t(i32 addrspace(1)* nocapture
%4 = trunc i64 %3 to i32
%5 = add nsw i32 %2, %1
%6 = add nsw i32 %5, %4
- store i32 %5, i32 addrspace(1)* %sizes, align 4, !tbaa !25
+ store i32 %5, i32 addrspace(1)* %sizes, align 4, !tbaa !22
ret void
}
diff --git a/test/transcoding/OpVariable_Initializer.ll b/test/transcoding/OpVariable_Initializer.ll
index 89d1494..dd109c0 100755
--- a/test/transcoding/OpVariable_Initializer.ll
+++ b/test/transcoding/OpVariable_Initializer.ll
@@ -8,7 +8,7 @@
; CHECK-LLVM: @test_atomic_fn.L = internal addrspace(3) global [64 x i32] undef, align 4
; CHECK-SPIRV-NOT: undef
-; CHECK-SPIRV-SAME: 4 Variable 5 6 4
+; CHECK-SPIRV: 4 Variable 5 6 4
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"
diff --git a/test/transcoding/device_execution_multiple_blocks.ll b/test/transcoding/device_execution_multiple_blocks.ll
index ac06106..1742101 100644
--- a/test/transcoding/device_execution_multiple_blocks.ll
+++ b/test/transcoding/device_execution_multiple_blocks.ll
@@ -73,7 +73,7 @@ define spir_kernel void @enqueue_block_get_kernel_preferred_work_group_size_mult
; CHECK: store i8* {{.*}} @__enqueue_block_get_kernel_preferred_work_group_size_multiple_block_invoke
; CHECK: [[CAPTUREDGEP:%.*]] = getelementptr <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, [8 x i8] }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, [8 x i8] }>* [[BLOCK]], i32 0, i32 5
; CHECK: [[CAPTUREDCAST:%.*]] = bitcast [8 x i8]* [[CAPTUREDGEP]] to i8*
-; CHECK: call void @llvm.memcpy.p0i8.p0i8.i32(i8* [[CAPTUREDCAST]], i8* [[CTX]], i32 8, i32 8, i1 false)
+; CHECK: call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 [[CAPTUREDCAST]], i8* align 8 [[CTX]], i32 8, i1 false)
; CHECK: [[BLOCKBCST:%.*]] = bitcast <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, [8 x i8] }>* [[BLOCK]] to i8*
; CHECK: [[BLOCKADDRCST:%.*]] = addrspacecast i8* [[BLOCKBCST]] to i8 addrspace(4)*
; CHECK: call i32 @__get_kernel_work_group_size_impl(i8 addrspace(4)* [[BLOCKADDRCST]])
diff --git a/test/transcoding/device_execution_vaargs.ll b/test/transcoding/device_execution_vaargs.ll
index 5c307e6..5f616b4 100644
--- a/test/transcoding/device_execution_vaargs.ll
+++ b/test/transcoding/device_execution_vaargs.ll
@@ -57,7 +57,7 @@
; CHECK: store %struct.__block_descriptor* @__block_descriptor_spirv.1, %struct.__block_descriptor** [[BLOCKDESCGEP2]]
; CHECK: [[CAPTUREDGEP:%.*]] = getelementptr <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, [8 x i8] }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, [8 x i8] }>* [[BLOCK2]], i32 0, i32 5
; CHECK: [[CAPTUREDCAST:%.*]] = bitcast [8 x i8]* [[CAPTUREDGEP]] to i8*
-; CHECK: call void @llvm.memcpy.p0i8.p0i8.i32(i8* [[CAPTUREDCAST]], i8* %0, i32 8, i32 8, i1 false)
+; CHECK: call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 [[CAPTUREDCAST]], i8* align 8 %0, i32 8, i1 false)
; CHECK: [[BLOCKBCAST2:%.*]] = bitcast <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, [8 x i8] }>* [[BLOCK2]] to i8*
; CHECK: [[BLOCKADDRCAST2:%.*]] = addrspacecast i8* [[BLOCKBCAST2]] to i8 addrspace(4)*
; CHECK: call i32 @__get_kernel_work_group_size_impl(i8 addrspace(4)* [[BLOCKADDRCAST2]])
diff --git a/test/transcoding/extract_insert_value.ll b/test/transcoding/extract_insert_value.ll
index 73bb9e2..ff05b1e 100644
--- a/test/transcoding/extract_insert_value.ll
+++ b/test/transcoding/extract_insert_value.ll
@@ -20,8 +20,8 @@ target triple = "spir-unknown-unknown"
; CHECK-LLVM: define spir_func void @array_test
; CHECK-LLVM-LABEL: entry
-; CHECK-LLVM: %0 = getelementptr inbounds %struct.arr addrspace(1)* %object, i32 0, i32 0
-; CHECK-LLVM: %1 = load [7 x float] addrspace(1)* %0, align 4
+; CHECK-LLVM: %0 = getelementptr inbounds %struct.arr, %struct.arr addrspace(1)* %object, i32 0, i32 0
+; CHECK-LLVM: %1 = load [7 x float], [7 x float] addrspace(1)* %0, align 4
; CHECK-LLVM: %2 = extractvalue [7 x float] %1, 4
; CHECK-LLVM: %3 = extractvalue [7 x float] %1, 2
; CHECK-LLVM: %4 = fadd float %2, %3
@@ -42,8 +42,8 @@ target triple = "spir-unknown-unknown"
; Function Attrs: nounwind
define spir_func void @array_test(%struct.arr addrspace(1)* %object) #0 {
entry:
- %0 = getelementptr inbounds %struct.arr addrspace(1)* %object, i32 0, i32 0
- %1 = load [7 x float] addrspace(1)* %0, align 4
+ %0 = getelementptr inbounds %struct.arr, %struct.arr addrspace(1)* %object, i32 0, i32 0
+ %1 = load [7 x float], [7 x float] addrspace(1)* %0, align 4
%2 = extractvalue [7 x float] %1, 4
%3 = extractvalue [7 x float] %1, 2
%4 = fadd float %2, %3
@@ -54,8 +54,8 @@ entry:
; CHECK-LLVM: define spir_func void @struct_test
; CHECK-LLVM-LABEL: entry
-; CHECK-LLVM: %0 = getelementptr inbounds %struct.st addrspace(1)* %object, i32 0, i32 0
-; CHECK-LLVM: %1 = load %struct.inner addrspace(1)* %0, align 4
+; CHECK-LLVM: %0 = getelementptr inbounds %struct.st, %struct.st addrspace(1)* %object, i32 0, i32 0
+; CHECK-LLVM: %1 = load %struct.inner, %struct.inner addrspace(1)* %0, align 4
; CHECK-LLVM: %2 = extractvalue %struct.inner %1, 0
; CHECK-LLVM: %3 = fadd float %2, 1.000000e+00
; CHECK-LLVM: %4 = insertvalue %struct.inner %1, float %3, 0
@@ -74,8 +74,8 @@ entry:
; Function Attrs: nounwind
define spir_func void @struct_test(%struct.st addrspace(1)* %object) #0 {
entry:
- %0 = getelementptr inbounds %struct.st addrspace(1)* %object, i32 0, i32 0
- %1 = load %struct.inner addrspace(1)* %0, align 4
+ %0 = getelementptr inbounds %struct.st, %struct.st addrspace(1)* %object, i32 0, i32 0
+ %1 = load %struct.inner, %struct.inner addrspace(1)* %0, align 4
%2 = extractvalue %struct.inner %1, 0
%3 = fadd float %2, 1.000000e+00
%4 = insertvalue %struct.inner %1, float %3, 0
@@ -93,4 +93,4 @@ attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"=
!opencl.compiler.options = !{!1}
!0 = !{i32 1, i32 2}
-!1 = !{} \ No newline at end of file
+!1 = !{}
diff --git a/test/transcoding/global-constant-expression.ll b/test/transcoding/global-constant-expression.ll
index 7f0c755..f4c81cb 100644
--- a/test/transcoding/global-constant-expression.ll
+++ b/test/transcoding/global-constant-expression.ll
@@ -7,10 +7,10 @@ target triple = "spir-unknown-unknown"
; CHECK-SPIRV: 7 SpecConstantOp {{[0-9]*}} {{[0-9]*}} 70
; CHECK-SPIRV: 7 SpecConstantOp {{[0-9]*}} {{[0-9]*}} 70
-; CHECK-LLVM: @k_var = addrspace(1) global [2 x i8 addrspace(1)*] [i8 addrspace(1)* getelementptr inbounds ([2 x i8] addrspace(1)* @a_var, i32 0, i64 1), i8 addrspace(1)* getelementptr inbounds ([2 x i8] addrspace(1)* @a_var, i32 0, i32 0)], align 4
+; CHECK-LLVM: @k_var = addrspace(1) global [2 x i8 addrspace(1)*] [i8 addrspace(1)* getelementptr inbounds ([2 x i8], [2 x i8] addrspace(1)* @a_var, i32 0, i64 1), i8 addrspace(1)* getelementptr inbounds ([2 x i8], [2 x i8] addrspace(1)* @a_var, i32 0, i32 0)], align 4
@a_var = addrspace(1) global [2 x i8] c"\96\96", align 1
-@k_var = addrspace(1) global [2 x i8 addrspace(1)*] [i8 addrspace(1)* getelementptr inbounds ([2 x i8] addrspace(1)* @a_var, i32 0, i64 1), i8 addrspace(1)* getelementptr inbounds ([2 x i8] addrspace(1)* @a_var, i32 0, i32 0)], align 4
+@k_var = addrspace(1) global [2 x i8 addrspace(1)*] [i8 addrspace(1)* getelementptr inbounds ([2 x i8], [2 x i8] addrspace(1)* @a_var, i32 0, i64 1), i8 addrspace(1)* getelementptr inbounds ([2 x i8], [2 x i8] addrspace(1)* @a_var, i32 0, i32 0)], align 4
!opencl.enable.FP_CONTRACT = !{}
!opencl.spir.version = !{!0}
diff --git a/test/transcoding/llvm.memmove.ll b/test/transcoding/llvm.memmove.ll
index 62283bf..e565d23 100644
--- a/test/transcoding/llvm.memmove.ll
+++ b/test/transcoding/llvm.memmove.ll
@@ -20,15 +20,15 @@
; CHECK-LLVM: [[local:%[0-9]+]] = alloca %struct.SomeStruct
; CHECK-LLVM: [[tmp1:%[0-9]+]] = bitcast %struct.SomeStruct* [[local]] to [[type:i[0-9]+\*]]
-; CHECK-LLVM: call void @llvm.lifetime.start({{i[0-9]+}} {{-?[0-9]+}}, [[type]] [[tmp1]])
+; CHECK-LLVM: call void @llvm.lifetime.start.p0i8({{i[0-9]+}} {{-?[0-9]+}}, [[type]] [[tmp1]])
; CHECK-LLVM: [[tmp2:%[0-9]+]] = bitcast %struct.SomeStruct* [[local]] to [[type]]
; CHECK-LLVM: call void @llvm.memcpy
-; CHECK-LLVM: ([[type]] [[tmp2]],
+; CHECK-LLVM: ([[type]] align 64 [[tmp2]],
; CHECK-LLVM: {{i[0-9]+}} [[size:[0-9]+]]
; CHECK-LLVM: [[tmp3:%[0-9]+]] = bitcast %struct.SomeStruct* [[local]] to [[type]]
; CHECK-LLVM: call void @llvm.memcpy
-; CHECK-LLVM: , [[type]] [[tmp3]], {{i[0-9]+}} [[size]]
-; CHECK-LLVM: call void @llvm.lifetime.end({{i[0-9]+}} {{-?[0-9]+}}, [[type]] [[tmp1]])
+; CHECK-LLVM: , [[type]] align 64 [[tmp3]], {{i[0-9]+}} [[size]]
+; CHECK-LLVM: call void @llvm.lifetime.end.p0i8({{i[0-9]+}} {{-?[0-9]+}}, [[type]] [[tmp1]])
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-n8:16:32:64"
target triple = "spir-unknown-unknown"
diff --git a/test/transcoding/llvm.memset.ll b/test/transcoding/llvm.memset.ll
index b41fa96..3c9fb07 100644
--- a/test/transcoding/llvm.memset.ll
+++ b/test/transcoding/llvm.memset.ll
@@ -38,7 +38,7 @@ target triple = "spir"
define spir_func void @_Z5foo11v(%struct.S1 addrspace(4)* noalias nocapture sret %agg.result) #0 {
%1 = bitcast %struct.S1 addrspace(4)* %agg.result to i8 addrspace(4)*
tail call void @llvm.memset.p4i8.i32(i8 addrspace(4)* %1, i8 0, i32 12, i32 4, i1 false)
-; CHECK-LLVM: call void @llvm.memset.p4i8.i32(i8 addrspace(4)* %1, i8 0, i32 12, i32 4, i1 false)
+; CHECK-LLVM: call void @llvm.memset.p4i8.i32(i8 addrspace(4)* align 4 %1, i8 0, i32 12, i1 false)
ret void
}
diff --git a/test/unreachable.ll b/test/unreachable.ll
index 201eedc..608ea99 100644
--- a/test/unreachable.ll
+++ b/test/unreachable.ll
@@ -17,14 +17,14 @@ define spir_kernel void @unreachable_simple(i32 addrspace(1)* nocapture %in, i32
%1 = call spir_func i64 @_Z13get_global_idj(i32 0) #1
%2 = shl i64 %1, 32
%3 = ashr exact i64 %2, 32
- %4 = getelementptr inbounds i32 addrspace(1)* %in, i64 %3
- %5 = getelementptr inbounds i32 addrspace(1)* %out, i64 %3
+ %4 = getelementptr inbounds i32, i32 addrspace(1)* %in, i64 %3
+ %5 = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %3
br label %7
; No predecessors!
unreachable
; <label>:7 ; preds = %0
- %8 = load i32 addrspace(1)* %4
+ %8 = load i32, i32 addrspace(1)* %4
store i32 %8, i32 addrspace(1)* %5
ret void
}
@@ -53,4 +53,4 @@ attributes #1 = { nounwind readnone }
!6 = !{i32 3, i32 102000}
!7 = !{i32 1, i32 2}
!8 = !{}
-!9 = !{i16 7, i16 0} \ No newline at end of file
+!9 = !{i16 7, i16 0}
diff --git a/tools/llvm-spirv/llvm-spirv.cpp b/tools/llvm-spirv/llvm-spirv.cpp
index 34c5caf..384756f 100644
--- a/tools/llvm-spirv/llvm-spirv.cpp
+++ b/tools/llvm-spirv/llvm-spirv.cpp
@@ -45,14 +45,16 @@
///
//===----------------------------------------------------------------------===//
-#include "llvm/Bitcode/ReaderWriter.h"
+#include "llvm/Bitcode/BitcodeReader.h"
+#include "llvm/Bitcode/BitcodeWriter.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Verifier.h"
#include "llvm/Support/CommandLine.h"
-#include "llvm/Support/DataStream.h"
#include "llvm/Support/Debug.h"
+#include "llvm/Support/Error.h"
#include "llvm/Support/FileSystem.h"
+#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/PrettyStackTrace.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/Signals.h"
@@ -114,31 +116,18 @@ removeExt(const std::string& FileName) {
return FileName;
}
+static ExitOnError ExitOnErr;
+
static int
convertLLVMToSPIRV() {
LLVMContext Context;
- std::string Err;
- std::unique_ptr<DataStreamer> DS = getDataFileStreamer(InputFile, &Err);
- if (!DS) {
- errs() << "Fails to open input file: " << Err;
- return -1;
- }
-
- ErrorOr<std::unique_ptr<Module>> MOrErr =
- getStreamedBitcodeModule(InputFile, std::move(DS), Context);
-
- if (std::error_code EC = MOrErr.getError()) {
- errs() << "Fails to load bitcode: " << EC.message();
- return -1;
- }
-
- std::unique_ptr<Module> M = std::move(*MOrErr);
-
- if (std::error_code EC = M->materializeAll()){
- errs() << "Fails to materialize: " << EC.message();
- return -1;
- }
+ std::unique_ptr<MemoryBuffer> MB =
+ ExitOnErr(errorOrToExpected(MemoryBuffer::getFileOrSTDIN(InputFile)));
+ std::unique_ptr<Module> M =
+ ExitOnErr(getOwningLazyBitcodeModule(std::move(MB), Context,
+ /*ShouldLazyLoadMetadata=*/true));
+ ExitOnErr(M->materializeAll());
if (OutputFile.empty()) {
if (InputFile == "-")
@@ -150,6 +139,7 @@ convertLLVMToSPIRV() {
llvm::StringRef outFile(OutputFile);
std::error_code EC;
+ std::string Err;
llvm::raw_fd_ostream OFS(outFile, EC, llvm::sys::fs::F_None);
if (!WriteSPIRV(M.get(), OFS, Err)) {
errs() << "Fails to save LLVM as SPIRV: " << Err << '\n';
@@ -187,13 +177,13 @@ convertSPIRVToLLVM() {
}
std::error_code EC;
- tool_output_file Out(OutputFile.c_str(), EC, sys::fs::F_None);
+ ToolOutputFile Out(OutputFile.c_str(), EC, sys::fs::F_None);
if (EC) {
errs() << "Fails to open output file: " << EC.message();
return -1;
}
- WriteBitcodeToFile(M, Out.os());
+ WriteBitcodeToFile(*M, Out.os());
Out.keep();
delete M;
return 0;
@@ -238,27 +228,12 @@ static int
regularizeLLVM() {
LLVMContext Context;
- std::string Err;
- std::unique_ptr<DataStreamer> DS = getDataFileStreamer(InputFile, &Err);
- if (!DS) {
- errs() << "Fails to open input file: " << Err;
- return -1;
- }
-
- ErrorOr<std::unique_ptr<Module>> MOrErr =
- getStreamedBitcodeModule(InputFile, std::move(DS), Context);
-
- if (std::error_code EC = MOrErr.getError()) {
- errs() << "Fails to load bitcode: " << EC.message();
- return -1;
- }
-
- std::unique_ptr<Module> M = std::move(*MOrErr);
-
- if (std::error_code EC = M->materializeAll()){
- errs() << "Fails to materialize: " << EC.message();
- return -1;
- }
+ std::unique_ptr<MemoryBuffer> MB =
+ ExitOnErr(errorOrToExpected(MemoryBuffer::getFileOrSTDIN(InputFile)));
+ std::unique_ptr<Module> M =
+ ExitOnErr(getOwningLazyBitcodeModule(std::move(MB), Context,
+ /*ShouldLazyLoadMetadata=*/true));
+ ExitOnErr(M->materializeAll());
if (OutputFile.empty()) {
if (InputFile == "-")
@@ -267,19 +242,20 @@ regularizeLLVM() {
OutputFile = removeExt(InputFile) + ".regularized.bc";
}
+ std::string Err;
if (!RegularizeLLVMForSPIRV(M.get(), Err)) {
errs() << "Fails to save LLVM as SPIRV: " << Err << '\n';
return -1;
}
std::error_code EC;
- tool_output_file Out(OutputFile.c_str(), EC, sys::fs::F_None);
+ ToolOutputFile Out(OutputFile.c_str(), EC, sys::fs::F_None);
if (EC) {
errs() << "Fails to open output file: " << EC.message();
return -1;
}
- WriteBitcodeToFile(M.get(), Out.os());
+ WriteBitcodeToFile(*M.get(), Out.os());
Out.keep();
return 0;
}
@@ -288,7 +264,7 @@ regularizeLLVM() {
int
main(int ac, char** av) {
EnablePrettyStackTrace();
- sys::PrintStackTraceOnErrorSignal();
+ sys::PrintStackTraceOnErrorSignal(av[0]);
PrettyStackTraceProgram X(ac, av);
cl::ParseCommandLineOptions(ac, av, "LLVM/SPIR-V translator");