From cc3e0f0b690ec774a0522d22b7ceaf2a3702566b Mon Sep 17 00:00:00 2001 From: Alexey Sotkin Date: Tue, 6 Mar 2018 19:17:47 +0300 Subject: Upgrade SPIRV translator from LLVM 4.0 to the curent SVN revision 327279 Change-Id: I10dc4476c2851a54434a47406fff0840da0b9951 --- lib/SPIRV/Mangler/Mangler.cpp | 2 +- lib/SPIRV/Mangler/ManglingUtils.cpp | 2 +- lib/SPIRV/Mangler/ManglingUtils.h | 2 +- lib/SPIRV/OCL20To12.cpp | 2 +- lib/SPIRV/OCL20ToSPIRV.cpp | 39 ++--- lib/SPIRV/OCL21ToSPIRV.cpp | 6 +- lib/SPIRV/OCLTypeToSPIRV.cpp | 4 +- lib/SPIRV/OCLUtil.cpp | 12 +- lib/SPIRV/OCLUtil.h | 6 +- lib/SPIRV/SPIRVInternal.h | 23 ++- lib/SPIRV/SPIRVLowerConstExpr.cpp | 12 +- lib/SPIRV/SPIRVLowerMemmove.cpp | 24 ++-- lib/SPIRV/SPIRVLowerOCLBlocks.cpp | 14 +- lib/SPIRV/SPIRVReader.cpp | 160 ++++++++------------- lib/SPIRV/SPIRVToOCL20.cpp | 16 +-- lib/SPIRV/SPIRVUtil.cpp | 41 +++--- lib/SPIRV/SPIRVWriter.cpp | 56 ++++---- lib/SPIRV/SPIRVWriterPass.cpp | 2 +- lib/SPIRV/libSPIRV/SPIRVDecorate.cpp | 24 ++-- lib/SPIRV/libSPIRV/SPIRVEntry.h | 30 ++-- lib/SPIRV/libSPIRV/SPIRVInstruction.h | 11 +- lib/SPIRV/libSPIRV/SPIRVModule.cpp | 11 +- lib/SPIRV/libSPIRV/SPIRVUtil.h | 2 + test/CreatePipeFromPipeStorage.ll | 16 +-- test/OpFMod.spt | 4 +- test/OpLine.ll | 4 + test/OpSwitch32.ll | 14 +- test/OpSwitch64.ll | 20 +-- test/composite_construct_struct.spt | 4 +- test/composite_construct_vector.spt | 4 +- test/copy_object.spt | 2 +- test/half_extension.ll | 8 +- test/half_no_extension.ll | 10 +- test/layout.ll | 2 +- test/lifetime.ll | 28 ++-- test/memory_access.ll | 22 +-- test/multi_md.ll | 2 +- test/transcoding/OpImageQuerySize.ll | 2 +- test/transcoding/OpVariable_Initializer.ll | 2 +- .../device_execution_multiple_blocks.ll | 2 +- test/transcoding/device_execution_vaargs.ll | 2 +- test/transcoding/extract_insert_value.ll | 18 +-- test/transcoding/global-constant-expression.ll | 4 +- test/transcoding/llvm.memmove.ll | 8 +- test/transcoding/llvm.memset.ll | 2 +- test/unreachable.ll | 8 +- tools/llvm-spirv/llvm-spirv.cpp | 74 ++++------ 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 &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 &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 &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 &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 &Args){ Args.resize(2); Args[0] = addInt32(map(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 &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 &Args){ Args.resize(3); Args[0] = addInt32(map(std::get<2>(Lit))); @@ -885,7 +885,7 @@ void OCL20ToSPIRV::visitCallConvert(CallInst* CI, !(isa(SrcTy) && IsTargetInt)) { Rounding = DemangledName.substr(Loc, 4); } - AttributeSet Attrs = CI->getCalledFunction()->getAttributes(); + AttributeList Attrs = CI->getCalledFunction()->getAttributes(); mutateCallInstSPIRV(M, CI, [=](CallInst *, std::vector &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 &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 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 &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 &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 &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 &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 &Args){ Args.resize(3); Args[0] = addInt32(map(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 &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 &)>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 &, Type *&RetTy)> ArgMutate, std::function 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 &)>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 &)>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 &, Type *&RetTy)> ArgMutate, std::function RetMutate, - AttributeSet *Attrs = nullptr); + AttributeList *Attrs = nullptr); /// Mutate a function to OpenCL builtin function. void mutateFunctionOCL(Function *F, std::function &)>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 #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::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 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 &)>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 &, Type *&RetTy)> ArgMutate, std::function 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 &)>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 &, Type *&RetTy)> ArgMutate, std::function 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 &)>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 Args, AttributeSet *Attrs, Instruction *Pos, + ArrayRef 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 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 CMap; std::list 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(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(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 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(I.getLength())) - // ToDo: for non-constant length, could use a loop to copy a + if (!isa(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(I.getLength()); - if (isa(Src)) + if (isa(Src)) // The source could be bit-cast from another type, // need the original type for the allocation of the temporary variable SrcTy = cast(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().getCallGraph(); auto ACT = &getAnalysis(); - InlineFunctionInfo IFI(CG, ACT); + std::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 #include @@ -103,10 +103,17 @@ cl::opt 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 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 &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 &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 &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(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(Init)->getType(); if (isa(Ty)) { SPIRVTypeArray *AT = static_cast(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(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(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(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(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 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(M->getOrInsertFunction(MemCpyName, MemCpyTy)); - assert(MemCpy && "Can't create memcpy intrinsic"); - MemCpy->setLinkage(GlobalValue::ExternalLinkage); - SmallVector 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(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(transSPIRVBuiltinFromInst(I, BB)); - AttributeSet Attrs = CI->getCalledFunction()->getAttributes(); + AttributeList Attrs = CI->getCalledFunction()->getAttributes(); return cast(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(transSPIRVBuiltinFromInst(I, BB)); - AttributeSet Attrs = CI->getCalledFunction()->getAttributes(); + AttributeList Attrs = CI->getCalledFunction()->getAttributes(); return cast(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 &Args){ auto getArg = [=](unsigned I){ return cast(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 &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 &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 &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 &Args){ if (HasScope) Args.erase(Args.begin(), Args.begin() + 1); @@ -537,7 +537,7 @@ void SPIRVToOCL20::visitCastInst(CastInst &Cast) { if(isa(Cast) || isa(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 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 &)>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 &, Type *&RetTy)>ArgMutate, std::function 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 &)>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 &)>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 &, Type *&RetTy)> ArgMutate, std::function RetMutate, - AttributeSet *Attrs) { + AttributeList *Attrs) { BuiltinFuncMangleInfo BtnInfo; return mutateCallInst(M, CI, ArgMutate, RetMutate, &BtnInfo, Attrs); } CallInst * addCallInst(Module *M, StringRef FuncName, Type *RetTy, ArrayRef 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 Args, CallInst * addCallInstSPIRV(Module *M, StringRef FuncName, Type *RetTy, ArrayRef 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(ET)) { - assert(isVoidFuncTy(FT) && "Not supported"); + if (isa(ET)) { + assert(isVoidFuncTy(cast(ET)) && "Not supported"); EPT = new SPIR::BlockType; } else if (auto StructTy = dyn_cast(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(Index0)->getZExtValue() == 0); - auto Index1 = GEP->getOperand(2); - assert(dyn_cast(Index1)->getZExtValue() == 0); + assert(dyn_cast(GEP->getOperand(1))->getZExtValue() == 0); + assert(dyn_cast(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 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(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 Seen; std::function Run = [&](const Type *Ty) { - if (!isa(Ty)) + if (!isa(Ty) && !Ty->isPointerTy()) return false; if (auto *StructTy = dyn_cast(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(Ty)) @@ -531,6 +531,7 @@ LLVMToSPIRV::transType(Type *T) { if (T->isStructTy() && !T->isSized()) { auto ST = dyn_cast(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(ElemTy) && recursiveType(ST, ElemTy)) + if ((isa(ElemTy) || isa(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 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(ET); - auto AddrSpc = T->getPointerAddressSpace(); auto STName = ST->getStructName(); assert (STName.startswith(kSPIRVTypeName::PrefixAndDelim) && "Invalid SPIR-V opaque type name"); SmallVector 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( 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(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(Op1)); for (const auto &U : Op1->users()) { auto BCU = dyn_cast(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(dyn_cast(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(V)) + if (dyn_cast(V)) return mapValue(V, BM->addUnreachableInst(BB)); if (auto RI = dyn_cast(V)) { @@ -1035,11 +1040,9 @@ LLVMToSPIRV::transValueWithoutDecoration(Value *V, SPIRVBasicBlock *BB, std::vector 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(transValue(I.getCaseSuccessor(), + static_cast(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& 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 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& 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 SPIRV##x; +#define _SPIRV_OP(x) typedef SPIRVEntryOpCodeOnly 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" addrspace(1)* @mygpipe to %"class.cl::pipe_storage" addrspace(4)* - %1 = getelementptr %"class.cl::pipe_storage" addrspace(4)* %0, i32 0, i32 0 + %1 = getelementptr %"class.cl::pipe_storage", %"class.cl::pipe_storage" 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"* %mywpipe to %"class.cl::pipe" addrspace(4)* call spir_func void @_ZNU3AS42cl4pipeIDv4_iLNS_11pipe_accessE1EEC1EPU3AS1NS_7__spirv10OpTypePipeILNS3_15AccessQualifierE1EEE(%"class.cl::pipe" 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"* %myrpipe to %"class.cl::pipe" addrspace(4)* call spir_func void @_ZNU3AS42cl4pipeIDv4_iLNS_11pipe_accessE0EEC1EPU3AS1NS_7__spirv10OpTypePipeILNS3_15AccessQualifierE0EEE(%"class.cl::pipe" 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" addrspace(4)* nocapture %this, %spirv.Pipe._0 addrspace(1)* %handle) unnamed_addr align 2 { entry: - %_handle = getelementptr inbounds %"class.cl::pipe" addrspace(4)* %this, i32 0, i32 0 + %_handle = getelementptr inbounds %"class.cl::pipe", %"class.cl::pipe" 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" addrspace(4)* nocapture %this, %spirv.Pipe._1 addrspace(1)* %handle) unnamed_addr align 2 { entry: - %_handle = getelementptr inbounds %"class.cl::pipe" addrspace(4)* %this, i32 0, i32 0 + %_handle = getelementptr inbounds %"class.cl::pipe", %"class.cl::pipe" 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> , %[[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> , %[[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> , <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> , <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 ;