gentoo-overlay/dev-util/intel-graphics-compiler/files/intel-graphics-compiler-2.32.7-r2-llvm22.patch

10035 lines
495 KiB
Diff

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5b04555..809b5c5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -21,3 +21,14 @@ list(APPEND IGC__IGC_TARGETS "opencl-clang-lib")
set(IGC__IGC_TARGETS "${IGC__IGC_TARGETS}" PARENT_SCOPE)
set(IGC_LIBRARY_NAME "${IGC_LIBRARY_NAME}" PARENT_SCOPE)
set(FCL_LIBRARY_NAME "${FCL_LIBRARY_NAME}" PARENT_SCOPE)
+
+message(STATUS "<<< Gentoo configuration >>>
+Build type ${CMAKE_BUILD_TYPE}
+Install path ${CMAKE_INSTALL_PREFIX}
+Compiler flags:
+C ${CMAKE_C_FLAGS}
+C++ ${CMAKE_CXX_FLAGS}
+Linker flags:
+Executable ${CMAKE_EXE_LINKER_FLAGS}
+Module ${CMAKE_MODULE_LINKER_FLAGS}
+Shared ${CMAKE_SHARED_LINKER_FLAGS}\n")
diff --git a/IGC/AdaptorCommon/LivenessUtils/MergeAllocas.cpp b/IGC/AdaptorCommon/LivenessUtils/MergeAllocas.cpp
index 6f96a2f..39bb3b2 100644
--- a/IGC/AdaptorCommon/LivenessUtils/MergeAllocas.cpp
+++ b/IGC/AdaptorCommon/LivenessUtils/MergeAllocas.cpp
@@ -152,7 +152,7 @@ static void ReplaceAllocas(const MergeAllocas::AllocaInfo &MergableAlloca, Funct
// We can re-use same bitcast
if (topAllocaBitcast == nullptr) {
topAllocaBitcast = cast<Instruction>(
- Builder.CreateBitCast(topAlloca, Builder.getInt8PtrTy(topAlloca->getType()->getPointerAddressSpace())));
+ Builder.CreateBitCast(topAlloca, PointerType::get(Builder.getInt8Ty(), topAlloca->getType()->getPointerAddressSpace())));
}
auto *Offset = Builder.getInt32(subAlloca->offset);
auto *GEP = Builder.CreateGEP(Builder.getInt8Ty(), topAllocaBitcast, Offset);
diff --git a/IGC/AdaptorCommon/ProcessFuncAttributes.cpp b/IGC/AdaptorCommon/ProcessFuncAttributes.cpp
index 32c9caf..cac6681 100644
--- a/IGC/AdaptorCommon/ProcessFuncAttributes.cpp
+++ b/IGC/AdaptorCommon/ProcessFuncAttributes.cpp
@@ -292,7 +292,7 @@ static bool deduceIfUsesImageParams(Function *F, ModuleMetaData *ModMD) {
// is not possible with opaque pointers and in this case the parameter types must be deduced based on the mangled
// function name.
auto IsSyclImageAccessor = [](StringRef Name) {
- return Name.startswith("_Z") && Name.contains("sycl") && Name.contains("accessor") && Name.contains("image");
+ return Name.starts_with("_Z") && Name.contains("sycl") && Name.contains("accessor") && Name.contains("image");
};
if (IsSyclImageAccessor(F->getName()))
@@ -519,9 +519,9 @@ bool ProcessFuncAttributes::runOnModule(Module &M) {
// Check all "ExternalLinkage" functions. Func declarations = Import, Func definition = Export
if (F->hasExternalLinkage() && F->getCallingConv() == CallingConv::SPIR_FUNC) {
// builtins should not be externally linked, they will always be resolved by IGC
- return !(F->hasFnAttribute("OclBuiltin") || F->getName().startswith("__builtin_") ||
- F->getName().startswith("__igcbuiltin_") || F->getName().startswith("llvm.") ||
- F->getName().equals("printf") || Regex("^_Z[0-9]+__builtin_bf16").match(F->getName()) ||
+ return !(F->hasFnAttribute("OclBuiltin") || F->getName().starts_with("__builtin_") ||
+ F->getName().starts_with("__igcbuiltin_") || F->getName().starts_with("llvm.") ||
+ F->getName() == "printf" || Regex("^_Z[0-9]+__builtin_bf16").match(F->getName()) ||
Regex("^_Z[0-9]+__spirv_").match(F->getName()) || Regex("^_Z[0-9]+__builtin_spirv").match(F->getName()));
}
return false;
@@ -529,7 +529,7 @@ bool ProcessFuncAttributes::runOnModule(Module &M) {
// If a builtin func is a FP64 one with the given prefix, return true.
auto IsBuiltinFP64WithPrefix = [](Function *F, const std::string &Prefix) {
- if (F->getName().startswith(Prefix)) {
+ if (F->getName().starts_with(Prefix)) {
if (F->getReturnType()->isDoubleTy() ||
(F->getReturnType()->isVectorTy() && F->getReturnType()->getContainedType(0)->isDoubleTy())) {
auto functionName = F->getName();
@@ -710,7 +710,7 @@ bool ProcessFuncAttributes::runOnModule(Module &M) {
bool defaultStackCall = IGC_IS_FLAG_ENABLED(EnableStackCallFuncCall);
// Add always attribute if function is a builtin
- if (F->hasFnAttribute("OclBuiltin") || F->getName().startswith("__builtin_spirv_")) {
+ if (F->hasFnAttribute("OclBuiltin") || F->getName().starts_with("__builtin_spirv_")) {
// OptNone builtins are special versions of builtins assuring that all
// theirs parameters are constant values.
if (isOptNoneBuiltin(F->getName())) {
@@ -910,18 +910,18 @@ bool ProcessFuncAttributes::runOnModule(Module &M) {
StringRef sline(line);
// Ignore empty, whitespace lines, or is comment
- if (sline.trim().empty() || sline.startswith("//"))
+ if (sline.trim().empty() || sline.starts_with("//"))
continue;
- if (sline.equals("FLAG_FCALL_DEFAULT:"))
+ if (sline == "FLAG_FCALL_DEFAULT:")
FunctionControlMode = FLAG_FCALL_DEFAULT;
- else if (sline.equals("FLAG_FCALL_FORCE_INLINE:"))
+ else if (sline == "FLAG_FCALL_FORCE_INLINE:")
FunctionControlMode = FLAG_FCALL_FORCE_INLINE;
- else if (sline.equals("FLAG_FCALL_FORCE_SUBROUTINE:"))
+ else if (sline == "FLAG_FCALL_FORCE_SUBROUTINE:")
FunctionControlMode = FLAG_FCALL_FORCE_SUBROUTINE;
- else if (sline.equals("FLAG_FCALL_FORCE_STACKCALL:"))
+ else if (sline == "FLAG_FCALL_FORCE_STACKCALL:")
FunctionControlMode = FLAG_FCALL_FORCE_STACKCALL;
- else if (sline.equals("FLAG_FCALL_FORCE_INDIRECTCALL:"))
+ else if (sline == "FLAG_FCALL_FORCE_INDIRECTCALL:")
FunctionControlMode = FLAG_FCALL_FORCE_INDIRECTCALL;
else if (Function *F = M.getFunction(line)) {
diff --git a/IGC/AdaptorCommon/RayTracing/NewTraceRayInlineLoweringPass.cpp b/IGC/AdaptorCommon/RayTracing/NewTraceRayInlineLoweringPass.cpp
index 1986148..26136b7 100644
--- a/IGC/AdaptorCommon/RayTracing/NewTraceRayInlineLoweringPass.cpp
+++ b/IGC/AdaptorCommon/RayTracing/NewTraceRayInlineLoweringPass.cpp
@@ -88,7 +88,7 @@ bool InlineRaytracing::LowerAllocations(Function &F) {
auto *getRQHandleFromRQObjectFn = m_Functions[GET_RQ_HANDLE_FROM_RQ_OJECT] = Function::Create(
getRQHandleFromRQObjectFnTy, GlobalValue::PrivateLinkage, VALUE_NAME("getRQHandleFromRQObjectFn"), F.getParent());
- getStackPointerFn->addParamAttr(0, llvm::Attribute::NoCapture);
+ getStackPointerFn->addParamAttr(0, llvm::Attribute::Captures);
// allocate rayquery instructions return i32 handle
// we want all rayqueries to be represent via our struct
@@ -505,7 +505,7 @@ void InlineRaytracing::LowerIntrinsics(Function &F) {
CallInst *traceRay = IRB.createSyncTraceRay(bvhLevel, traceRayCtrl, globalBufferPtr);
// add this for liveness analysis
- traceRay->addParamAttr(0, llvm::Attribute::NoCapture);
+ traceRay->addParamAttr(0, llvm::Attribute::Captures);
IRB.createReadSyncTraceRay(traceRay);
diff --git a/IGC/AdaptorCommon/RayTracing/RTBuilder.cpp b/IGC/AdaptorCommon/RayTracing/RTBuilder.cpp
index 73417bb..c4340b7 100644
--- a/IGC/AdaptorCommon/RayTracing/RTBuilder.cpp
+++ b/IGC/AdaptorCommon/RayTracing/RTBuilder.cpp
@@ -1545,7 +1545,7 @@ Value *RTBuilder::getGlobalBufferPtrForSlot(IGC::ADDRESS_SPACE Addrspace, Value
auto *offset = CreateMul(slot, getInt32(IGC::Align(sizeof(RayDispatchGlobalData), IGC::RTGlobalsAlign)));
- auto *globalBufferPtr = CreateBitCast(mainGlobalBufferPtr, getInt8PtrTy(ADDRESS_SPACE_CONSTANT));
+ auto *globalBufferPtr = CreateBitCast(mainGlobalBufferPtr, PointerType::get(getInt8Ty(), ADDRESS_SPACE_CONSTANT));
globalBufferPtr = CreateInBoundsGEP(getInt8Ty(), globalBufferPtr, offset);
globalBufferPtr = CreateBitCast(globalBufferPtr, mainGlobalBufferPtr->getType(), VALUE_NAME("globalBuffer[]"));
@@ -1619,7 +1619,7 @@ enum class RaytracingType {
// will later be updated to null values with the actual types.
NamedMDNode *initTypeMD(Module &M, uint32_t NumEntries) {
auto *TypesMD = M.getOrInsertNamedMetadata(RaytracingTypesMDName);
- auto *Val = UndefValue::get(Type::getInt8PtrTy(M.getContext()));
+ auto *Val = UndefValue::get(PointerType::get(Type::getInt8Ty(M.getContext()), 0));
auto *Node = MDNode::get(M.getContext(), ConstantAsMetadata::get(Val));
for (uint32_t i = 0; i < NumEntries; i++)
@@ -1792,9 +1792,9 @@ Instruction *RTBuilder::getEntryFirstInsertionPointInBlock(BasicBlock &block,
return curInsertPoint;
}
-Type *RTBuilder::getInt64PtrTy(unsigned int AddrSpace) const { return Type::getInt64PtrTy(this->Context, AddrSpace); }
+Type *RTBuilder::getInt64PtrTy(unsigned int AddrSpace) const { return PointerType::get(Type::getInt64Ty(this->Context), AddrSpace); }
-Type *RTBuilder::getInt32PtrTy(unsigned int AddrSpace) const { return Type::getInt32PtrTy(this->Context, AddrSpace); }
+Type *RTBuilder::getInt32PtrTy(unsigned int AddrSpace) const { return PointerType::get(Type::getInt32Ty(this->Context), AddrSpace); }
IGC::RTMemoryStyle RTBuilder::getMemoryStyle() const { return Ctx.getModuleMetaData()->rtInfo.MemStyle; }
@@ -1836,12 +1836,12 @@ GenIntrinsicInst *RTBuilder::createDummyInstID(Value *pSrcVal) {
}
CallInst *RTBuilder::ctlz(Value *V) {
- auto *Ctlz = Intrinsic::getDeclaration(GetInsertBlock()->getModule(), Intrinsic::ctlz, V->getType());
+ auto *Ctlz = Intrinsic::getOrInsertDeclaration(GetInsertBlock()->getModule(), Intrinsic::ctlz, V->getType());
return CreateCall2(Ctlz, V, getFalse(), VALUE_NAME("lzd"));
}
CallInst *RTBuilder::cttz(Value *V) {
- auto *Cttz = Intrinsic::getDeclaration(GetInsertBlock()->getModule(), Intrinsic::cttz, V->getType());
+ auto *Cttz = Intrinsic::getOrInsertDeclaration(GetInsertBlock()->getModule(), Intrinsic::cttz, V->getType());
return CreateCall2(Cttz, V, getFalse(), VALUE_NAME("cttz"));
}
diff --git a/IGC/AdaptorCommon/RayTracing/TraceRayInlineLoweringPass.cpp b/IGC/AdaptorCommon/RayTracing/TraceRayInlineLoweringPass.cpp
index fb1566b..f38d704 100644
--- a/IGC/AdaptorCommon/RayTracing/TraceRayInlineLoweringPass.cpp
+++ b/IGC/AdaptorCommon/RayTracing/TraceRayInlineLoweringPass.cpp
@@ -823,7 +823,7 @@ bool RTGlobalsPointerLoweringPass::runOnFunction(Function &F) {
uint32_t Addrspace = rtGlobalsPtr->getType()->getPointerAddressSpace();
auto *LaneId = builder.get32BitLaneID();
auto *Cond = builder.CreateICmpULT(LaneId, builder.getInt32(numLanes(SIMDMode::SIMD16)));
- auto *Ptr = builder.CreateBitCast(rtGlobalsPtr, builder.getInt8PtrTy(Addrspace));
+ auto *Ptr = builder.CreateBitCast(rtGlobalsPtr, PointerType::get(builder.getInt8Ty(), Addrspace));
// UMD will allocate back-to-back RTGlobals if requested. The upper
// 16 lanes will get the pointer to the second one.
// We need at least 64-byte alignment. Let's just align both
diff --git a/IGC/AdaptorOCL/ResolveConstExprCalls.cpp b/IGC/AdaptorOCL/ResolveConstExprCalls.cpp
index 8948bf2..74a50fb 100644
--- a/IGC/AdaptorOCL/ResolveConstExprCalls.cpp
+++ b/IGC/AdaptorOCL/ResolveConstExprCalls.cpp
@@ -101,7 +101,7 @@ bool transformConstExprCastCall(CallInst &Call) {
return false; // Cannot transform this parameter value.
AttrBuilder AB(FT->getContext(), CallerPAL.getParamAttrs(i));
- if (AB.overlaps(AttributeFuncs::typeIncompatible(ParamTy)))
+ if (AB.overlaps(AttributeFuncs::typeIncompatible(ParamTy, CallerPAL.getParamAttrs(i))))
return false; // Attribute not compatible with transformed value.
if (Call.isInAllocaArgument(i))
@@ -150,7 +150,7 @@ bool transformConstExprCastCall(CallInst &Call) {
AttrBuilder RAttrs(FT->getContext(), CallerPAL.getRetAttrs());
// If the return value is not being used, the type may not be compatible
// with the existing attributes. Wipe out any problematic attributes.
- RAttrs.remove(AttributeFuncs::typeIncompatible(NewRetTy));
+ RAttrs.remove(AttributeFuncs::typeIncompatible(NewRetTy, CallerPAL.getRetAttrs()));
LLVMContext &Ctx = Call.getContext();
AI = Call.arg_begin();
diff --git a/IGC/AdaptorOCL/UnifyIROCL.cpp b/IGC/AdaptorOCL/UnifyIROCL.cpp
index 76e5f77..2f46128 100644
--- a/IGC/AdaptorOCL/UnifyIROCL.cpp
+++ b/IGC/AdaptorOCL/UnifyIROCL.cpp
@@ -160,7 +160,7 @@ int getOCLMajorVersion(const SPIRMD::SpirMetaDataUtils &spirMDUtils) {
// check compiler options
for (auto i = spirMDUtils.getCompilerOptionsItem(0)->begin(), e = spirMDUtils.getCompilerOptionsItem(0)->end();
i != e; ++i) {
- if (StringRef(*i).startswith("-cl-std=CL") && i->length() >= 13) {
+ if (StringRef(*i).starts_with("-cl-std=CL") && i->length() >= 13) {
oclMajor = i->at(10) - '0';
oclMinor = i->at(12) - '0';
break;
@@ -297,7 +297,7 @@ static void CommonOCLBasedPasses(OpenCLProgramContext *pContext) {
// right now we don't support any standard function in the code gen
// maybe we want to support some at some point to take advantage of LLVM optimizations
- TargetLibraryInfoImpl TLI;
+ TargetLibraryInfoImpl TLI(Triple(pContext->getModule()->getTargetTriple()));
TLI.disableAllFunctions();
mpm.add(new llvm::TargetLibraryInfoWrapperPass(TLI));
diff --git a/IGC/AdaptorOCL/Utils/IGCCSPIRVSupportTblGen/IGCCSPIRVSupportTblGen.cpp b/IGC/AdaptorOCL/Utils/IGCCSPIRVSupportTblGen/IGCCSPIRVSupportTblGen.cpp
index 704afd4..3d408b9 100644
--- a/IGC/AdaptorOCL/Utils/IGCCSPIRVSupportTblGen/IGCCSPIRVSupportTblGen.cpp
+++ b/IGC/AdaptorOCL/Utils/IGCCSPIRVSupportTblGen/IGCCSPIRVSupportTblGen.cpp
@@ -580,7 +580,7 @@ cl::opt<ActionType> Action(
"Generate IGCCompute SPIR-V extension support query header (structures + query functions)")));
} // namespace
-static bool OptionsAndDocsTblgenMain(raw_ostream &OS, RecordKeeper &Records) {
+static bool OptionsAndDocsTblgenMain(raw_ostream &OS, const RecordKeeper &Records) {
switch (Action) {
case EmitSPIRVDocs:
emitSPIRVDocs(Records, OS);
diff --git a/IGC/AdaptorOCL/dllInterfaceCompute.cpp b/IGC/AdaptorOCL/dllInterfaceCompute.cpp
index e52712f..c9e9c09 100644
--- a/IGC/AdaptorOCL/dllInterfaceCompute.cpp
+++ b/IGC/AdaptorOCL/dllInterfaceCompute.cpp
@@ -658,12 +658,12 @@ bool ProcessElfInput(STB_TranslateInputArgs &InputArgs, STB_TranslateOutputArgs
}
Context.getLLVMContext()->setDiagnosticHandlerCallBack(
- [](const llvm::DiagnosticInfo &DI, void *Ptr) {
- if (DI.getSeverity() == llvm::DS_Error) {
+ [](const llvm::DiagnosticInfo *DI, void *Ptr) {
+ if (DI->getSeverity() == llvm::DS_Error) {
auto *S = static_cast<std::string *>(Ptr);
llvm::raw_string_ostream OS(*S);
llvm::DiagnosticPrinterRawOStream DP(OS);
- DI.print(DP);
+ DI->print(DP);
OS << '\n';
}
},
@@ -811,7 +811,7 @@ bool ParseInput(llvm::Module *&pKernelModule, const STB_TranslateInputArgs *pInp
// IGC does not handle legacy ocl binary for now (legacy ocl binary
// is the binary that contains text LLVM IR (2.7 or 3.0).
- if (!strInput.startswith("BC")) {
+ if (!strInput.starts_with("BC")) {
bool isLLVM27IR = false, isLLVM30IR = false;
if (strInput.find("triple = \"GHAL3D") != llvm::StringRef::npos) {
@@ -1002,7 +1002,7 @@ bool TranslateBuildSPMD(const STB_TranslateInputArgs *pInputArgs, STB_TranslateO
llvm::StringRef unrollMaxUpperBoundFlag = "-unroll-max-upperbound=16";
auto unrollMaxUpperBoundSwitch = optionsMap.find(unrollMaxUpperBoundFlag.trim("-=16"));
if (unrollMaxUpperBoundSwitch != optionsMap.end()) {
- if (unrollMaxUpperBoundSwitch->getValue()->getNumOccurrences() == 0) {
+ if (unrollMaxUpperBoundSwitch->second->getNumOccurrences() == 0) {
args.push_back(unrollMaxUpperBoundFlag.data());
}
}
@@ -1014,7 +1014,7 @@ bool TranslateBuildSPMD(const STB_TranslateInputArgs *pInputArgs, STB_TranslateO
llvm::StringRef instCombineFlag = "-instcombine-code-sinking=0";
auto instCombineSinkingSwitch = optionsMap.find(instCombineFlag.trim("-=0"));
if (instCombineSinkingSwitch != optionsMap.end()) {
- if (instCombineSinkingSwitch->getValue()->getNumOccurrences() == 0) {
+ if (instCombineSinkingSwitch->second->getNumOccurrences() == 0) {
args.push_back(instCombineFlag.data());
}
}
@@ -1026,7 +1026,7 @@ bool TranslateBuildSPMD(const STB_TranslateInputArgs *pInputArgs, STB_TranslateO
llvm::StringRef licmMSSAPromotionFlag = "-licm-mssa-max-acc-promotion=500";
auto licmMSSAPromotionSwitch = optionsMap.find(licmMSSAPromotionFlag.trim("-=500"));
if (licmMSSAPromotionSwitch != optionsMap.end()) {
- if (licmMSSAPromotionSwitch->getValue()->getNumOccurrences() == 0) {
+ if (licmMSSAPromotionSwitch->second->getNumOccurrences() == 0) {
args.push_back(licmMSSAPromotionFlag.data());
}
}
@@ -1035,7 +1035,7 @@ bool TranslateBuildSPMD(const STB_TranslateInputArgs *pInputArgs, STB_TranslateO
llvm::StringRef aaQueryDepthFlag = "-basic-aa-max-query-depth=192";
auto aaQueryDepthSwitch = optionsMap.find(aaQueryDepthFlag.trim("-=192"));
if (aaQueryDepthSwitch != optionsMap.end()) {
- if (aaQueryDepthSwitch->getValue()->getNumOccurrences() == 0) {
+ if (aaQueryDepthSwitch->second->getNumOccurrences() == 0) {
args.push_back(aaQueryDepthFlag.data());
}
}
@@ -1043,7 +1043,7 @@ bool TranslateBuildSPMD(const STB_TranslateInputArgs *pInputArgs, STB_TranslateO
llvm::StringRef dsePartialOverwriteTrackingFlag = "-enable-dse-partial-overwrite-tracking=1";
auto dsePartialOverwriteTrackingSwitch = optionsMap.find(dsePartialOverwriteTrackingFlag.trim("-=1"));
if (dsePartialOverwriteTrackingSwitch != optionsMap.end()) {
- if (dsePartialOverwriteTrackingSwitch->getValue()->getNumOccurrences() == 0) {
+ if (dsePartialOverwriteTrackingSwitch->second->getNumOccurrences() == 0) {
args.push_back(dsePartialOverwriteTrackingFlag.data());
}
}
@@ -1051,7 +1051,7 @@ bool TranslateBuildSPMD(const STB_TranslateInputArgs *pInputArgs, STB_TranslateO
llvm::StringRef dseMSSAStepLimitFlag = "-dse-memoryssa-walklimit=150";
auto dseMSSAStepLimitSwitch = optionsMap.find(dseMSSAStepLimitFlag.trim("-=150"));
if (dseMSSAStepLimitSwitch != optionsMap.end()) {
- if (dseMSSAStepLimitSwitch->getValue()->getNumOccurrences() == 0) {
+ if (dseMSSAStepLimitSwitch->second->getNumOccurrences() == 0) {
args.push_back(dseMSSAStepLimitFlag.data());
}
}
@@ -1063,7 +1063,7 @@ bool TranslateBuildSPMD(const STB_TranslateInputArgs *pInputArgs, STB_TranslateO
for (const auto indVarSimplifyFlag : indVarSimplifyFlags) {
auto indVarSimplifySwitch = optionsMap.find(indVarSimplifyFlag.drop_front(1).split("=").first);
if (indVarSimplifySwitch != optionsMap.end()) {
- if (indVarSimplifySwitch->getValue()->getNumOccurrences() == 0) {
+ if (indVarSimplifySwitch->second->getNumOccurrences() == 0) {
args.push_back(indVarSimplifyFlag.data());
}
}
@@ -1257,7 +1257,7 @@ bool TranslateBuildSPMD(const STB_TranslateInputArgs *pInputArgs, STB_TranslateO
oclContext.getModuleMetaData()->csInfo.forcedSIMDSize |= IGC_GET_FLAG_VALUE(ForceOCLSIMDWidth);
try {
- if (llvm::StringRef(oclContext.getModule()->getTargetTriple()).startswith("spir")) {
+ if (oclContext.getModule()->getTargetTriple().getTriple().starts_with("spir")) {
IGC::UnifyIRSPIR(&oclContext);
} else // not SPIR
{
diff --git a/IGC/AdaptorOCL/ocl_igc_interface/impl/fcl_ocl_translation_ctx_impl.cpp b/IGC/AdaptorOCL/ocl_igc_interface/impl/fcl_ocl_translation_ctx_impl.cpp
index b7210f0..4e3842c 100644
--- a/IGC/AdaptorOCL/ocl_igc_interface/impl/fcl_ocl_translation_ctx_impl.cpp
+++ b/IGC/AdaptorOCL/ocl_igc_interface/impl/fcl_ocl_translation_ctx_impl.cpp
@@ -318,7 +318,7 @@ static bool processCmSrcOptions(llvm::SmallVectorImpl<const char *> &userArgs, s
optname += "=";
toErase = std::find_if(userArgs.begin(), userArgs.end(), [&optname](const auto &Item) {
llvm::StringRef S = Item;
- return S.startswith(optname);
+ return S.starts_with(optname);
});
if (toErase != userArgs.end()) {
inputFile = *toErase;
diff --git a/IGC/AdaptorOCL/preprocess_spvir/HandleSPIRVDecorations/HandleSpirvDecorationMetadata.cpp b/IGC/AdaptorOCL/preprocess_spvir/HandleSPIRVDecorations/HandleSpirvDecorationMetadata.cpp
index a84ae58..0912c70 100644
--- a/IGC/AdaptorOCL/preprocess_spvir/HandleSPIRVDecorations/HandleSpirvDecorationMetadata.cpp
+++ b/IGC/AdaptorOCL/preprocess_spvir/HandleSPIRVDecorations/HandleSpirvDecorationMetadata.cpp
@@ -556,7 +556,7 @@ void HandleSpirvDecorationMetadata::handleCacheControlINTELFor1DBlockIO(CallInst
void HandleSpirvDecorationMetadata::handleCacheControlINTELForOCL1DBlockPrefetch(CallInst &I,
SmallPtrSetImpl<MDNode *> &MDNodes,
SmallVectorImpl<StringRef> &Matches) {
- IGC_ASSERT(Matches[1].startswith("intel_sub_group_block_prefetch"));
+ IGC_ASSERT(Matches[1].starts_with("intel_sub_group_block_prefetch"));
CacheControlFromMDNodes cacheControl = resolveCacheControlFromMDNodes<LoadCacheControl>(m_pCtx, MDNodes);
if (cacheControl.isEmpty)
@@ -575,13 +575,13 @@ void HandleSpirvDecorationMetadata::handleCacheControlINTELForOCL1DBlockPrefetch
numElementsToPrefetch == 8 || numElementsToPrefetch == 16);
uint32_t typeSizeInBytes = 0;
- if (Matches[2].equals("uc"))
+ if (Matches[2] == "uc")
typeSizeInBytes = 1;
- else if (Matches[2].equals("us"))
+ else if (Matches[2] == "us")
typeSizeInBytes = 2;
- else if (Matches[2].equals("ui"))
+ else if (Matches[2] == "ui")
typeSizeInBytes = 4;
- else if (Matches[2].equals("ul"))
+ else if (Matches[2] == "ul")
typeSizeInBytes = 8;
else
IGC_ASSERT(0 && "Unsupported type prefetch!");
diff --git a/IGC/AdaptorOCL/preprocess_spvir/PreprocessSPVIR.cpp b/IGC/AdaptorOCL/preprocess_spvir/PreprocessSPVIR.cpp
index 891376f..28b74f4 100644
--- a/IGC/AdaptorOCL/preprocess_spvir/PreprocessSPVIR.cpp
+++ b/IGC/AdaptorOCL/preprocess_spvir/PreprocessSPVIR.cpp
@@ -67,7 +67,7 @@ void PreprocessSPVIR::createCallAndReplace(CallInst &oldCallInst, StringRef newF
// IGC supports clang-consistent representation of printf (which is unmangled,
// variadic function), all printf calls must get replaced.
void PreprocessSPVIR::visitOpenCLEISPrintf(llvm::CallInst &CI) {
- FunctionType *FT = FunctionType::get(CI.getType(), Type::getInt8PtrTy(m_Module->getContext(), 2), true);
+ FunctionType *FT = FunctionType::get(CI.getType(), PointerType::get(Type::getInt8Ty(m_Module->getContext()), 2), true);
Function *newPrintf = cast<Function>(m_Module->getOrInsertFunction("printf", FT));
CI.setCalledFunction(newPrintf);
@@ -194,7 +194,7 @@ void PreprocessSPVIR::removePointerAnnotations(Module &M) {
if (!CI)
continue;
auto *Callee = CI->getCalledFunction();
- if (!Callee || !Callee->getName().startswith("llvm.ptr.annotation."))
+ if (!Callee || !Callee->getName().starts_with("llvm.ptr.annotation."))
continue;
// @llvm.ptr.annotation returns its first operand (the annotated pointer)
@@ -248,7 +248,7 @@ static void fixKernelArgBaseTypes(Module &M) {
StringRef Ty = TyStr->getString();
StringRef Base = BaseStr->getString();
- if (Ty.endswith("_t") && Ty != Base) {
+ if (Ty.ends_with("_t") && Ty != Base) {
NeedPatch = true;
NewBase.push_back(MDString::get(Ctx, Ty));
} else {
diff --git a/IGC/AdaptorOCL/preprocess_spvir/PromoteSubByte.cpp b/IGC/AdaptorOCL/preprocess_spvir/PromoteSubByte.cpp
index 94284a2..269cb05 100644
--- a/IGC/AdaptorOCL/preprocess_spvir/PromoteSubByte.cpp
+++ b/IGC/AdaptorOCL/preprocess_spvir/PromoteSubByte.cpp
@@ -520,7 +520,7 @@ Function *PromoteSubByte::promoteFunction(Function *function) {
}
#if !defined(WDDM_ANDROID_IGC)
- if (BiFManager::BiFManagerHandler::IsBiF(function) || function->getName().startswith("__builtin_IB_") ||
+ if (BiFManager::BiFManagerHandler::IsBiF(function) || function->getName().starts_with("__builtin_IB_") ||
function->getName() == "intel_sub_group_ballot" ||
function->getName().contains("intel_is_device_barrier_valid")) {
return function;
diff --git a/IGC/BiFManager/BiFManagerHandler.cpp b/IGC/BiFManager/BiFManagerHandler.cpp
index f1e5704..a1c7335 100644
--- a/IGC/BiFManager/BiFManagerHandler.cpp
+++ b/IGC/BiFManager/BiFManagerHandler.cpp
@@ -244,7 +244,7 @@ void BiFManagerHandler::preapareBiFSections(llvm::Module &pMainModule, TFunction
if (T == "") {
bifGenericSection.setTargetTriple(builtinSizeModule()->getTargetTriple());
} else {
- bifGenericSection.setTargetTriple(T);
+ bifGenericSection.setTargetTriple(llvm::Triple(T));
}
}
if (DL == nullptr) {
diff --git a/IGC/BiFManager/CMakeLists.txt b/IGC/BiFManager/CMakeLists.txt
index 6b91831..868fa69 100644
--- a/IGC/BiFManager/CMakeLists.txt
+++ b/IGC/BiFManager/CMakeLists.txt
@@ -24,7 +24,7 @@ set(IGC_BUILD__PROJ__BiFManager_EXE "${IGC_BUILD__PROJ__BiFManager_EXE}" PAREN
set(IGC_BUILD__PROJ__BiFManager "${IGC_BUILD__PROJ__BiFManager}" PARENT_SCOPE)
set(IGC_BUILD__PROJ_LABEL__BiFManager "${IGC_BUILD__PROJ__BiFManager}")
-add_library("${IGC_BUILD__PROJ__BiFManager}"
+add_library("${IGC_BUILD__PROJ__BiFManager}" STATIC
"${CMAKE_CURRENT_SOURCE_DIR}/BiFManagerHandler.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/BiFManagerCommon.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/BiFManagerHandler.hpp"
diff --git a/IGC/BiFModule/cmake/BiFBuildBitcode.cmake b/IGC/BiFModule/cmake/BiFBuildBitcode.cmake
index e92c6d3..abc26f2 100644
--- a/IGC/BiFModule/cmake/BiFBuildBitcode.cmake
+++ b/IGC/BiFModule/cmake/BiFBuildBitcode.cmake
@@ -190,7 +190,7 @@ function(igc_bif_build_bc)
# forcibly included headers or change of additional dependencies.
execute_process(
COMMAND "${CMAKE_COMMAND}" -E make_directory "${_outBcFileDir}"
- COMMAND ${clang-tool} -cc1 ${IGC_BUILD__OPAQUE_POINTERS_DEFAULT_ARG_CLANG} -x cl -fblocks -fpreserve-vec3-type -opencl-builtins "-triple=${_archTriple}" -w -emit-llvm-bc -discard-value-names -o "${_bcTempFilePath}" ${_pchFlags} ${_incFileFlags} ${_includeDirsFlags} ${_defineFlags} ${_options_DEFAULT} ${_options_CL} "${_srcFilePath}"
+ COMMAND ${clang-tool} -cc1 ${IGC_BUILD__OPAQUE_POINTERS_DEFAULT_ARG_CLANG} -x cl -fblocks -Wno-error=incompatible-pointer-types -Wno-error=incompatible-function-pointer-types -opencl-builtins "-triple=${_archTriple}" -w -emit-llvm-bc -discard-value-names -o "${_bcTempFilePath}" ${_pchFlags} ${_incFileFlags} ${_includeDirsFlags} ${_defineFlags} ${_options_DEFAULT} ${_options_CL} "${_srcFilePath}"
COMMAND_ECHO STDOUT
)
execute_process(
diff --git a/IGC/CMakeLists.txt b/IGC/CMakeLists.txt
index 295e13b..f4d6d68 100644
--- a/IGC/CMakeLists.txt
+++ b/IGC/CMakeLists.txt
@@ -120,7 +120,7 @@ else()
set(_buildType "Release")
message(WARNING "CMAKE_BUILD_TYPE: No build configuration specified. The following configurations are available: ${IGC_CMAKE_CONFIGURATION_TYPES}.\nThe \"${_buildType}\" configuration will be used.\nThis value has meaning only for single-configuration generators (like Make). It will be ignored for MSVC/XCode.")
endif()
- set(CMAKE_BUILD_TYPE "${_buildType}")
+#_cmake_modify_IGNORE set(CMAKE_BUILD_TYPE "${_buildType}")
unset(_buildType)
endif()
@@ -820,7 +820,7 @@ foreach(_compilerFlagName IN ITEMS "CMAKE_CXX_FLAGS" "CMAKE_C_FLAGS")
ExceptionsEnabled
MultiProcessorCompilation
DeadCodeEliminate
- TreatWarnAsErrorEnabled
+ TreatWarnAsErrorDisabled
)
if(IGC_OPTION__UNIVERSAL_DRIVER)
@@ -1053,7 +1053,6 @@ foreach(_compilerFlagName IN ITEMS "CMAKE_CXX_FLAGS" "CMAKE_C_FLAGS")
string(FIND ${CMAKE_CXX_FLAGS} "-D_FORTIFY_SOURCE=3" __FORTIFY_SOURCE_3_SET)
set(flags -fstack-protector)
if(${__FORTIFY_SOURCE_3_SET} EQUAL -1)
- list(APPEND flags -D_FORTIFY_SOURCE=2)
endif()
igc_config_flag_apply_settings(
CompilerOptions
diff --git a/IGC/Compiler/Builtins/BIFFlagCtrl/BIFFlagCtrlResolution.cpp b/IGC/Compiler/Builtins/BIFFlagCtrl/BIFFlagCtrlResolution.cpp
index d97defe..cdcff0f 100644
--- a/IGC/Compiler/Builtins/BIFFlagCtrl/BIFFlagCtrlResolution.cpp
+++ b/IGC/Compiler/Builtins/BIFFlagCtrl/BIFFlagCtrlResolution.cpp
@@ -56,7 +56,7 @@ void BIFFlagCtrlResolution::FillFlagCtrl() {
BIF_FLAG_CTRL_SET(UseBfn, IGC_IS_FLAG_ENABLED(EnableBfn) && PtrCGC->platform.supportBfnInstruction());
BIF_FLAG_CTRL_SET(hasHWLocalThreadID, PtrCGC->platform.hasHWLocalThreadID());
BIF_FLAG_CTRL_SET(CRMacros, PtrCGC->platform.hasCorrectlyRoundedMacros());
- BIF_FLAG_CTRL_SET(APIRS, !(StringRef(PtrCGC->getModule()->getTargetTriple()).size() > 0));
+ BIF_FLAG_CTRL_SET(APIRS, !(PtrCGC->getModule()->getTargetTriple().empty() == false));
if (PtrCGC->type == ShaderType::OPENCL_SHADER) {
BIF_FLAG_CTRL_SET(IsSPIRV, static_cast<OpenCLProgramContext *>(PtrCGC)->isSPIRV());
diff --git a/IGC/Compiler/CISACodeGen/AdvCodeMotion.cpp b/IGC/Compiler/CISACodeGen/AdvCodeMotion.cpp
index f2fa188..eca4466 100644
--- a/IGC/Compiler/CISACodeGen/AdvCodeMotion.cpp
+++ b/IGC/Compiler/CISACodeGen/AdvCodeMotion.cpp
@@ -202,7 +202,8 @@ void WorkItemSetting::collect(Function *F) {
Value *X = nullptr;
ICmpInst::Predicate Pred;
if (match(Inst,
- m_Select(m_ICmp(Pred, m_Specific(GlobalSize1.X), m_Zero()), m_Value(X), m_Specific(GlobalSize1.X))) &&
+ m_Select(m_ICmp(m_Specific(GlobalSize1.X), m_Zero()), m_Value(X), m_Specific(GlobalSize1.X))) &&
+ (Pred = cast<ICmpInst>(cast<SelectInst>(Inst)->getCondition())->getPredicate(), true) &&
Pred == ICmpInst::ICMP_EQ) {
GlobalSize.X = Inst;
}
@@ -776,9 +777,9 @@ static bool sliceCandidateRun(BasicBlock *BB, ArrayRef<Instruction *> Run) {
DenseMap<Instruction * /*Leader*/, Instruction * /*Pos*/> Leaders;
for (auto I = ECs.begin(), E = ECs.end(); I != E; ++I) {
- if (!I->isLeader())
+ if (!(*I)->isLeader())
continue;
- Instruction *Leader = I->getData();
+ Instruction *Leader = (*I)->getData();
Leaders.insert(std::make_pair(Leader, nullptr));
}
@@ -857,13 +858,13 @@ bool MadLoopSlice::sliceLoop(Loop *L) const {
}
DenseMap<Instruction * /*Leader*/, Instruction * /*Pos*/> Leaders;
for (auto I = ECs.begin(), E = ECs.end(); I != E; ++I) {
- if (!I->isLeader())
+ if (!(*I)->isLeader())
continue;
- Instruction *Leader = I->getData();
+ Instruction *Leader = (*I)->getData();
// Skip EC with the loop condition.
if (ECs.isEquivalent(Leader, BI))
continue;
- for (auto MI = ECs.member_begin(I), ME = ECs.member_end(); MI != ME; ++MI) {
+ for (auto MI = ECs.member_begin(**I), ME = ECs.member_end(); MI != ME; ++MI) {
// Skip the slicing if there is non-MAD instructions.
if (!isa<PHINode>(*MI) && !isCandidateMAD(*MI, CGC))
return false;
diff --git a/IGC/Compiler/CISACodeGen/AtomicOptPass.cpp b/IGC/Compiler/CISACodeGen/AtomicOptPass.cpp
index a0aeeef..085666e 100644
--- a/IGC/Compiler/CISACodeGen/AtomicOptPass.cpp
+++ b/IGC/Compiler/CISACodeGen/AtomicOptPass.cpp
@@ -12,6 +12,7 @@ SPDX-License-Identifier: MIT
#include "Compiler/IGCPassSupport.h"
#include "GenISAIntrinsics/GenIntrinsicInst.h"
+#include "common/LLVMUtils.h"
#include "common/LLVMWarningsPush.hpp"
#include "common/LLVMWarningsPop.hpp"
@@ -71,19 +72,19 @@ bool AtomicOptPass::checkFloatAtomicEmulation(Instruction *Inst, size_t &Operand
if (BbWithAtomic->hasNPredecessorsOrMore(3))
return false;
- BitCastInst *FirstBitcastInstr = dyn_cast<BitCastInst>(GInst->getNextNonDebugInstruction());
+ BitCastInst *FirstBitcastInstr = dyn_cast<BitCastInst>(IGC::getNextNonDbgInstruction(GInst));
if (!FirstBitcastInstr)
return false;
- Instruction *OpInstr = FirstBitcastInstr->getNextNonDebugInstruction();
+ Instruction *OpInstr = IGC::getNextNonDbgInstruction(FirstBitcastInstr);
if (!OpInstr || !OpInstr->isFast())
return false;
- BitCastInst *SecondBitcastInstr = dyn_cast<BitCastInst>(OpInstr->getNextNonDebugInstruction());
+ BitCastInst *SecondBitcastInstr = dyn_cast<BitCastInst>(IGC::getNextNonDbgInstruction(OpInstr));
if (!SecondBitcastInstr)
return false;
- GenIntrinsicInst *AtomicFinishInstr = dyn_cast<GenIntrinsicInst>(SecondBitcastInstr->getNextNonDebugInstruction());
+ GenIntrinsicInst *AtomicFinishInstr = dyn_cast<GenIntrinsicInst>(IGC::getNextNonDbgInstruction(SecondBitcastInstr));
if (!AtomicFinishInstr)
return false;
@@ -91,7 +92,7 @@ bool AtomicOptPass::checkFloatAtomicEmulation(Instruction *Inst, size_t &Operand
if (AtomicFinishInstr->getIntrinsicID() != GenISAIntrinsic::GenISA_icmpxchgatomicrawA64)
return false;
- CmpInst *CmpInstr = dyn_cast<CmpInst>(AtomicFinishInstr->getNextNonDebugInstruction());
+ CmpInst *CmpInstr = dyn_cast<CmpInst>(IGC::getNextNonDbgInstruction(AtomicFinishInstr));
if (!CmpInstr)
return false;
@@ -104,9 +105,8 @@ bool AtomicOptPass::checkFloatAtomicEmulation(Instruction *Inst, size_t &Operand
else
return false;
- CmpInst::Predicate Pred = CmpInst::Predicate::ICMP_EQ;
Instruction *FinishInstr = cast<Instruction>(AtomicFinishInstr);
- auto CmpPattern = m_Cmp(Pred, m_Instruction(Inst), m_Instruction(FinishInstr));
+ auto CmpPattern = m_Cmp(m_Instruction(Inst), m_Instruction(FinishInstr));
if (!match(cast<Value>(CmpInstr), CmpPattern))
return false;
@@ -151,8 +151,8 @@ bool AtomicOptPass::runOnFunction(Function &F) {
size_t OperandPos = 0;
// Here we check if this is an atomic instruction emulation or not.
if (checkFloatAtomicEmulation(&I, OperandPos)) {
- Instruction *FirstBitcastInstr = I.getNextNonDebugInstruction();
- Instruction *MainInstr = FirstBitcastInstr->getNextNonDebugInstruction();
+ Instruction *FirstBitcastInstr = IGC::getNextNonDbgInstruction(&I);
+ Instruction *MainInstr = IGC::getNextNonDbgInstruction(FirstBitcastInstr);
BasicBlock *BbWithAtomic = I.getParent();
BasicBlock *BackBb = nullptr;
diff --git a/IGC/Compiler/CISACodeGen/BlockMemOpAddrScalarizationPass.cpp b/IGC/Compiler/CISACodeGen/BlockMemOpAddrScalarizationPass.cpp
index 6f1a6fe..39a8e70 100644
--- a/IGC/Compiler/CISACodeGen/BlockMemOpAddrScalarizationPass.cpp
+++ b/IGC/Compiler/CISACodeGen/BlockMemOpAddrScalarizationPass.cpp
@@ -10,6 +10,7 @@ SPDX-License-Identifier: MIT
#include <llvm/IR/Function.h>
#include "Compiler/IGCPassSupport.h"
+#include "common/LLVMUtils.h"
#include "common/LLVMWarningsPush.hpp"
#include "common/LLVMWarningsPop.hpp"
@@ -193,7 +194,7 @@ Value *BlockMemOpAddrScalarizationPass::insertBroadcast(Instruction *InstForBroa
if (isa<PHINode>(InstForBroadcast))
PlaceForInsert = InstForBroadcast->getParent()->getFirstNonPHI();
else
- PlaceForInsert = InstForBroadcast->getNextNonDebugInstruction();
+ PlaceForInsert = IGC::getNextNonDbgInstruction(InstForBroadcast);
IRBuilder<> Builder(PlaceForInsert);
diff --git a/IGC/Compiler/CISACodeGen/CodeSchedulingOptionsDef.h b/IGC/Compiler/CISACodeGen/CodeSchedulingOptionsDef.h
index 66baa86..26f1d9a 100644
--- a/IGC/Compiler/CISACodeGen/CodeSchedulingOptionsDef.h
+++ b/IGC/Compiler/CISACodeGen/CodeSchedulingOptionsDef.h
@@ -13,7 +13,7 @@ SPDX-License-Identifier: MIT
// Generate default options line:
// clang-format off
-// python3 -c "print('IGC_CodeSchedulingConfig=\"' + ';'.join([line.split(',')[1].strip() for line in open('CodeSchedulingOptionsDef.h') if line.strip().startswith('DECLARE_SCHEDULING_OPTION')]) + '\"')"
+// python3 -c "print('IGC_CodeSchedulingConfig=\"' + ';'.join([line.split(',')[1].strip() for line in open('CodeSchedulingOptionsDef.h') if line.strip().starts_with('DECLARE_SCHEDULING_OPTION')]) + '\"')"
// clang-format on
// Edge weights
diff --git a/IGC/Compiler/CISACodeGen/CodeSinking.cpp b/IGC/Compiler/CISACodeGen/CodeSinking.cpp
index f8c8e5c..3f5e954 100644
--- a/IGC/Compiler/CISACodeGen/CodeSinking.cpp
+++ b/IGC/Compiler/CISACodeGen/CodeSinking.cpp
@@ -16,6 +16,7 @@ See LICENSE.TXT for details.
#include <fstream>
#include "common/debug/Debug.hpp"
#include "common/debug/Dump.hpp"
+#include "common/LLVMUtils.h"
#include "common/Stats.hpp"
#include "common/LLVMUtils.h"
#include "common/LLVMWarningsPush.hpp"
@@ -64,7 +65,7 @@ static void ProcessDbgValueInst(BasicBlock &blk, DominatorTree *DT) {
PositionMap[inst] = &*def->getParent()->getFirstInsertionPt();
} else {
// Otherwise, insert the new instruction after the defining instruction.
- PositionMap[inst] = def->getNextNonDebugInstruction();
+ PositionMap[inst] = IGC::getNextNonDbgInstruction(def);
IGC_ASSERT(!isa<BranchInst>(def));
}
}
diff --git a/IGC/Compiler/CISACodeGen/ConstantCoalescing.cpp b/IGC/Compiler/CISACodeGen/ConstantCoalescing.cpp
index f95de91..d0d8af8 100644
--- a/IGC/Compiler/CISACodeGen/ConstantCoalescing.cpp
+++ b/IGC/Compiler/CISACodeGen/ConstantCoalescing.cpp
@@ -826,7 +826,7 @@ void ConstantCoalescing::SetAlignmentFromOffset(Instruction *load) {
}
IGC_ASSERT(offset != nullptr);
const DominatorTree &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree();
- KnownBits kb = computeKnownBits(offset, *dataLayout, 0 /*current depth*/, nullptr /*AssumptionCache*/, load, &DT);
+ KnownBits kb = computeKnownBits(offset, *dataLayout, nullptr /*AssumptionCache*/, load, &DT, true, 0 /*current depth*/);
uint32_t numTrailZeros = std::min(kb.countMinTrailingZeros(), Value::MaxAlignmentExponent);
alignment_t alignment = (1ull << std::min(kb.getBitWidth() - 1, numTrailZeros));
alignment = std::max<alignment_t>(alignment, m_ChunkMinAlignment);
diff --git a/IGC/Compiler/CISACodeGen/EmitVISAPass.cpp b/IGC/Compiler/CISACodeGen/EmitVISAPass.cpp
index 08ec898..7b721eb 100644
--- a/IGC/Compiler/CISACodeGen/EmitVISAPass.cpp
+++ b/IGC/Compiler/CISACodeGen/EmitVISAPass.cpp
@@ -24,6 +24,7 @@ SPDX-License-Identifier: MIT
#include "ShaderCodeGen.hpp"
#include "MemOpt.h" // helper functions related struct value.
#include "common/debug/Dump.hpp"
+#include "common/LLVMUtils.h"
#include "common/debug/Dump.hpp"
#include "common/igc_regkeys.hpp"
#include "common/Stats.hpp"
@@ -1004,7 +1005,7 @@ bool EmitPass::runOnFunction(llvm::Function &F) {
unsigned int curLineNumber = llvmInst->getDebugLoc().getLine();
auto &&srcFile = llvmInst->getDebugLoc()->getScope()->getFilename();
auto &&srcDir = llvmInst->getDebugLoc()->getScope()->getDirectory();
- if (!curSrcFile.equals(srcFile) || !curSrcDir.equals(srcDir)) {
+ if (!(curSrcFile == srcFile) || !(curSrcDir == srcDir)) {
curSrcFile = srcFile;
curSrcDir = srcDir;
m_pDebugEmitter->BeginEncodingMark();
@@ -2722,7 +2723,7 @@ void EmitPass::EmitInsertValueToStruct(InsertValueInst *inst) {
for (const auto &II : toBeCopied) {
// skip one that will be written by this inst
auto theIdx = inst->getIndices();
- if (theIdx.equals(II)) {
+ if ((llvm::ArrayRef<unsigned>(theIdx) == llvm::ArrayRef<unsigned>(II))) {
continue;
}
@@ -9677,16 +9678,16 @@ bool EmitPass::validateInlineAsmConstraints(llvm::CallInst *inst, SmallVector<St
// lambda for checking constraint types
auto CheckConstraintTypes = [this](StringRef str, CVariable *cv = nullptr) {
unsigned matchVal;
- if (str.equals("=rw")) {
+ if ((str == "=rw")) {
return true;
- } else if (str.equals("rw")) {
+ } else if ((str == "rw")) {
return true;
} else if (str.getAsInteger(10, matchVal) == 0) {
// Also allows matching input reg to output reg
return true;
- } else if (str.equals("i") || str.equals("P")) {
+ } else if ((str == "i") || (str == "P")) {
return cv && cv->IsImmediate();
- } else if (str.equals("rw.u")) {
+ } else if ((str == "rw.u")) {
return cv && cv->IsUniform();
} else {
IGC_ASSERT_MESSAGE(0, "Unsupported constraint type!");
@@ -9704,7 +9705,7 @@ bool EmitPass::validateInlineAsmConstraints(llvm::CallInst *inst, SmallVector<St
// Check the output constraint tokens
for (; index < constraints.size(); index++) {
StringRef &str = constraints[index];
- if (str.startswith("=")) {
+ if (str.starts_with("=")) {
success &= CheckConstraintTypes(str);
} else {
break;
@@ -9727,7 +9728,7 @@ bool EmitPass::validateInlineAsmConstraints(llvm::CallInst *inst, SmallVector<St
void EmitPass::EmitInlineAsm(llvm::CallInst *inst) {
std::stringstream &str = m_encoder->GetVISABuilder()->GetAsmTextStream();
InlineAsm *IA = cast<InlineAsm>(IGCLLVM::getCalledValue(inst));
- string asmStr = IA->getAsmString();
+ string asmStr = IA->getAsmString().str();
smallvector<CVariable *, 8> opnds;
SmallVector<StringRef, 8> constraints;
DenseMap<CVariable *, Instruction *> DstOpndMap;
@@ -9801,12 +9802,12 @@ void EmitPass::EmitInlineAsm(llvm::CallInst *inst) {
// All uniform variables must be broadcasted if 'rw' constraint was
// specified
- if (opVar->IsUniform() && constraint.equals("rw")) {
+ if (opVar->IsUniform() && (constraint == "rw")) {
opnds[i] = BroadcastIfUniform(opVar);
}
// Special handling if LLVM replaces a variable with an immediate, we need
// to insert an extra move
- else if (opVar->IsImmediate() && !constraint.equals("i") && !constraint.equals("P")) {
+ else if (opVar->IsImmediate() && !(constraint == "i") && !(constraint == "P")) {
CVariable *tempMov = m_currShader->GetNewVariable(1, opVar->GetType(), EALIGN_GRF, true, opVar->getName());
m_encoder->Copy(tempMov, opVar);
m_encoder->Push();
@@ -9873,7 +9874,7 @@ void EmitPass::EmitInlineAsm(llvm::CallInst *inst) {
return;
}
string varName;
- if (constraints[val].equals("P"))
+ if (constraints[val] == "P")
varName = std::to_string(opnds[val]->GetImmediateValue());
else if (opnds[val])
varName = m_encoder->GetVariableName(opnds[val]);
@@ -16301,8 +16302,8 @@ void EmitPass::ResetRoundingMode(Instruction *inst) {
// next explicit-RM setting instruction (genintrinsic).
bool nextImplicitFPCvtInt = false;
bool nextImplicitFP = false;
- for (auto nextInst = inst->getNextNonDebugInstruction(); nextInst != nullptr;
- nextInst = nextInst->getNextNonDebugInstruction()) {
+ for (auto nextInst = IGC::getNextNonDbgInstruction(inst); nextInst != nullptr;
+ nextInst = IGC::getNextNonDbgInstruction(nextInst)) {
if (ignoresRoundingMode(nextInst)) {
continue;
}
@@ -23891,14 +23892,14 @@ void EmitPass::emitLSCFence(llvm::GenIntrinsicInst *inst) {
unsigned short getLSCAtomicBitWidth(llvm::GenIntrinsicInst *inst) {
llvm::StringRef name = inst->getCalledFunction()->getName();
unsigned short bitwidth = 0;
- if (name.startswith("llvm.genx.GenISA.LSCAtomicInts.i64") || name.startswith("llvm.genx.GenISA.LSCAtomicInts.u64") ||
- name.startswith("llvm.genx.GenISA.LSCAtomicFP64"))
+ if (name.starts_with("llvm.genx.GenISA.LSCAtomicInts.i64") || name.starts_with("llvm.genx.GenISA.LSCAtomicInts.u64") ||
+ name.starts_with("llvm.genx.GenISA.LSCAtomicFP64"))
bitwidth = 64;
- else if (name.startswith("llvm.genx.GenISA.LSCAtomicInts.i32") ||
- name.startswith("llvm.genx.GenISA.LSCAtomicInts.u32") || name.startswith("llvm.genx.GenISA.LSCAtomicFP32"))
+ else if (name.starts_with("llvm.genx.GenISA.LSCAtomicInts.i32") ||
+ name.starts_with("llvm.genx.GenISA.LSCAtomicInts.u32") || name.starts_with("llvm.genx.GenISA.LSCAtomicFP32"))
bitwidth = 32;
- else if (name.startswith("llvm.genx.GenISA.LSCAtomicInts.i16") ||
- name.startswith("llvm.genx.GenISA.LSCAtomicInts.u16") || (name.startswith("llvm.genx.GenISA.LSCAtomicBF16")))
+ else if (name.starts_with("llvm.genx.GenISA.LSCAtomicInts.i16") ||
+ name.starts_with("llvm.genx.GenISA.LSCAtomicInts.u16") || (name.starts_with("llvm.genx.GenISA.LSCAtomicBF16")))
bitwidth = 16;
else
IGC_ASSERT_MESSAGE(0, "Intrinsic support is not implemented.");
@@ -25340,7 +25341,7 @@ Function *EmitPass::findStackOverflowDetectionFunction(Function *ParentFunction,
auto FG = m_FGA->getGroup(ParentFunction);
// Function subgroup can contain clones of the subroutine.
for (auto F : *FG) {
- if (F->getName().startswith(FunctionName) && m_FGA->getSubGroupMap(ParentFunction) == m_FGA->getSubGroupMap(F)) {
+ if (F->getName().starts_with(FunctionName) && m_FGA->getSubGroupMap(ParentFunction) == m_FGA->getSubGroupMap(F)) {
StackOverflowFunction = F;
break;
}
diff --git a/IGC/Compiler/CISACodeGen/Emu64OpsPass.cpp b/IGC/Compiler/CISACodeGen/Emu64OpsPass.cpp
index 03d3650..d0da89f 100644
--- a/IGC/Compiler/CISACodeGen/Emu64OpsPass.cpp
+++ b/IGC/Compiler/CISACodeGen/Emu64OpsPass.cpp
@@ -1352,9 +1352,9 @@ bool InstExpander::visitFPToUI(FPToUIInst &F2U) {
}
IID = Intrinsic::trunc;
- Function *Trunc = Intrinsic::getDeclaration(Emu->getModule(), IID, SrcTy);
+ Function *Trunc = Intrinsic::getOrInsertDeclaration(Emu->getModule(), IID, SrcTy);
IID = Intrinsic::fma;
- Function *Fma = Intrinsic::getDeclaration(Emu->getModule(), IID, SrcTy);
+ Function *Fma = Intrinsic::getOrInsertDeclaration(Emu->getModule(), IID, SrcTy);
Value *FC0 = ConstantFP::get(SrcTy, ldexp(1., -32));
Value *FC1 = ConstantFP::get(SrcTy, ldexp(-1., 32));
@@ -1407,11 +1407,11 @@ bool InstExpander::visitFPToSI(FPToSIInst &F2S) {
Sign = IRB->CreateAShr(Sign, 31);
IID = Intrinsic::fabs;
- Function *FAbs = Intrinsic::getDeclaration(Emu->getModule(), IID, SrcTy);
+ Function *FAbs = Intrinsic::getOrInsertDeclaration(Emu->getModule(), IID, SrcTy);
IID = Intrinsic::trunc;
- Function *Trunc = Intrinsic::getDeclaration(Emu->getModule(), IID, SrcTy);
+ Function *Trunc = Intrinsic::getOrInsertDeclaration(Emu->getModule(), IID, SrcTy);
IID = Intrinsic::fma;
- Function *Fma = Intrinsic::getDeclaration(Emu->getModule(), IID, SrcTy);
+ Function *Fma = Intrinsic::getOrInsertDeclaration(Emu->getModule(), IID, SrcTy);
Value *FC0 = ConstantFP::get(SrcTy, ldexp(1., -32));
Value *FC1 = ConstantFP::get(SrcTy, ldexp(-1., 32));
@@ -1450,7 +1450,7 @@ Value *InstExpander::convertUIToFP32(Type *DstTy, Value *Lo, Value *Hi, Instruct
IGCLLVM::Intrinsic IID;
IID = Intrinsic::ctlz;
- Function *Lzd = Intrinsic::getDeclaration(Emu->getModule(), IID, Lo->getType());
+ Function *Lzd = Intrinsic::getOrInsertDeclaration(Emu->getModule(), IID, Lo->getType());
Value *ShAmt = IRB->CreateCall2(Lzd, Hi, IRB->getFalse());
// Check ShAmt == 32
@@ -1572,7 +1572,7 @@ bool InstExpander::visitUIToFP(UIToFPInst &U2F) {
if (DstTy->isDoubleTy()) {
IGCLLVM::Intrinsic IID = Intrinsic::fma;
- Function *Fma = Intrinsic::getDeclaration(Emu->getModule(), IID, DstTy);
+ Function *Fma = Intrinsic::getOrInsertDeclaration(Emu->getModule(), IID, DstTy);
Value *FC0 = ConstantFP::get(DstTy, ldexp(1., 32));
Value *LoF = IRB->CreateUIToFP(Lo, DstTy);
Value *HiF = IRB->CreateUIToFP(Hi, DstTy);
@@ -1619,7 +1619,7 @@ bool InstExpander::visitSIToFP(SIToFPInst &S2F) {
if (DstTy->isDoubleTy()) {
IGCLLVM::Intrinsic IID = Intrinsic::fma;
- Function *Fma = Intrinsic::getDeclaration(Emu->getModule(), IID, DstTy);
+ Function *Fma = Intrinsic::getOrInsertDeclaration(Emu->getModule(), IID, DstTy);
Value *FC0 = ConstantFP::get(DstTy, ldexp(1., 32));
Value *LoF = IRB->CreateUIToFP(Lo, DstTy);
Value *HiF = IRB->CreateSIToFP(Hi, DstTy);
diff --git a/IGC/Compiler/CISACodeGen/EstimateFunctionSize.cpp b/IGC/Compiler/CISACodeGen/EstimateFunctionSize.cpp
index e9f29f7..7fdb05b 100644
--- a/IGC/Compiler/CISACodeGen/EstimateFunctionSize.cpp
+++ b/IGC/Compiler/CISACodeGen/EstimateFunctionSize.cpp
@@ -551,37 +551,37 @@ void EstimateFunctionSize::clear() {
bool EstimateFunctionSize::matchImplicitArg(CallInst &CI) {
bool matched = false;
StringRef funcName = CI.getCalledFunction()->getName();
- if (funcName.equals(GET_LOCAL_ID_X) || funcName.equals(GET_LOCAL_ID_Y) || funcName.equals(GET_LOCAL_ID_Z)) {
+ if ((funcName == GET_LOCAL_ID_X) || (funcName == GET_LOCAL_ID_Y) || (funcName == GET_LOCAL_ID_Z)) {
matched = true;
- } else if (funcName.equals(GET_GROUP_ID)) {
+ } else if ((funcName == GET_GROUP_ID)) {
matched = true;
- } else if (funcName.equals(GET_LOCAL_THREAD_ID)) {
+ } else if ((funcName == GET_LOCAL_THREAD_ID)) {
matched = true;
- } else if (funcName.equals(GET_GLOBAL_OFFSET)) {
+ } else if ((funcName == GET_GLOBAL_OFFSET)) {
matched = true;
- } else if (funcName.equals(GET_GLOBAL_SIZE)) {
+ } else if ((funcName == GET_GLOBAL_SIZE)) {
matched = true;
- } else if (funcName.equals(GET_LOCAL_SIZE)) {
+ } else if ((funcName == GET_LOCAL_SIZE)) {
matched = true;
- } else if (funcName.equals(GET_WORK_DIM)) {
+ } else if ((funcName == GET_WORK_DIM)) {
matched = true;
- } else if (funcName.equals(GET_NUM_GROUPS)) {
+ } else if ((funcName == GET_NUM_GROUPS)) {
matched = true;
- } else if (funcName.equals(GET_ENQUEUED_LOCAL_SIZE)) {
+ } else if ((funcName == GET_ENQUEUED_LOCAL_SIZE)) {
matched = true;
- } else if (funcName.equals(GET_STAGE_IN_GRID_ORIGIN)) {
+ } else if ((funcName == GET_STAGE_IN_GRID_ORIGIN)) {
matched = true;
- } else if (funcName.equals(GET_STAGE_IN_GRID_SIZE)) {
+ } else if ((funcName == GET_STAGE_IN_GRID_SIZE)) {
matched = true;
- } else if (funcName.equals(GET_SYNC_BUFFER)) {
+ } else if ((funcName == GET_SYNC_BUFFER)) {
matched = true;
- } else if (funcName.equals(GET_ASSERT_BUFFER)) {
+ } else if ((funcName == GET_ASSERT_BUFFER)) {
matched = true;
- } else if (funcName.equals(GET_REGION_GROUP_SIZE)) {
+ } else if ((funcName == GET_REGION_GROUP_SIZE)) {
matched = true;
- } else if (funcName.equals(GET_REGION_GROUP_WG_COUNT)) {
+ } else if ((funcName == GET_REGION_GROUP_WG_COUNT)) {
matched = true;
- } else if (funcName.equals(GET_REGION_GROUP_BARRIER_BUFFER)) {
+ } else if ((funcName == GET_REGION_GROUP_BARRIER_BUFFER)) {
matched = true;
}
@@ -678,7 +678,7 @@ void EstimateFunctionSize::runStaticAnalysis() {
continue;
auto &BFI = getAnalysis<BlockFrequencyInfoWrapperPass>(F).getBFI();
FunctionNode *Node = get<FunctionNode>(&F);
- Node->setEntryFrequency(BFI.getEntryFreq(), 0);
+ Node->setEntryFrequency(BFI.getEntryFreq().getFrequency(), 0);
for (auto &B : F)
Node->blockFreqs[&B] = Scaled64(BFI.getBlockFreq(&B).getFrequency(), 0);
diff --git a/IGC/Compiler/CISACodeGen/FPRoundingModeCoalescing.cpp b/IGC/Compiler/CISACodeGen/FPRoundingModeCoalescing.cpp
index 00f72f7..a38c9b8 100644
--- a/IGC/Compiler/CISACodeGen/FPRoundingModeCoalescing.cpp
+++ b/IGC/Compiler/CISACodeGen/FPRoundingModeCoalescing.cpp
@@ -16,6 +16,13 @@ SPDX-License-Identifier: MIT
#include "Compiler/CodeGenPublic.h"
#include "Compiler/IGCPassSupport.h"
#include "Compiler/MetaDataUtilsWrapper.h"
+#include "common/LLVMUtils.h"
+
+namespace IGC {
+static llvm::Instruction *getNextNonDbgInstructionLocal(llvm::Instruction *I) { return getNextNonDbgInstruction(I); }
+static llvm::Instruction *getPrevNonDbgInstructionLocal(llvm::Instruction *I) { return getPrevNonDbgInstruction(I); }
+}
+
#include "common/igc_regkeys.hpp"
using namespace llvm;
@@ -210,8 +217,8 @@ bool FPRoundingModeCoalescingImpl::setsRoundingMode(Instruction &ToMove) {
bool FPRoundingModeCoalescingImpl::checkMoveThreshold(Instruction &ToMove, Instruction *InsertPoint) {
unsigned Dist = 1;
- for (Instruction *I = ToMove.getNextNonDebugInstruction(); I != InsertPoint;
- I = I->getNextNonDebugInstruction(), ++Dist) {
+ for (Instruction *I = IGC::getNextNonDbgInstructionLocal(&ToMove); I != InsertPoint;
+ I = IGC::getNextNonDbgInstructionLocal(I), ++Dist) {
if (Dist >= IGC_GET_FLAG_VALUE(FPRoundingModeCoalescingMaxDistance))
return false;
}
@@ -277,8 +284,8 @@ bool FPRoundingModeCoalescingImpl::tryMove(Instruction &ToMove, FPRoundingModeGr
// Next, find first instruction before group switching RM that is NOT an user
// of instruction to move. This will be an insert point.
Instruction *InsertPoint = nullptr;
- for (Instruction *I = Group.getHead()->getPrevNonDebugInstruction(); I != &ToMove;
- I = I->getPrevNonDebugInstruction()) {
+ for (Instruction *I = IGC::getPrevNonDbgInstructionLocal(Group.getHead()); I != &ToMove;
+ I = IGC::getPrevNonDbgInstructionLocal(I)) {
if (!ignoresRoundingMode(I) && Users.count(I) == 0) {
InsertPoint = I;
break;
diff --git a/IGC/Compiler/CISACodeGen/FoldKnownWorkGroupSizes.cpp b/IGC/Compiler/CISACodeGen/FoldKnownWorkGroupSizes.cpp
index 45f18b4..5630b82 100644
--- a/IGC/Compiler/CISACodeGen/FoldKnownWorkGroupSizes.cpp
+++ b/IGC/Compiler/CISACodeGen/FoldKnownWorkGroupSizes.cpp
@@ -63,7 +63,7 @@ void FoldKnownWorkGroupSizes::visitCallInst(llvm::CallInst &I) {
}
StringRef funcName = calledFunction->getName();
- if (funcName.equals(WIFuncsAnalysis::GET_GLOBAL_OFFSET) &&
+ if ((funcName == WIFuncsAnalysis::GET_GLOBAL_OFFSET) &&
ctx->getModuleMetaData()->compOpt.replaceGlobalOffsetsByZero) {
if (calledFunction->getReturnType() == Type::getInt32Ty(module->getContext())) {
ConstantInt *IntZero = ConstantInt::get(Type::getInt32Ty(module->getContext()), 0);
@@ -72,7 +72,7 @@ void FoldKnownWorkGroupSizes::visitCallInst(llvm::CallInst &I) {
I.eraseFromParent();
m_changed = true;
}
- } else if (funcName.equals(WIFuncsAnalysis::GET_ENQUEUED_LOCAL_SIZE)) {
+ } else if ((funcName == WIFuncsAnalysis::GET_ENQUEUED_LOCAL_SIZE)) {
auto Dims = IGCMetaDataHelper::getThreadGroupDims(*ctx->getMetaDataUtils(), I.getFunction());
if (!Dims)
diff --git a/IGC/Compiler/CISACodeGen/GenCodeGenModule.cpp b/IGC/Compiler/CISACodeGen/GenCodeGenModule.cpp
index 02690f6..7d6ccdf 100644
--- a/IGC/Compiler/CISACodeGen/GenCodeGenModule.cpp
+++ b/IGC/Compiler/CISACodeGen/GenCodeGenModule.cpp
@@ -133,7 +133,7 @@ void GenXCodeGenModule::detectUnpromotableFunctions(Module *pM) {
// Find functions that have uses of "localSLM" globals
for (auto gi = pM->global_begin(), ge = pM->global_end(); gi != ge; gi++) {
GlobalVariable *GV = dyn_cast<GlobalVariable>(gi);
- if (GV && GV->hasSection() && GV->getSection().equals("localSLM")) {
+ if (GV && GV->hasSection() && GV->getSection() == "localSLM") {
for (auto user : GV->users()) {
if (Instruction *U = dyn_cast<Instruction>(user)) {
Function *pF = U->getParent()->getParent();
@@ -186,7 +186,7 @@ void GenXCodeGenModule::processFunction(Function &F) {
std::vector<llvm::Function *> Callers;
if (IGC_IS_FLAG_ENABLED(StackOverflowDetection)) {
- if (F.getName().equals("__stackoverflow_detection")) {
+ if (F.getName() == "__stackoverflow_detection") {
// Mark all stack calls as users of this detection function.
// It will be used as a subroutine, so it needs to be cloned for
// each of stack call functions.
@@ -1311,13 +1311,7 @@ void SubroutineInliner::verifyAddrSpaceMismatch(CallGraphSCC &SCC) {
bool SubroutineInliner::runOnSCC(CallGraphSCC &SCC) {
FSA = &getAnalysis<EstimateFunctionSize>();
MDUW = &getAnalysis<MetaDataUtilsWrapper>();
-#if LLVM_VERSION_MAJOR >= 16
- if (skipSCC(SCC))
- return false;
- bool changed = inlineCalls(SCC);
-#else
- bool changed = LegacyInlinerBase::runOnSCC(SCC);
-#endif
+bool changed = inlineCalls(SCC);
if (changed)
verifyAddrSpaceMismatch(SCC);
diff --git a/IGC/Compiler/CISACodeGen/GenCodeGenModule.h b/IGC/Compiler/CISACodeGen/GenCodeGenModule.h
index 57a4aa9..b7e99fe 100644
--- a/IGC/Compiler/CISACodeGen/GenCodeGenModule.h
+++ b/IGC/Compiler/CISACodeGen/GenCodeGenModule.h
@@ -129,7 +129,7 @@ public:
/// \brief Only one function in this group ignoring stack overflow detection methods
bool isSingleIgnoringStackOverflowDetection() const {
auto isNotStackOverflowDetection = [](const llvm::Function *F) {
- return !F->getName().startswith("__stackoverflow_detection") && !F->getName().startswith("__stackoverflow_init");
+ return !F->getName().starts_with("__stackoverflow_detection") && !F->getName().starts_with("__stackoverflow_init");
};
return (Functions.size() == 1 &&
std::count_if(Functions.front()->begin(), Functions.front()->end(), isNotStackOverflowDetection) == 1);
diff --git a/IGC/Compiler/CISACodeGen/GenIRLowering.cpp b/IGC/Compiler/CISACodeGen/GenIRLowering.cpp
index 01afdd2..e289d9f 100644
--- a/IGC/Compiler/CISACodeGen/GenIRLowering.cpp
+++ b/IGC/Compiler/CISACodeGen/GenIRLowering.cpp
@@ -100,7 +100,7 @@ template <typename LHS_t, typename RHS_t, typename Pred_t> struct FMaxMinCast_ma
return false;
}
- template <typename OpTy> bool match(OpTy *V) {
+ template <typename OpTy> bool match(OpTy *V) const {
SelectInst *SI = dyn_cast<SelectInst>(V);
if (!SI)
return false;
@@ -163,7 +163,7 @@ template <typename Op_t, typename ConstTy> struct ClampWithConstants_match {
ClampWithConstants_match(const Op_t &OpMatch, ConstPtrTy &Min, ConstPtrTy &Max) : Op(OpMatch), CMin(Min), CMax(Max) {}
- template <typename OpTy> bool match(OpTy *V) {
+ template <typename OpTy> bool match(OpTy *V) const {
CallInst *GII = dyn_cast<CallInst>(V);
if (!GII)
return false;
@@ -501,7 +501,7 @@ bool GEPLowering::simplifyGEP(BasicBlock &BB) {
for (auto PI = B.second.rbegin(), PE = B.second.rend(); PI != PE; ++PI) {
auto &P = *PI;
if (P.Offset) {
- SCEVExpander E(*SE, *DL, "gep-simplification");
+ SCEVExpander E(*SE, "gep-simplification");
Value *V = E.expandCodeFor(P.Offset, P.Idx->getType(), P.GEP);
Builder->SetInsertPoint(P.GEP);
auto *NewGEP = Builder->CreateInBoundsGEP(P.Base->getResultElementType(), P.Base,
@@ -1128,7 +1128,7 @@ bool GenIRLowering::combineSelectInst(SelectInst *Sel, BasicBlock::iterator &BBI
}
IGCLLVM::Intrinsic IID = IsMax ? Intrinsic::maxnum : Intrinsic::minnum;
- Function *IFunc = Intrinsic::getDeclaration(Sel->getParent()->getParent()->getParent(), IID, LHS->getType());
+ Function *IFunc = Intrinsic::getOrInsertDeclaration(Sel->getParent()->getParent()->getParent(), IID, LHS->getType());
Instruction *I = Builder->CreateCall2(IFunc, LHS, RHS);
BBI = BasicBlock::iterator(I); // Don't move to the next one. We still need combine for saturation.
diff --git a/IGC/Compiler/CISACodeGen/GenerateFrequencyData.cpp b/IGC/Compiler/CISACodeGen/GenerateFrequencyData.cpp
index f4ef79e..2fcfdae 100644
--- a/IGC/Compiler/CISACodeGen/GenerateFrequencyData.cpp
+++ b/IGC/Compiler/CISACodeGen/GenerateFrequencyData.cpp
@@ -99,7 +99,7 @@ void GenerateFrequencyData::runStaticAnalysis() {
if (F.empty() || F_freqs.find(&F) == F_freqs.end())
continue;
auto &BFI = getAnalysis<BlockFrequencyInfoWrapperPass>(F).getBFI();
- Scaled64 EntryFreq(BFI.getEntryFreq(), 0);
+ Scaled64 EntryFreq(BFI.getEntryFreq().getFrequency(), 0);
if ((IGC_GET_FLAG_VALUE(PrintStaticProfileGuidedSpillCostAnalysis) & PGSS_IGC_DUMP_BLK) != 0)
dbgs() << "Function frequency of " << F.getName().str() << ": " << F_freqs[&F].toString() << "\n";
@@ -143,7 +143,7 @@ void GenerateFrequencyData::updateStaticFuncFreq(DenseMap<Function *, ScaledNumb
uint64_t InitialCount = InitialSyntheticCount;
if (!F.empty()) {
auto &BFI = getAnalysis<BlockFrequencyInfoWrapperPass>(F).getBFI();
- entryFreqs[&F] = Scaled64(BFI.getEntryFreq(), 0);
+ entryFreqs[&F] = Scaled64(BFI.getEntryFreq().getFrequency(), 0);
for (auto &B : F)
blockFreqs[&B] = Scaled64(BFI.getBlockFreq(&B).getFrequency(), 0);
}
diff --git a/IGC/Compiler/CISACodeGen/HalfPromotion.cpp b/IGC/Compiler/CISACodeGen/HalfPromotion.cpp
index cfe23a5..d3bb062 100644
--- a/IGC/Compiler/CISACodeGen/HalfPromotion.cpp
+++ b/IGC/Compiler/CISACodeGen/HalfPromotion.cpp
@@ -60,7 +60,7 @@ void IGC::HalfPromotion::handleLLVMIntrinsic(llvm::IntrinsicInst &I) {
llvm::IGCIRBuilder<> builder(&I);
std::vector<llvm::Value *> arguments;
- Function *pNewFunc = Intrinsic::getDeclaration(M, I.getIntrinsicID(), builder.getFloatTy());
+ Function *pNewFunc = Intrinsic::getOrInsertDeclaration(M, I.getIntrinsicID(), builder.getFloatTy());
for (unsigned i = 0; i < IGCLLVM::getNumArgOperands(&I); ++i) {
if (I.getOperand(i)->getType()->isHalfTy()) {
diff --git a/IGC/Compiler/CISACodeGen/IGCVectorizer.cpp b/IGC/Compiler/CISACodeGen/IGCVectorizer.cpp
index bebfba8..993c4ce 100644
--- a/IGC/Compiler/CISACodeGen/IGCVectorizer.cpp
+++ b/IGC/Compiler/CISACodeGen/IGCVectorizer.cpp
@@ -426,7 +426,7 @@ bool IGCVectorizer::handlePHI(VecArr &Slice) {
Instruction *InsertPoint = getInsertPointForVector(ForVector);
if (!InsertPoint)
return false;
- auto CreatedVec = createVector(ForVector, InsertPoint->getNextNonDebugInstruction());
+ auto CreatedVec = createVector(ForVector, IGC::getNextNonDbgInstruction(InsertPoint));
PRINT_INST_NL(CreatedVec);
Operands.push_back(CreatedVec);
} else {
@@ -493,7 +493,7 @@ Instruction *IGCVectorizer::getInsertPointForVector(VecArr &Arr) {
if (llvm::isa<llvm::PHINode>(InsertPoint))
InsertPoint = InsertPoint->getParent()->getFirstNonPHI();
if (InsertPoint->isTerminator())
- InsertPoint = InsertPoint->getPrevNonDebugInstruction();
+ InsertPoint = IGC::getPrevNonDbgInstruction(InsertPoint);
return InsertPoint;
}
@@ -513,7 +513,7 @@ Instruction *IGCVectorizer::getInsertPointForCreatedInstruction(VecVal &Operands
Instruction *InsertPoint = Slice.front()->getParent()->getFirstNonPHI();
if (InstOperands.size() != 0) {
- InsertPoint = getMaxPoint(InstOperands)->getNextNonDebugInstruction();
+ InsertPoint = IGC::getNextNonDbgInstruction(getMaxPoint(InstOperands));
// if insert point is PHI, shift it to the first nonPHI to be safe
if (llvm::isa<llvm::PHINode>(InsertPoint))
InsertPoint = InsertPoint->getParent()->getFirstNonPHI();
@@ -587,7 +587,7 @@ void IGCVectorizer::replaceSliceInstructionsWithExtract(VecArr &Slice, Instructi
PRINT_INST_NL(CreatedInst);
Instruction *InsertPoint = (llvm::isa<PHINode>(Slice.front())) ? CreatedInst->getParent()->getFirstNonPHI()
- : CreatedInst->getNextNonDebugInstruction();
+ : IGC::getNextNonDbgInstruction(CreatedInst);
for (size_t i = 0; i < Slice.size(); i++) {
@@ -1028,7 +1028,7 @@ bool IGCVectorizer::handleIntrinsic(VecArr &Slice) {
llvm::VectorType *VectorType = llvm::FixedVectorType::get(First->getType(), Slice.size());
auto IntrinsicID = llvm::cast<IntrinsicInst>(First)->getIntrinsicID();
- auto *Decl = Intrinsic::getDeclaration(M, IntrinsicID, {VectorType});
+ auto *Decl = Intrinsic::getOrInsertDeclaration(M, IntrinsicID, {VectorType});
PRINT_DECL_NL(Decl);
auto *CreatedInst = llvm::CallInst::Create(Decl, Operands);
@@ -1285,7 +1285,7 @@ Value *IGCVectorizer::vectorizeSlice(VecArr &Slice, unsigned int OperNum) {
PRINT_LOG_NL("Couldn't find insert point");
return nullptr;
}
- NewVector = createVector(NotVectorizedInstruction, InsertPoint->getNextNonDebugInstruction());
+ NewVector = createVector(NotVectorizedInstruction, IGC::getNextNonDbgInstruction(InsertPoint));
PRINT_LOG("New vector created: ");
PRINT_INST_NL(NewVector);
}
@@ -1411,7 +1411,7 @@ bool IGCVectorizerCommon::checkDependencyAndTryToEliminate(VecArr &Slice, unsign
Instruction *SearchPoint = MinPoint;
SliceScope.push_back(SearchPoint);
while (SearchPoint != MaxPoint) {
- SearchPoint = SearchPoint->getNextNonDebugInstruction();
+ SearchPoint = IGC::getNextNonDbgInstruction(SearchPoint);
SliceScope.push_back(SearchPoint);
}
@@ -1457,7 +1457,7 @@ bool IGCVectorizerCommon::checkDependencyAndTryToEliminate(VecArr &Slice, unsign
}
}
- Instruction *AfterInsertPoint = MaxPoint->getNextNonDebugInstruction();
+ Instruction *AfterInsertPoint = IGC::getNextNonDbgInstruction(MaxPoint);
// scheduling part
// everything that doesn't depend on slice values goes before
// everything that DEPENDS on slice-value goes after
@@ -1803,7 +1803,7 @@ void IGCVectorCoalescer::mergeHorizontalSliceIntrinsic(VecArr &Slice) {
ShuffleIn(Slice, 0, Slice.front()->getNumOperands() - 1, Operands);
auto IntrinsicID = llvm::cast<IntrinsicInst>(Slice.front())->getIntrinsicID();
- auto *Decl = Intrinsic::getDeclaration(M, IntrinsicID, {vectorType});
+ auto *Decl = Intrinsic::getOrInsertDeclaration(M, IntrinsicID, {vectorType});
auto *CreatedInst = llvm::CallInst::Create(Decl, Operands);
CreatedInst->setName("coalesced_intrinsic");
diff --git a/IGC/Compiler/CISACodeGen/LSCCacheOptimizationPass.cpp b/IGC/Compiler/CISACodeGen/LSCCacheOptimizationPass.cpp
index 0a1aa6a..cc8d757 100644
--- a/IGC/Compiler/CISACodeGen/LSCCacheOptimizationPass.cpp
+++ b/IGC/Compiler/CISACodeGen/LSCCacheOptimizationPass.cpp
@@ -294,7 +294,7 @@ void LSCCacheOptimizationPass::visitStoreInst(StoreInst &storeInst) {
/* First do the GGRR 32 wide store */
// %0 = bitcast <>* %baseAddress to i8*
- auto *bitcast1 = builder.CreateBitCast(initial_pointer, builder.getInt8PtrTy(addrspace));
+ auto *bitcast1 = builder.CreateBitCast(initial_pointer, PointerType::get(builder.getInt8Ty(), addrspace));
// %1 = getelementptr i8, i8* %0, i64 -offset
auto *left_green_address = builder.CreateGEP(builder.getInt8Ty(), bitcast1, builder.getInt64(-1 * offset));
// %2 = bitcast i8* %1 to <num_green_blocks_left x iN>*
@@ -369,7 +369,7 @@ void LSCCacheOptimizationPass::visitStoreInst(StoreInst &storeInst) {
uint64_t num_blue_blocks = data_size / element_size;
// %0 = bitcast <>* %baseAddress to i8*
- auto *bitcast1 = builder.CreateBitCast(initial_pointer, builder.getInt8PtrTy(addrspace));
+ auto *bitcast1 = builder.CreateBitCast(initial_pointer, PointerType::get(builder.getInt8Ty(), addrspace));
// %1 = getelementptr i8, i8* %0, i64 data_size
auto *green_address = builder.CreateGEP(builder.getInt8Ty(), bitcast1, builder.getInt64(data_size));
// %2 = bitcast i8* %1 to <num_green_blocks x iN>*
@@ -407,7 +407,7 @@ void LSCCacheOptimizationPass::visitStoreInst(StoreInst &storeInst) {
uint64_t num_blue_blocks = data_size / element_size;
// %0 = bitcast <>* %baseAddress to i8*
- auto *bitcast1 = builder.CreateBitCast(initial_pointer, builder.getInt8PtrTy(addrspace));
+ auto *bitcast1 = builder.CreateBitCast(initial_pointer, PointerType::get(builder.getInt8Ty(), addrspace));
// %1 = getelementptr i8, i8* %0, i64 -offset
auto *green_address = builder.CreateGEP(builder.getInt8Ty(), bitcast1, builder.getInt64(-1 * offset));
// %2 = bitcast i8* %1 to <num_green_blocks x iN>*
@@ -443,7 +443,7 @@ void LSCCacheOptimizationPass::visitStoreInst(StoreInst &storeInst) {
uint64_t num_total_blocks = right_boundary / element_size;
// %0 = bitcast <>* %baseAddress to i8*
- auto *bitcast1 = builder.CreateBitCast(initial_pointer, builder.getInt8PtrTy(addrspace));
+ auto *bitcast1 = builder.CreateBitCast(initial_pointer, PointerType::get(builder.getInt8Ty(), addrspace));
// %1 = getelementptr i8, i8* %0, i64 -offset
auto *starting_address = builder.CreateGEP(builder.getInt8Ty(), bitcast1, builder.getInt64(-1 * offset));
// %2 = bitcast i8* %1 to <num_total_blocks x iN>*
@@ -493,7 +493,7 @@ bool LSCCacheOptimizationPass::create_48_wide_store(Function& function)
uint64_t num_red_blocks = 8; // in dwords
Type* element_type = builder.getInt32Ty();
// %0 = bitcast <>* %baseAddress to i8*
- auto* bitcast1 = builder.CreateBitCast(intrinsic_call, builder.getInt8PtrTy(addrspace));
+ auto* bitcast1 = builder.CreateBitCast(intrinsic_call, PointerType::get(builder.getInt8Ty(), addrspace));
// %1 = getelementptr i8, i8* %0, i64 offset
auto* red_address = builder.CreateGEP(builder.getInt8Ty(), bitcast1, builder.getInt64(offset));
// %2 = bitcast i8* %1 to <num_red_blocks x iN>*
diff --git a/IGC/Compiler/CISACodeGen/LiveVars.cpp b/IGC/Compiler/CISACodeGen/LiveVars.cpp
index 29938df..673bfaa 100644
--- a/IGC/Compiler/CISACodeGen/LiveVars.cpp
+++ b/IGC/Compiler/CISACodeGen/LiveVars.cpp
@@ -108,9 +108,9 @@ void LiveVars::preAllocMemory(Function &F) {
uint32_t mapCap1 = int_cast<uint32_t>((size_t)(nVals * 1.40f));
// For PHIVarInfo, increase 10% only.
uint32_t mapCap2 = int_cast<uint32_t>((size_t)(F.size() * 1.10f));
- DistanceMap.grow(mapCap1);
- VirtRegInfo.grow(mapCap1);
- PHIVarInfo.grow(mapCap2);
+ DistanceMap.reserve(mapCap1);
+ VirtRegInfo.reserve(mapCap1);
+ PHIVarInfo.reserve(mapCap2);
}
void LiveVars::dump() const { print(ods()); }
@@ -631,11 +631,11 @@ bool LiveVars::hasInterference(llvm::Value *V0, llvm::Value *V1) {
if (!I0) {
// V0 must be argument. Use the first inst in Entry
- I0 = MF->getEntryBlock().getFirstNonPHIOrDbg();
+ I0 = &*MF->getEntryBlock().getFirstNonPHIOrDbg();
}
if (!I1) {
// V1 must be argument. Use the first inst in Entry
- I1 = MF->getEntryBlock().getFirstNonPHIOrDbg();
+ I1 = &*MF->getEntryBlock().getFirstNonPHIOrDbg();
}
if (isLiveAt(V0, I1) || isLiveAt(V1, I0)) {
diff --git a/IGC/Compiler/CISACodeGen/LivenessAnalysis.cpp b/IGC/Compiler/CISACodeGen/LivenessAnalysis.cpp
index 2e57878..086fa59 100644
--- a/IGC/Compiler/CISACodeGen/LivenessAnalysis.cpp
+++ b/IGC/Compiler/CISACodeGen/LivenessAnalysis.cpp
@@ -71,7 +71,7 @@ bool LivenessAnalysis::runOnFunction(Function &F) {
// allocate even more to avoid such automatic resizing.
uint32_t mapCap1 = int_cast<uint32_t>((size_t)(nVals * 1.40f));
uint32_t vecCap1 = int_cast<uint32_t>((size_t)(nVals * 1.10f));
- ValueIds.grow(mapCap1);
+ ValueIds.reserve(mapCap1);
IdValues.reserve(vecCap1);
initValueIds();
@@ -178,8 +178,8 @@ void LivenessAnalysis::calculate(Function *F) {
// allocate even more to avoid such automatic resizing.
uint32_t mapCap1 = int_cast<uint32_t>((size_t)(nVals * 1.40f));
uint32_t mapCap2 = int_cast<uint32_t>((size_t)(m_F->size() * 1.40f));
- BBLiveIns.grow(mapCap2);
- KillInsts.grow(mapCap1);
+ BBLiveIns.reserve(mapCap2);
+ KillInsts.reserve(mapCap1);
for (LiveVars::iterator LVI = m_LV->begin(), LVE = m_LV->end(); LVI != LVE; ++LVI) {
Value *V = LVI->first;
diff --git a/IGC/Compiler/CISACodeGen/MemOpt.cpp b/IGC/Compiler/CISACodeGen/MemOpt.cpp
index eadfaa9..b5c21a9 100644
--- a/IGC/Compiler/CISACodeGen/MemOpt.cpp
+++ b/IGC/Compiler/CISACodeGen/MemOpt.cpp
@@ -38,6 +38,7 @@ SPDX-License-Identifier: MIT
#include "Compiler/InitializePasses.h"
#include "Compiler/CISACodeGen/MemOpt.h"
#include "Probe/Assertion.h"
+#include "common/LLVMUtils.h"
#include <DebugInfo/DwarfDebug.cpp>
#include "MemOptUtils.h"
@@ -667,7 +668,7 @@ bool MemOpt::removeRedBlockRead(GenIntrinsicInst *LeadingBlockRead, MemRefListTy
aMI->first = BlockReadToOptimize;
}
- Builder.SetInsertPoint(BlockReadToOptimize->getNextNonDebugInstruction());
+ Builder.SetInsertPoint(IGC::getNextNonDbgInstruction(BlockReadToOptimize));
Value *subgroupLocalInvocationId = nullptr;
// Go through the collected blockreads to replace them with shuffles
@@ -693,7 +694,7 @@ bool MemOpt::removeRedBlockRead(GenIntrinsicInst *LeadingBlockRead, MemRefListTy
std::get<1>(ITuple)->first = nullptr;
I->eraseFromParent();
- Builder.SetInsertPoint(BlockReadToOptimize->getNextNonDebugInstruction());
+ Builder.SetInsertPoint(IGC::getNextNonDbgInstruction(BlockReadToOptimize));
}
}
aMI->first = BlockReadToOptimize;
@@ -2882,7 +2883,7 @@ bool LdStCombine::hasAlias(AliasSetTracker &AST, MemoryLocation &MemLoc) {
for (auto &AS : AST) {
if (AS.isForwardingAliasSet())
continue;
- AliasResult aresult = AS.aliasesPointer(MemLoc.Ptr, MemLoc.Size, MemLoc.AATags, AST.getAliasAnalysis());
+ AliasResult aresult = AS.aliasesMemoryLocation(MemLoc, AST.getAliasAnalysis());
if (aresult != AliasResult::NoAlias) {
return true;
}
@@ -4881,14 +4882,14 @@ bool isLayoutStructType(const StructType *StTy) {
if (!StTy || StTy->isLiteral() || !StTy->hasName() || !StTy->isPacked())
return false;
StringRef stId = StTy->getName();
- return (stId.startswith(getStructNameForSOALayout()) || stId.startswith(getStructNameForAOSLayout()));
+ return (stId.starts_with(getStructNameForSOALayout()) || stId.starts_with(getStructNameForAOSLayout()));
}
bool isLayoutStructTypeAOS(const StructType *StTy) {
if (!StTy || StTy->isLiteral() || !StTy->hasName() || !StTy->isPacked())
return false;
StringRef stId = StTy->getName();
- return stId.startswith(getStructNameForAOSLayout());
+ return stId.starts_with(getStructNameForAOSLayout());
}
bool isLayoutStructTypeSOA(const StructType *StTy) { return isLayoutStructType(StTy) && !isLayoutStructTypeAOS(StTy); }
diff --git a/IGC/Compiler/CISACodeGen/PartialEmuI64OpsPass.cpp b/IGC/Compiler/CISACodeGen/PartialEmuI64OpsPass.cpp
index 2a7d8f9..6e611d7 100644
--- a/IGC/Compiler/CISACodeGen/PartialEmuI64OpsPass.cpp
+++ b/IGC/Compiler/CISACodeGen/PartialEmuI64OpsPass.cpp
@@ -12,6 +12,8 @@ SPDX-License-Identifier: MIT
#include "llvm/ADT/PostOrderIterator.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/Analysis/ValueTracking.h"
+#include "llvm/Analysis/WithCache.h"
+#include "llvm/Analysis/SimplifyQuery.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/Function.h"
@@ -282,7 +284,7 @@ public:
auto *RHS = BO->getOperand(1);
if (Emu->CGC->platform.hasInt64Add() &&
- haveNoCommonBitsSet(LHS, RHS, F.getParent()->getDataLayout(), nullptr, nullptr, Emu->DT)) {
+ haveNoCommonBitsSet(WithCache<const Value *>(LHS), WithCache<const Value *>(RHS), SimplifyQuery(F.getParent()->getDataLayout(), Emu->DT))) {
IRB->SetInsertPoint(BO);
auto *NewAdd = IRB->CreateAdd(LHS, RHS);
BO->replaceAllUsesWith(NewAdd);
diff --git a/IGC/Compiler/CISACodeGen/PatternMatchPass.cpp b/IGC/Compiler/CISACodeGen/PatternMatchPass.cpp
index f97ed11..1bfa1cd 100644
--- a/IGC/Compiler/CISACodeGen/PatternMatchPass.cpp
+++ b/IGC/Compiler/CISACodeGen/PatternMatchPass.cpp
@@ -482,7 +482,7 @@ template <typename Op_t, typename ConstTy> struct ClampWithConstants_match {
ClampWithConstants_match(const Op_t &OpMatch, ConstPtrTy &Min, ConstPtrTy &Max) : Op(OpMatch), CMin(Min), CMax(Max) {}
- template <typename OpTy> bool match(OpTy *V) {
+ template <typename OpTy> bool match(OpTy *V) const {
CallInst *GII = dyn_cast<CallInst>(V);
if (!GII)
return false;
@@ -537,7 +537,7 @@ template <typename Op_t> struct IsNaN_match {
IsNaN_match(const Op_t &OpMatch) : Op(OpMatch) {}
- template <typename OpTy> bool match(OpTy *V) {
+ template <typename OpTy> bool match(OpTy *V) const {
using namespace llvm::PatternMatch;
FCmpInst *FCI = dyn_cast<FCmpInst>(V);
@@ -673,23 +673,28 @@ CodeGenPatternMatch::isFPToUnsignedIntSatWithInexactConstant(llvm::SelectInst *S
if (!CMax || !CMin || !CMax->isMaxValue(false) || !CMin->isMinValue(false))
return std::make_tuple(nullptr, 0, ISA_TYPE_F);
- Constant *FMin = ConstantExpr::getUIToFP(CMin, Ty);
- Constant *FMax = ConstantExpr::getUIToFP(CMax, Ty);
+ Constant *FMin = ConstantExpr::getCast(Instruction::UIToFP, CMin, Ty);
+ Constant *FMax = ConstantExpr::getCast(Instruction::UIToFP, CMax, Ty);
FCmpInst::Predicate Pred = FCmpInst::FCMP_FALSE;
- if (!match(Cond2, m_FCmp(Pred, m_Specific(X), m_Specific(FMax))))
+ if (!match(Cond2, m_FCmp(m_Specific(X), m_Specific(FMax))))
return std::make_tuple(nullptr, 0, ISA_TYPE_F);
+ Pred = cast<FCmpInst>(Cond2)->getPredicate();
if (Pred != FCmpInst::FCMP_OGT) // FIXME: We should use OGE instead of OGT.
return std::make_tuple(nullptr, 0, ISA_TYPE_F);
FCmpInst::Predicate Pred2 = FCmpInst::FCMP_FALSE;
- if (!match(Cond, m_Or(m_FCmp(Pred, m_Specific(X), m_Specific(FMin)), m_FCmp(Pred2, m_Specific(X), m_Specific(X))))) {
- if (!match(Cond, m_Or(m_FCmp(Pred, m_Specific(X), m_Specific(FMin)), m_Zero()))) {
+ if (!match(Cond, m_Or(m_FCmp(m_Specific(X), m_Specific(FMin)), m_FCmp(m_Specific(X), m_Specific(X))))) {
+ auto *Or0 = cast<BinaryOperator>(Cond);
+ Pred = cast<FCmpInst>(Or0->getOperand(0))->getPredicate();
+ Pred2 = cast<FCmpInst>(Or0->getOperand(1))->getPredicate();
+ if (!match(Cond, m_Or(m_FCmp(m_Specific(X), m_Specific(FMin)), m_Zero()))) {
return std::make_tuple(nullptr, 0, ISA_TYPE_F);
}
// Special case where the staturatured result is bitcasted into float
// again (due to typedwrite only accepts `float`. So the isNaN(X) is
// reduced to `false`.
+ Pred = cast<FCmpInst>(cast<BinaryOperator>(Cond)->getOperand(0))->getPredicate();
Pred2 = FCmpInst::FCMP_UNE;
}
if (Pred != FCmpInst::FCMP_OLT || Pred2 != FCmpInst::FCMP_UNE)
@@ -3063,7 +3068,7 @@ bool CodeGenPatternMatch::MatchLoadStoreAtomicsStatelessUniformBase(llvm::Instru
auto ScaleImm = 1ll << Scale->getSExtValue();
if (DataSizeInBytes == ScaleImm) {
Offset = NotScaledOffset;
- Scale = ConstantInt::get(Scale->getType(), ScaleImm);
+ Scale = cast<ConstantInt>(ConstantInt::get(Scale->getType(), ScaleImm));
} else {
Scale = nullptr;
}
@@ -3273,7 +3278,7 @@ bool CodeGenPatternMatch::MatchLoadStoreAtomicsStatefulEff64(GenIntrinsicInst *I
int64_t ScaleImm = 1ll << Scale->getSExtValue();
if (DataSizeInBytes == ScaleImm) {
VarOffset = NotScaledOffset;
- Scale = ConstantInt::get(Scale->getType(), ScaleImm);
+ Scale = cast<ConstantInt>(ConstantInt::get(Scale->getType(), ScaleImm));
} else {
Scale = nullptr;
}
@@ -6081,8 +6086,9 @@ static bool isIntegerAbs(SelectInst *SI, e_modifier &mod, Value *&source) {
Value *LHS = nullptr;
Value *RHS = nullptr;
- if (!match(Cond, m_ICmp(IPred, m_Value(LHS), m_Value(RHS))))
+ if (!match(Cond, m_ICmp(m_Value(LHS), m_Value(RHS))))
return false;
+ IPred = cast<ICmpInst>(Cond)->getPredicate();
if (!ICmpInst::isSigned(IPred))
return false;
diff --git a/IGC/Compiler/CISACodeGen/RayTracingShaderLowering.cpp b/IGC/Compiler/CISACodeGen/RayTracingShaderLowering.cpp
index c14b5e4..769e720 100644
--- a/IGC/Compiler/CISACodeGen/RayTracingShaderLowering.cpp
+++ b/IGC/Compiler/CISACodeGen/RayTracingShaderLowering.cpp
@@ -69,7 +69,7 @@ static Instruction::CastOps isEliminableCastPair(const CastInst *CI1, const Cast
Type *MidIntPtrTy = MidTy->isPtrOrPtrVectorTy() ? DL.getIntPtrType(MidTy) : nullptr;
Type *DstIntPtrTy = DstTy->isPtrOrPtrVectorTy() ? DL.getIntPtrType(DstTy) : nullptr;
unsigned Res =
- CastInst::isEliminableCastPair(firstOp, secondOp, SrcTy, MidTy, DstTy, SrcIntPtrTy, MidIntPtrTy, DstIntPtrTy);
+ CastInst::isEliminableCastPair(firstOp, secondOp, SrcTy, MidTy, DstTy, &DL);
// We don't want to form an inttoptr or ptrtoint that converts to an integer
// type that differs from the pointer size.
diff --git a/IGC/Compiler/CISACodeGen/RayTracingStatefulPass.cpp b/IGC/Compiler/CISACodeGen/RayTracingStatefulPass.cpp
index 287720d..cec9f51 100644
--- a/IGC/Compiler/CISACodeGen/RayTracingStatefulPass.cpp
+++ b/IGC/Compiler/CISACodeGen/RayTracingStatefulPass.cpp
@@ -50,7 +50,7 @@ static LoadInst *legalizeLoad(LoadInst *LI) {
PointerType *ptrTy = cast<PointerType>(LI->getPointerOperand()->getType());
unsigned addressSpace = ptrTy->getAddressSpace();
- PointerType *I8PtrTy = IRB.getInt8PtrTy(addressSpace);
+ PointerType *I8PtrTy = PointerType::get(IRB.getInt8Ty(), addressSpace);
Value *I8PtrOp = IRB.CreateBitCast(LI->getPointerOperand(), I8PtrTy);
LoadInst *pNewLoadInst = IGC::cloneLoad(LI, IRB.getInt8Ty(), I8PtrOp);
@@ -71,7 +71,7 @@ static StoreInst *legalizeStore(StoreInst *SI) {
PointerType *ptrTy = cast<PointerType>(SI->getPointerOperand()->getType());
unsigned addressSpace = ptrTy->getAddressSpace();
- PointerType *I8PtrTy = IRB.getInt8PtrTy(addressSpace);
+ PointerType *I8PtrTy = PointerType::get(IRB.getInt8Ty(), addressSpace);
Value *I8PtrOp = IRB.CreateBitCast(SI->getPointerOperand(), I8PtrTy);
auto *NewSI = IGC::cloneStore(SI, newVal, I8PtrOp);
@@ -146,7 +146,7 @@ bool RaytracingStatefulPass::runOnFunction(Function &F) {
auto *ResourceOffset = RTB.CreateAdd(BaseSSHOffset, RTB.getIntN(BitWidth, BaseOffset));
auto *Offset = RTB.CreatePtrToInt(PointerOp, RTB.getInt32Ty());
- auto *ResourcePtr = RTB.CreateIntToPtr(ResourceOffset, RTB.getInt8PtrTy(Addrspace));
+ auto *ResourcePtr = RTB.CreateIntToPtr(ResourceOffset, PointerType::get(RTB.getInt8Ty(), Addrspace));
if (auto *LI = dyn_cast<LoadInst>(I)) {
LI = legalizeLoad(LI);
diff --git a/IGC/Compiler/CISACodeGen/RegisterEstimator.cpp b/IGC/Compiler/CISACodeGen/RegisterEstimator.cpp
index aa41126..b5720c8 100644
--- a/IGC/Compiler/CISACodeGen/RegisterEstimator.cpp
+++ b/IGC/Compiler/CISACodeGen/RegisterEstimator.cpp
@@ -421,7 +421,7 @@ RegPressureTracker::RegPressureTracker(RegisterEstimator *RPE) : m_BB(nullptr),
// Pre-allocate DenseMap
size_t nVals = m_pRPE->getNumValues();
uint32_t mapCap = int_cast<uint32_t>((size_t)(nVals * 1.40f));
- m_DeadValueNumUses.grow(mapCap);
+ m_DeadValueNumUses.reserve(mapCap);
}
void RegPressureTracker::init(BasicBlock *BB, bool doMaxRegInBB) {
diff --git a/IGC/Compiler/CISACodeGen/RematAddressArithmetic.cpp b/IGC/Compiler/CISACodeGen/RematAddressArithmetic.cpp
index a5683d4..ce8c257 100644
--- a/IGC/Compiler/CISACodeGen/RematAddressArithmetic.cpp
+++ b/IGC/Compiler/CISACodeGen/RematAddressArithmetic.cpp
@@ -833,7 +833,7 @@ bool RematAddressArithmetic::rematerializePhiMemoryAddressCalculation(Function &
Instruction *newIntToPtr = intToPtr->clone();
newIntToPtr->setOperand(0, newAdd);
// and insert in after the phi
- Instruction *insertPoint = BB->getFirstNonPHIOrDbgOrLifetime();
+ Instruction *insertPoint = &*BB->getFirstNonPHIOrDbgOrLifetime();
newAdd->insertBefore(insertPoint);
newIntToPtr->insertBefore(insertPoint);
phi->replaceAllUsesWith(newIntToPtr);
diff --git a/IGC/Compiler/CISACodeGen/ShaderCodeGen.cpp b/IGC/Compiler/CISACodeGen/ShaderCodeGen.cpp
index 73751e2..3c19a51 100644
--- a/IGC/Compiler/CISACodeGen/ShaderCodeGen.cpp
+++ b/IGC/Compiler/CISACodeGen/ShaderCodeGen.cpp
@@ -507,7 +507,7 @@ void AddLegalizationPasses(CodeGenContext &ctx, IGCPassManager &mpm, PSSignature
IGC_IS_FLAG_ENABLED(ForcePrivateMemoryToSLMOnBuffers)) {
TargetIRAnalysis GenTTgetIIRAnalysis([&](const Function &F) {
GenIntrinsicsTTIImpl GTTI(&ctx);
- return TargetTransformInfo(GTTI);
+ return TargetTransformInfo(std::make_unique<GenIntrinsicsTTIImpl>(std::move(GTTI)));
});
mpm.add(new TargetTransformInfoWrapperPass(std::move(GenTTgetIIRAnalysis)));
}
@@ -515,9 +515,9 @@ void AddLegalizationPasses(CodeGenContext &ctx, IGCPassManager &mpm, PSSignature
// Disable all target library functions.
// right now we don't support any standard function in the code gen
// maybe we want to support some at some point to take advantage of LLVM optimizations
- TargetLibraryInfoImpl TLI;
+ TargetLibraryInfoImpl TLI(Triple(ctx.getModule()->getTargetTriple()));
TLI.disableAllFunctions();
- mpm.add(new llvm::TargetLibraryInfoWrapperPass(TLI));
+ mpm.add(new llvm::TargetLibraryInfoWrapperPass(std::move(TLI)));
// Add Metadata API immutable pass
mpm.add(new MetaDataUtilsWrapper(pMdUtils, ctx.getModuleMetaData()));
@@ -543,9 +543,7 @@ void AddLegalizationPasses(CodeGenContext &ctx, IGCPassManager &mpm, PSSignature
if (ctx.m_threadCombiningOptDone) {
mpm.add(createLoopCanonicalization());
mpm.add(IGCLLVM::createLegacyWrappedLoopDeletionPass());
- mpm.add(llvm::createBreakCriticalEdgesPass());
- mpm.add(llvm::createLoopRotatePass(LOOP_ROTATION_HEADER_INST_THRESHOLD));
- mpm.add(llvm::createLowerSwitchPass());
+ mpm.add(llvm::createBreakCriticalEdgesPass()); mpm.add(llvm::createLowerSwitchPass());
int LoopUnrollThreshold = ctx.m_DriverInfo.GetLoopUnrollThreshold();
@@ -1259,7 +1257,7 @@ void OptimizeIR(CodeGenContext *const pContext) {
// right now we don't support any standard function in the code gen
// maybe we want to support some at some point to take advantage of LLVM optimizations
- TargetLibraryInfoImpl TLI;
+ TargetLibraryInfoImpl TLI(Triple(pContext->getModule()->getTargetTriple()));
TLI.disableAllFunctions();
mpm.add(new MetaDataUtilsWrapper(pMdUtils, pContext->getModuleMetaData()));
@@ -1267,7 +1265,7 @@ void OptimizeIR(CodeGenContext *const pContext) {
mpm.add(new CodeGenContextWrapper(pContext));
TargetIRAnalysis GenTTgetIIRAnalysis([&](const Function &F) {
GenIntrinsicsTTIImpl GTTI(pContext);
- return TargetTransformInfo(GTTI);
+ return TargetTransformInfo(std::make_unique<GenIntrinsicsTTIImpl>(std::move(GTTI)));
});
mpm.add(new TargetTransformInfoWrapperPass(GenTTgetIIRAnalysis));
@@ -1275,7 +1273,7 @@ void OptimizeIR(CodeGenContext *const pContext) {
// IGC IR Verification pass checks that we get a correct IR after the Unification.
mpm.add(new VerificationPass());
#endif
- mpm.add(new llvm::TargetLibraryInfoWrapperPass(TLI));
+ mpm.add(new llvm::TargetLibraryInfoWrapperPass(std::move(TLI)));
initializeWIAnalysisPass(*PassRegistry::getPassRegistry());
if (IGC_IS_FLAG_ENABLED(EnableSinkPointerConstAdd)) {
@@ -1409,9 +1407,7 @@ void OptimizeIR(CodeGenContext *const pContext) {
mpm.add(createLoopDeadCodeEliminationPass());
mpm.add(createLoopCanonicalization());
mpm.add(IGCLLVM::createLegacyWrappedLoopDeletionPass());
- mpm.add(llvm::createBreakCriticalEdgesPass());
- mpm.add(llvm::createLoopRotatePass(LOOP_ROTATION_HEADER_INST_THRESHOLD));
- mpm.add(llvm::createLCSSAPass());
+ mpm.add(llvm::createBreakCriticalEdgesPass()); mpm.add(llvm::createLCSSAPass());
mpm.add(llvm::createLoopSimplifyPass());
}
}
@@ -1657,8 +1653,6 @@ void OptimizeIR(CodeGenContext *const pContext) {
assert(disableGOPT);
// disable loop unroll for excessive large shaders
if (pContext->m_instrTypes.numOfLoop) {
- mpm.add(llvm::createLoopRotatePass(LOOP_ROTATION_HEADER_INST_THRESHOLD));
-
int LoopUnrollThreshold = pContext->m_DriverInfo.GetLoopUnrollThreshold();
diff --git a/IGC/Compiler/CISACodeGen/SinkCommonOffsetFromGEP.cpp b/IGC/Compiler/CISACodeGen/SinkCommonOffsetFromGEP.cpp
index 3695748..94675ce 100644
--- a/IGC/Compiler/CISACodeGen/SinkCommonOffsetFromGEP.cpp
+++ b/IGC/Compiler/CISACodeGen/SinkCommonOffsetFromGEP.cpp
@@ -7,6 +7,7 @@ SPDX-License-Identifier: MIT
============================= end_copyright_notice ===========================*/
#include "Compiler/CodeGenPublic.h"
+#include "common/LLVMUtils.h"
#include "Compiler/CISACodeGen/SinkCommonOffsetFromGEP.h"
#include "Compiler/CISACodeGen/ShaderCodeGen.hpp"
#include "Compiler/IGCPassSupport.h"
@@ -405,7 +406,7 @@ static bool sinkCommonOffsetForGroup(const CommonBaseGroup &Group) {
Indices.push_back(ConstantInt::get(Offset->getType(), 0));
Indices.push_back(Offset);
- auto OffsetGEP = GetElementPtrInst::Create(PhiElType, BasePhi, Indices, "", BasePhi->getNextNonDebugInstruction());
+ auto OffsetGEP = GetElementPtrInst::Create(PhiElType, BasePhi, Indices, "", IGC::getNextNonDbgInstruction(BasePhi));
bool isInBounds = false;
for (const auto &Gep : Geps)
diff --git a/IGC/Compiler/CISACodeGen/helper.cpp b/IGC/Compiler/CISACodeGen/helper.cpp
index 86e91a7..e84db87 100644
--- a/IGC/Compiler/CISACodeGen/helper.cpp
+++ b/IGC/Compiler/CISACodeGen/helper.cpp
@@ -2259,7 +2259,7 @@ bool isNoOpInst(Instruction *I, CodeGenContext *Ctx) {
//
//
bool valueIsPositive(Value *V, const DataLayout *DL, llvm::AssumptionCache *AC, llvm::Instruction *CxtI) {
- return computeKnownBits(V, *DL, 0, AC, CxtI).isNonNegative();
+ return computeKnownBits(V, *DL, AC, CxtI, nullptr, true, 0).isNonNegative();
}
void appendToUsed(llvm::Module &M, ArrayRef<GlobalValue *> Values) {
@@ -2279,7 +2279,7 @@ void appendToUsed(llvm::Module &M, ArrayRef<GlobalValue *> Values) {
GV->eraseFromParent();
}
- Type *Int8PtrTy = llvm::Type::getInt8PtrTy(M.getContext());
+ Type *Int8PtrTy = llvm::PointerType::get(llvm::Type::getInt8Ty(M.getContext()), 0);
for (auto *V : Values) {
Constant *C = V;
// llvm will complain if members of llvm.uses doesn't have a name
@@ -2571,7 +2571,7 @@ std::tuple<std::string, std::string, unsigned> ParseVectorVariantFunctionString(
auto strEnd = varStr.end();
// Starts with _ZGV
- IGC_ASSERT(varStr.startswith("_ZGV"));
+ IGC_ASSERT(varStr.starts_with("_ZGV"));
outStr << "_ZGV";
pos += 4;
// ISA class target processor type
diff --git a/IGC/Compiler/CISACodeGen/helper.h b/IGC/Compiler/CISACodeGen/helper.h
index 0a46902..75fa562 100644
--- a/IGC/Compiler/CISACodeGen/helper.h
+++ b/IGC/Compiler/CISACodeGen/helper.h
@@ -259,7 +259,7 @@ inline llvm::Function *getIntelSymbolTableVoidProgram(llvm::Module *pM, int Simd
// Note, the module can contain multiple dummy kernels to support SIMD variants.
// This function returns true if the current function is any of those variant kernels.
inline bool isIntelSymbolTableVoidProgram(llvm::Function *pF) {
- return (pF && pF->getName().startswith(INTEL_SYMBOL_TABLE_VOID_PROGRAM));
+ return (pF && pF->getName().starts_with(INTEL_SYMBOL_TABLE_VOID_PROGRAM));
}
int getFunctionControl(const CodeGenContext *pContext);
diff --git a/IGC/Compiler/CodeGenContext.cpp b/IGC/Compiler/CodeGenContext.cpp
index 8cf03ac..5e7a7d5 100644
--- a/IGC/Compiler/CodeGenContext.cpp
+++ b/IGC/Compiler/CodeGenContext.cpp
@@ -969,7 +969,7 @@ void CodeGenContext::initializeRemarkEmitter(const ShaderHash &hash) {
// setting up optimization remark emitter
if (IGC_IS_FLAG_ENABLED(EnableRemarks)) {
std::string remark_file_name = IGC::Debug::DumpName("Remark_").Type(this->type).Hash(hash).Extension("yaml").str();
- llvm::Expected<std::unique_ptr<llvm::ToolOutputFile>> RemarksFileOrErr =
+ llvm::Expected<llvm::LLVMRemarkFileHandle> RemarksFileOrErr =
setupLLVMOptimizationRemarks(*this->getLLVMContext(), remark_file_name, "", "yaml", false, 0);
this->RemarksFile = std::move(*RemarksFileOrErr);
this->RemarksFile->keep();
diff --git a/IGC/Compiler/CodeGenPublic.h b/IGC/Compiler/CodeGenPublic.h
index a2f0817..d80bfeb 100644
--- a/IGC/Compiler/CodeGenPublic.h
+++ b/IGC/Compiler/CodeGenPublic.h
@@ -1018,7 +1018,7 @@ private:
std::stringstream oclErrorMessage;
// For storing warning message
std::stringstream oclWarningMessage;
- std::unique_ptr<llvm::ToolOutputFile> RemarksFile;
+ llvm::LLVMRemarkFileHandle RemarksFile;
protected:
// Objects pointed to by these pointers are owned by this class.
diff --git a/IGC/Compiler/CustomLoopOpt.cpp b/IGC/Compiler/CustomLoopOpt.cpp
index 7e59b35..922b373 100644
--- a/IGC/Compiler/CustomLoopOpt.cpp
+++ b/IGC/Compiler/CustomLoopOpt.cpp
@@ -140,8 +140,8 @@ bool CustomLoopVersioning::detectLoop(Loop *loop, Value *&var_range_x, Value *&v
BasicBlock *header = loop->getHeader();
BasicBlock *body = loop->getLoopLatch();
- Instruction *i0 = body->getFirstNonPHIOrDbg();
- Instruction *i1 = i0->getNextNonDebugInstruction();
+ Instruction *i0 = IGC::getFirstNonPHIOrDbgInst(body);
+ Instruction *i1 = IGC::getNextNonDbgInstruction(i0);
CallInst *imax = dyn_cast<CallInst>(i0);
CallInst *imin = i1 ? dyn_cast<CallInst>(i1) : nullptr;
@@ -252,8 +252,8 @@ void CustomLoopVersioning::rewriteLoopSeg1(Loop *loop, Value *interval_x, Value
fcmp->setOperand(1, interval_x);
- Instruction *i0 = body->getFirstNonPHIOrDbg();
- Instruction *i1 = i0->getNextNonDebugInstruction();
+ Instruction *i0 = IGC::getFirstNonPHIOrDbgInst(body);
+ Instruction *i1 = IGC::getNextNonDbgInstruction(i0);
IntrinsicInst *imax = cast<IntrinsicInst>(i0);
IntrinsicInst *imin = cast<IntrinsicInst>(i1);
@@ -309,13 +309,13 @@ void CustomLoopVersioning::hoistSeg2Invariant(Loop *loop, Instruction *fmul, Val
if (fmul_log2 && fmul_log2->getParent() == body) {
IntrinsicInst *intrin = dyn_cast<IntrinsicInst>(*fmul_log2->users().begin());
if (intrin && intrin->getIntrinsicID() == Intrinsic::exp2) {
- IRBuilder<> irb(preHdr->getFirstNonPHIOrDbg());
+ IRBuilder<> irb(IGC::getFirstNonPHIOrDbgInst(preHdr));
irb.setFastMathFlags(fmul_log2->getFastMathFlags());
Function *flog =
- Intrinsic::getDeclaration(m_function->getParent(), llvm::Intrinsic::log2, intrin_log2->getType());
+ Intrinsic::getOrInsertDeclaration(m_function->getParent(), llvm::Intrinsic::log2, intrin_log2->getType());
Function *fexp =
- Intrinsic::getDeclaration(m_function->getParent(), llvm::Intrinsic::exp2, intrin_log2->getType());
+ Intrinsic::getOrInsertDeclaration(m_function->getParent(), llvm::Intrinsic::exp2, intrin_log2->getType());
Value *v = irb.CreateCall(flog, cbLoad);
v = irb.CreateFMul(fmul_log2_opnd, v);
v = irb.CreateCall(fexp, v);
@@ -348,8 +348,8 @@ void CustomLoopVersioning::rewriteLoopSeg2(Loop *loop, Value *interval_y, Value
v->setFast(true);
fcmp->setOperand(1, v);
- Instruction *i0 = body->getFirstNonPHIOrDbg();
- Instruction *i1 = i0->getNextNonDebugInstruction();
+ Instruction *i0 = IGC::getFirstNonPHIOrDbgInst(body);
+ Instruction *i1 = IGC::getNextNonDbgInstruction(i0);
IntrinsicInst *imax = cast<IntrinsicInst>(i0);
IntrinsicInst *imin = cast<IntrinsicInst>(i1);
@@ -390,8 +390,8 @@ void CustomLoopVersioning::rewriteLoopSeg2(Loop *loop, Value *interval_y, Value
// float val0 = t;
// float val1 = loop_range_y;
void CustomLoopVersioning::rewriteLoopSeg3(BasicBlock *bb, Value *interval_y) {
- Instruction *i0 = bb->getFirstNonPHIOrDbg();
- Instruction *i1 = i0->getNextNonDebugInstruction();
+ Instruction *i0 = IGC::getFirstNonPHIOrDbgInst(bb);
+ Instruction *i1 = IGC::getNextNonDbgInstruction(i0);
IntrinsicInst *imax = cast<IntrinsicInst>(i0);
IntrinsicInst *imin = cast<IntrinsicInst>(i1);
@@ -921,7 +921,7 @@ bool LoopHoistConstant::runOnLoop(Loop *L, LPPassManager &LPM) {
// Match the minnum comparison between the induction var and the loop size
// Should appear right after the post-incremented induction variable
- MinInst = dyn_cast<IntrinsicInst>(InductionPostInc->getNextNonDebugInstruction());
+ MinInst = dyn_cast<IntrinsicInst>(IGC::getNextNonDbgInstruction(InductionPostInc));
if (MinInst && MinInst->getIntrinsicID() == llvm::Intrinsic::minnum) {
Value *min1 = MinInst->getOperand(0);
Value *min2 = MinInst->getOperand(1);
diff --git a/IGC/Compiler/CustomSafeOptPass.cpp b/IGC/Compiler/CustomSafeOptPass.cpp
index 4b7f967..5b2ed4c 100644
--- a/IGC/Compiler/CustomSafeOptPass.cpp
+++ b/IGC/Compiler/CustomSafeOptPass.cpp
@@ -62,6 +62,7 @@ cmp+sel to avoid expensive VxH mov.
#include "GenISAIntrinsics/GenIntrinsics.h"
#include "GenISAIntrinsics/GenIntrinsicInst.h"
#include "common/IGCConstantFolder.h"
+#include "common/LLVMUtils.h"
#include "common/LLVMWarningsPush.hpp"
#include <llvm/ADT/Statistic.h>
#include <llvm/ADT/SetVector.h>
@@ -158,10 +159,14 @@ void CustomSafeOptPass::visitXor(Instruction &XorInstr) {
using namespace llvm::PatternMatch;
CmpInst::Predicate Pred = CmpInst::Predicate::FCMP_FALSE;
- auto XorPattern = m_c_Xor(m_ICmp(Pred, m_Value(), m_Value()), m_SpecificInt(1));
+ auto XorPattern = m_c_Xor(m_ICmp(m_Value(), m_Value()), m_SpecificInt(1));
if (!match(&XorInstr, XorPattern)) {
return;
}
+ Pred = cast<ICmpInst>(isa<ICmpInst>(XorInstr.getOperand(0)) ? XorInstr.getOperand(0) : XorInstr.getOperand(1))->getPredicate();
+ if (false) {
+ return;
+ }
Value *XorOp0 = XorInstr.getOperand(0);
Value *XorOp1 = XorInstr.getOperand(1);
@@ -210,8 +215,8 @@ void CustomSafeOptPass::visitXor(Instruction &XorInstr) {
if (Instruction *NewCmpInst = dyn_cast<Instruction>(NewCmp)) {
NewCmpInst->setDebugLoc(DL);
auto *Val = static_cast<Value *>(ICmpInstr);
- SmallVector<DbgValueInst *, 1> DbgValues;
- llvm::findDbgValues(DbgValues, Val);
+ SmallVector<DbgVariableRecord *, 1> DbgValues;
+ llvm::findDbgValues(Val, DbgValues);
for (auto DV : DbgValues) {
DIExpression *OldExpr = DV->getExpression();
DIExpression *NewExpr =
@@ -250,9 +255,10 @@ void CustomSafeOptPass::visitAnd(BinaryOperator &I) {
Value *XorArgValue = nullptr;
CmpInst::Predicate Pred = CmpInst::Predicate::FCMP_FALSE;
- auto AndPattern = m_c_And(m_c_Xor(m_Value(XorArgValue), m_SpecificInt(1)), m_ICmp(Pred, m_Value(), m_Value()));
+ auto AndPattern = m_c_And(m_c_Xor(m_Value(XorArgValue), m_SpecificInt(1)), m_ICmp(m_Value(), m_Value()));
if (!match(&I, AndPattern))
return;
+ Pred = cast<ICmpInst>(isa<ICmpInst>(I.getOperand(0)) ? I.getOperand(0) : I.getOperand(1))->getPredicate();
IRBuilder<> builder(&I);
auto CompareInst = cast<ICmpInst>(isa<ICmpInst>(I.getOperand(0)) ? I.getOperand(0) : I.getOperand(1));
@@ -270,8 +276,8 @@ void CustomSafeOptPass::visitAnd(BinaryOperator &I) {
if (Instruction *NewOrInst = dyn_cast<Instruction>(OrInst)) {
NewOrInst->setDebugLoc(DL);
auto *Val = static_cast<Value *>(&I);
- SmallVector<DbgValueInst *, 1> DbgValues;
- llvm::findDbgValues(DbgValues, Val);
+ SmallVector<DbgVariableRecord *, 1> DbgValues;
+ llvm::findDbgValues(Val, DbgValues);
for (auto DV : DbgValues) {
DIExpression *OldExpr = DV->getExpression();
DIExpression *NewExpr =
@@ -893,7 +899,7 @@ void CustomSafeOptPass::visitAllocaInst(AllocaInst &I) {
// A debug line info is moved so the alloca has corresponding dbg.declare call
// with DIExpression DW_OP_LLVM_fragment specifying fragment.
- TinyPtrVector<DbgDeclareInst *> Dbgs = llvm::FindDbgDeclareUses(&I);
+ TinyPtrVector<DbgVariableRecord *> Dbgs = llvm::findDVRDeclares(&I);
unsigned typeSize = (unsigned)pType->getArrayElementType()->getPrimitiveSizeInBits();
if (!Dbgs.empty()) {
const DebugLoc DL = I.getDebugLoc();
@@ -3299,9 +3305,9 @@ void GenSpecificPattern::visitCmpInst(CmpInst &I) {
CmpInst::Predicate Pred = CmpInst::Predicate::BAD_ICMP_PREDICATE;
Value *Val1 = nullptr;
uint64_t const_int1 = 0, const_int2 = 0;
- auto cmp_pattern = m_Cmp(Pred, m_And(m_Value(Val1), m_ConstantInt(const_int1)), m_ConstantInt(const_int2));
+ auto cmp_pattern = m_Cmp(m_And(m_Value(Val1), m_ConstantInt(const_int1)), m_ConstantInt(const_int2));
- if (match(&I, cmp_pattern) && (const_int1 << 32) == 0 && (const_int2 << 32) == 0 &&
+ if (match(&I, cmp_pattern) && (Pred = I.getPredicate(), true) && (const_int1 << 32) == 0 && (const_int2 << 32) == 0 &&
Val1->getType()->isIntegerTy(64)) {
llvm::IRBuilder<> builder(&I);
VectorType *vec2 = IGCLLVM::FixedVectorType::get(builder.getInt32Ty(), 2);
@@ -3565,7 +3571,7 @@ void GenSpecificPattern::visitCastInst(CastInst &I) {
if (isa<FPMathOperator>(srcVal) && srcVal->isFast()) {
IRBuilder<> builder(&I);
Function *func =
- Intrinsic::getDeclaration(I.getParent()->getParent()->getParent(), Intrinsic::trunc, I.getType());
+ Intrinsic::getOrInsertDeclaration(I.getParent()->getParent()->getParent(), Intrinsic::trunc, I.getType());
Value *newVal = builder.CreateCall(func, srcVal);
I.replaceAllUsesWith(newVal);
I.eraseFromParent();
@@ -3708,7 +3714,7 @@ void GenSpecificPattern::visitZExtInst(ZExtInst &ZEI) {
* %zext.0 = extractelement <2 x i32> %call, i32 0 --> result
* %zext.1 = extractelement <2 x i32> %call, i32 1 --> carry
*/
- auto addcPattern1 = m_Cmp(pred, m_Instruction(I1), m_ConstantInt(C2));
+ auto addcPattern1 = m_Cmp(m_Instruction(I1), m_ConstantInt(C2));
auto addcPattern2 = m_Add(m_Instruction(I2), m_ConstantInt(C1));
/*
@@ -3721,9 +3727,9 @@ void GenSpecificPattern::visitZExtInst(ZExtInst &ZEI) {
* %zext.2 = extractelement <2 x i32> %call.1, i32 0 --> result
* %zext.3 = extractelement <2 x i32> %call.1, i32 1 --> carry
*/
- auto addcPattern3 = m_Cmp(pred, m_Add(m_Instruction(I1), m_Instruction(I2)), m_Instruction(I3));
+ auto addcPattern3 = m_Cmp(m_Add(m_Instruction(I1), m_Instruction(I2)), m_Instruction(I3));
- if (match(Cmp, addcPattern1) && pred == CmpInst::Predicate::ICMP_EQ && C2->isMinusOne()) {
+ if (match(Cmp, addcPattern1) && (pred = cast<CmpInst>(Cmp)->getPredicate(), true) && pred == CmpInst::Predicate::ICMP_EQ && C2->isMinusOne()) {
IGC_ASSERT(I1);
for (auto U : I1->users()) {
Instruction *inst = dyn_cast<Instruction>(U);
@@ -3733,7 +3739,7 @@ void GenSpecificPattern::visitZExtInst(ZExtInst &ZEI) {
return;
}
}
- } else if (match(Cmp, addcPattern3) && pred == CmpInst::Predicate::ICMP_ULT && (I1 == I3 || I2 == I3) &&
+ } else if (match(Cmp, addcPattern3) && (pred = cast<CmpInst>(Cmp)->getPredicate(), true) && pred == CmpInst::Predicate::ICMP_ULT && (I1 == I3 || I2 == I3) &&
ZEI.getType() == I3->getType() && I3->getType()->isIntegerTy(32)) {
Instruction *inst = dyn_cast<Instruction>(Cmp->getOperand(0));
if (isActualAddInstr(inst)) {
@@ -6035,7 +6041,7 @@ void LogicalAndToBranch::convertAndToBranch(Instruction *opAnd, Instruction *con
BasicBlock *bb = opAnd->getParent();
BasicBlock *bbThen, *bbElse, *bbEnd;
- Instruction *splitBefore = cond0->getNextNonDebugInstruction();
+ Instruction *splitBefore = IGC::getNextNonDbgInstruction(cond0);
bbThen = bb->splitBasicBlock(splitBefore->getIterator(), "if.then");
bbElse = bbThen->splitBasicBlock(opAnd, "if.else");
bbEnd = bbElse->splitBasicBlock(opAnd, "if.end");
diff --git a/IGC/Compiler/CustomUnsafeOptPass.cpp b/IGC/Compiler/CustomUnsafeOptPass.cpp
index 1efbbd9..0c22e64 100644
--- a/IGC/Compiler/CustomUnsafeOptPass.cpp
+++ b/IGC/Compiler/CustomUnsafeOptPass.cpp
@@ -338,10 +338,10 @@ bool CustomUnsafeOptPass::visitBinaryOperatorFmulFaddPropagation(BinaryOperator
return false;
}
- instBase[1] = instBase[0]->getNextNonDebugInstruction();
+ instBase[1] = IGC::getNextNonDbgInstruction(instBase[0]);
if (instBase[1] && instBase[1]->getOpcode() != opcode) {
- instBase[1] = instBase[1]->getNextNonDebugInstruction();
+ instBase[1] = IGC::getNextNonDbgInstruction(instBase[1]);
}
if (instBase[1] == nullptr || instBase[1]->getOpcode() != opcode ||
@@ -359,10 +359,10 @@ bool CustomUnsafeOptPass::visitBinaryOperatorFmulFaddPropagation(BinaryOperator
matchPattern1 = true;
}
for (int i = 2; i < 4; i++) {
- instBase[i] = instBase[i - 1]->getNextNonDebugInstruction();
+ instBase[i] = IGC::getNextNonDbgInstruction(instBase[i - 1]);
if (instBase[i] && instBase[i - 1]->getOpcode() != instBase[i]->getOpcode()) {
- instBase[i] = instBase[i]->getNextNonDebugInstruction();
+ instBase[i] = IGC::getNextNonDbgInstruction(instBase[i]);
}
if (!instBase[i] || instBase[i]->getOpcode() != opcode ||
@@ -1047,8 +1047,8 @@ bool CustomUnsafeOptPass::visitBinaryOperatorNegateMultiply(BinaryOperator &I) {
const DebugLoc &DL = NewfmulInst->getDebugLoc();
fsubInstr->setDebugLoc(DL);
auto *Val = static_cast<Value *>(fmulInst);
- SmallVector<DbgValueInst *, 1> DbgValues;
- llvm::findDbgValues(DbgValues, Val);
+ SmallVector<DbgVariableRecord *, 1> DbgValues;
+ llvm::findDbgValues(Val, DbgValues);
for (auto DV : DbgValues) {
DIExpression *OldExpr = DV->getExpression();
DIExpression *NewExpr =
@@ -1219,7 +1219,7 @@ bool CustomUnsafeOptPass::visitBinaryOperatorDivRsq(BinaryOperator &I) {
if (ConstantFP *fp0 = dyn_cast<ConstantFP>(I.getOperand(0))) {
llvm::IRBuilder<> builder(I.getContext());
llvm::CallInst *sqrt_call = llvm::IntrinsicInst::Create(
- llvm::Intrinsic::getDeclaration(m_ctx->getModule(), Intrinsic::sqrt, builder.getFloatTy()),
+ llvm::Intrinsic::getOrInsertDeclaration(m_ctx->getModule(), Intrinsic::sqrt, builder.getFloatTy()),
genIntr->getOperand(0), "", &I);
if (fp0->isExactlyValue(1.0)) {
@@ -2069,7 +2069,7 @@ void CustomUnsafeOptPass::strengthReducePowOrExpLog(IntrinsicInst *intrin, Value
irb.setFastMathFlags(intrin->getFastMathFlags());
if (exponent == ConstantFP::get(exponent->getType(), 0.5)) {
// pow(x, 0.5) -> sqrt(x)
- llvm::Function *sqrtIntr = llvm::Intrinsic::getDeclaration(m_ctx->getModule(), Intrinsic::sqrt, base->getType());
+ llvm::Function *sqrtIntr = llvm::Intrinsic::getOrInsertDeclaration(m_ctx->getModule(), Intrinsic::sqrt, base->getType());
llvm::CallInst *sqrt = irb.CreateCall(sqrtIntr, base);
intrin->replaceAllUsesWith(sqrt);
collectForErase(*intrin);
@@ -2116,8 +2116,8 @@ void CustomUnsafeOptPass::strengthReducePowOrExpLog(IntrinsicInst *intrin, Value
collectForErase(*intrin);
} else if (isPow && IGC_IS_FLAG_ENABLED(EnablePowToLogMulExp)) {
// pow(x, y) -> exp2(log2(x) * y)
- Function *logf = Intrinsic::getDeclaration(m_ctx->getModule(), Intrinsic::log2, base->getType());
- Function *expf = Intrinsic::getDeclaration(m_ctx->getModule(), Intrinsic::exp2, base->getType());
+ Function *logf = Intrinsic::getOrInsertDeclaration(m_ctx->getModule(), Intrinsic::log2, base->getType());
+ Function *expf = Intrinsic::getOrInsertDeclaration(m_ctx->getModule(), Intrinsic::exp2, base->getType());
CallInst *logv = irb.CreateCall(logf, base);
Value *mulv = irb.CreateFMul(logv, exponent);
CallInst *expv = irb.CreateCall(expf, mulv);
diff --git a/IGC/Compiler/DebugInfo/Utils.cpp b/IGC/Compiler/DebugInfo/Utils.cpp
index 889ec05..56ac2d7 100644
--- a/IGC/Compiler/DebugInfo/Utils.cpp
+++ b/IGC/Compiler/DebugInfo/Utils.cpp
@@ -90,7 +90,7 @@ llvm::Instruction *UpdateGlobalVarDebugInfo(llvm::GlobalVariable *pGlobalVar, ll
if (isIndirect)
return Builder.insertDeclare(pNewVal, llvm::cast<llvm::DILocalVariable>(Var), Builder.createExpression(),
- locToUse, pEntryPoint);
+ locToUse, pEntryPoint).template dyn_cast<llvm::Instruction *>();
return Builder.insertDbgValueIntrinsic(pNewVal, 0, llvm::cast<llvm::DILocalVariable>(Var),
Builder.createExpression(), locToUse, pEntryPoint);
diff --git a/IGC/Compiler/GenTTI.cpp b/IGC/Compiler/GenTTI.cpp
index d69ac0b..ddb2902 100644
--- a/IGC/Compiler/GenTTI.cpp
+++ b/IGC/Compiler/GenTTI.cpp
@@ -35,7 +35,7 @@ using namespace IGC;
namespace llvm {
-bool GenIntrinsicsTTIImpl::isLoweredToCall(const Function *F) {
+bool GenIntrinsicsTTIImpl::isLoweredToCall(const Function *F) const {
if (GenISAIntrinsic::isIntrinsic(F))
return false;
return BaseT::isLoweredToCall(F);
@@ -45,7 +45,7 @@ bool GenIntrinsicsTTIImpl::isLoweredToCall(const Function *F) {
// instructions. Set this to false unless IGC legalization can fix them.
bool GenIntrinsicsTTIImpl::shouldBuildLookupTables() { return false; }
-bool GenIntrinsicsTTIImpl::enablePromoteLoopUnrollwithAlloca() {
+bool GenIntrinsicsTTIImpl::enablePromoteLoopUnrollwithAlloca() const {
const IGC::TriboolFlag RK_PromoteLoopUnrollwithAlloca =
static_cast<TriboolFlag>(IGC_GET_FLAG_VALUE(ForcePromoteLoopUnrollwithAlloca));
switch (RK_PromoteLoopUnrollwithAlloca) {
@@ -303,7 +303,8 @@ void GenIntrinsicsTTIImpl::getUnrollingPreferences(Loop *L, ScalarEvolution &SE,
}
if (UnrollLoopForCodeSizeOnly) {
- UP.Threshold = getLoopSize(L, *this) + 1;
+ const TargetTransformInfo TTI(ctx->getModule()->getDataLayout());
+ UP.Threshold = getLoopSize(L, TTI) + 1;
UP.MaxPercentThresholdBoost = 100;
UP.Partial = false;
}
@@ -427,7 +428,8 @@ void GenIntrinsicsTTIImpl::getUnrollingPreferences(Loop *L, ScalarEvolution &SE,
SmallPtrSet<const Value *, 32> EphValues;
CodeMetrics Metrics;
- Metrics.analyzeBasicBlock(BB, *this, EphValues);
+ const TargetTransformInfo TTI(ctx->getModule()->getDataLayout());
+ Metrics.analyzeBasicBlock(BB, TTI, EphValues);
if (Metrics.NumInsts < 50) {
for (auto I = BB->begin(), E = BB->end(); I != E; ++I) {
CallInst *Call = dyn_cast<CallInst>(I);
@@ -631,7 +633,7 @@ void GenIntrinsicsTTIImpl::getUnrollingPreferences(Loop *L, ScalarEvolution &SE,
for (unsigned i = 0; i < LoopID->getNumOperands(); ++i) {
if (MDNode *MD = llvm::dyn_cast<MDNode>(LoopID->getOperand(i))) {
if (MDString *S = llvm::dyn_cast<MDString>(MD->getOperand(0))) {
- if (maxIterMetadataNames.equals(S->getString())) {
+ if (maxIterMetadataNames == S->getString()) {
UP.MaxCount = static_cast<unsigned>(mdconst::extract<ConstantInt>(MD->getOperand(1))->getZExtValue());
}
}
@@ -651,7 +653,7 @@ void GenIntrinsicsTTIImpl::getPeelingPreferences(Loop *L, ScalarEvolution &SE,
for (unsigned i = 0; i < LoopID->getNumOperands(); ++i) {
if (MDNode *MD = llvm::dyn_cast<MDNode>(LoopID->getOperand(i))) {
if (MDString *S = llvm::dyn_cast<MDString>(MD->getOperand(0))) {
- if (peelCountMetadataNames.equals(S->getString())) {
+ if (peelCountMetadataNames == S->getString()) {
PP.AllowPeeling = true;
PP.PeelCount = static_cast<unsigned>(mdconst::extract<ConstantInt>(MD->getOperand(1))->getZExtValue());
}
@@ -678,13 +680,13 @@ llvm::InstructionCost GenIntrinsicsTTIImpl::getUserCost(const User *U, ArrayRef<
#if LLVM_VERSION_MAJOR >= 16
llvm::InstructionCost GenIntrinsicsTTIImpl::getInstructionCost(const User *U, ArrayRef<const Value *> Operands,
- TTI::TargetCostKind CostKind) {
+ TTI::TargetCostKind CostKind) const {
return GenIntrinsicsTTIImpl::internalCalculateCost(U, Operands, CostKind);
}
#endif
llvm::InstructionCost GenIntrinsicsTTIImpl::internalCalculateCost(const User *U, ArrayRef<const Value *> Operands,
- TTI::TargetCostKind CostKind) {
+ TTI::TargetCostKind CostKind) const {
// The extra cost of speculative execution for math intrinsics
if (auto *II = dyn_cast_or_null<IntrinsicInst>(U)) {
if (Intrinsic::ID IID = II->getIntrinsicID()) {
@@ -746,7 +748,7 @@ unsigned getLoopSize(const Loop *L, const TargetTransformInfo &TTI) {
LoopSize = Metrics.NumInsts;
LoopSize = (LoopSize > 3 /*BEInsns + 1*/) ? LoopSize : 3;
- return *LoopSize.getValue();
+ return LoopSize.getValue();
}
} // namespace llvm
diff --git a/IGC/Compiler/GenTTI.h b/IGC/Compiler/GenTTI.h
index 643450c..60be777 100644
--- a/IGC/Compiler/GenTTI.h
+++ b/IGC/Compiler/GenTTI.h
@@ -32,9 +32,9 @@ public:
DenseMap<Value *, bool> isGEPLoopInduction;
bool shouldBuildLookupTables();
- bool enablePromoteLoopUnrollwithAlloca();
+ bool enablePromoteLoopUnrollwithAlloca() const;
- bool isLoweredToCall(const Function *F);
+ bool isLoweredToCall(const Function *F) const;
void *getAdjustedAnalysisPointer(const void *ID);
@@ -55,11 +55,11 @@ public:
llvm::InstructionCost getUserCost(const User *U, ArrayRef<const Value *> Operands, TTI::TargetCostKind CostKind);
llvm::InstructionCost getInstructionCost(const User *U, ArrayRef<const Value *> Operands,
- TTI::TargetCostKind CostKind);
+ TTI::TargetCostKind CostKind) const;
private:
llvm::InstructionCost internalCalculateCost(const User *U, ArrayRef<const Value *> Operands,
- TTI::TargetCostKind CostKind);
+ TTI::TargetCostKind CostKind) const;
};
unsigned getLoopSize(const Loop *L, const TargetTransformInfo &TTI);
diff --git a/IGC/Compiler/GenUpdateCB.cpp b/IGC/Compiler/GenUpdateCB.cpp
index 53ec408..dc535c2 100644
--- a/IGC/Compiler/GenUpdateCB.cpp
+++ b/IGC/Compiler/GenUpdateCB.cpp
@@ -203,58 +203,58 @@ void GenUpdateCB::InsertInstTree(Instruction *inst, Instruction *pos) {
if (CallInst *callI = dyn_cast<CallInst>(Clone)) {
switch (GetOpCode(callI)) {
case llvm_log:
- pfunc = llvm::Intrinsic::getDeclaration(
+ pfunc = llvm::Intrinsic::getOrInsertDeclaration(
m_ConstantBufferReplaceShaderPatterns, Intrinsic::log2,
llvm::ArrayRef<llvm::Type *>(Type::getFloatTy(m_ConstantBufferReplaceShaderPatterns->getContext())));
break;
case llvm_sqrt:
- pfunc = llvm::Intrinsic::getDeclaration(
+ pfunc = llvm::Intrinsic::getOrInsertDeclaration(
m_ConstantBufferReplaceShaderPatterns, Intrinsic::sqrt,
llvm::ArrayRef<llvm::Type *>(Type::getFloatTy(m_ConstantBufferReplaceShaderPatterns->getContext())));
break;
case llvm_pow:
- pfunc = llvm::Intrinsic::getDeclaration(
+ pfunc = llvm::Intrinsic::getOrInsertDeclaration(
m_ConstantBufferReplaceShaderPatterns, Intrinsic::pow,
llvm::ArrayRef<llvm::Type *>(Type::getFloatTy(m_ConstantBufferReplaceShaderPatterns->getContext())));
break;
case llvm_cos:
- pfunc = llvm::Intrinsic::getDeclaration(
+ pfunc = llvm::Intrinsic::getOrInsertDeclaration(
m_ConstantBufferReplaceShaderPatterns, Intrinsic::cos,
llvm::ArrayRef<llvm::Type *>(Type::getFloatTy(m_ConstantBufferReplaceShaderPatterns->getContext())));
break;
case llvm_sin:
- pfunc = llvm::Intrinsic::getDeclaration(
+ pfunc = llvm::Intrinsic::getOrInsertDeclaration(
m_ConstantBufferReplaceShaderPatterns, Intrinsic::sin,
llvm::ArrayRef<llvm::Type *>(Type::getFloatTy(m_ConstantBufferReplaceShaderPatterns->getContext())));
break;
case llvm_exp:
- pfunc = llvm::Intrinsic::getDeclaration(
+ pfunc = llvm::Intrinsic::getOrInsertDeclaration(
m_ConstantBufferReplaceShaderPatterns, Intrinsic::exp2,
llvm::ArrayRef<llvm::Type *>(Type::getFloatTy(m_ConstantBufferReplaceShaderPatterns->getContext())));
break;
case llvm_floor:
- pfunc = llvm::Intrinsic::getDeclaration(
+ pfunc = llvm::Intrinsic::getOrInsertDeclaration(
m_ConstantBufferReplaceShaderPatterns, Intrinsic::floor,
llvm::ArrayRef<llvm::Type *>(Type::getFloatTy(m_ConstantBufferReplaceShaderPatterns->getContext())));
break;
case llvm_ceil:
- pfunc = llvm::Intrinsic::getDeclaration(
+ pfunc = llvm::Intrinsic::getOrInsertDeclaration(
m_ConstantBufferReplaceShaderPatterns, Intrinsic::ceil,
llvm::ArrayRef<llvm::Type *>(Type::getFloatTy(m_ConstantBufferReplaceShaderPatterns->getContext())));
break;
case llvm_fabs:
- pfunc = llvm::Intrinsic::getDeclaration(
+ pfunc = llvm::Intrinsic::getOrInsertDeclaration(
m_ConstantBufferReplaceShaderPatterns, Intrinsic::fabs,
llvm::ArrayRef<llvm::Type *>(Type::getFloatTy(m_ConstantBufferReplaceShaderPatterns->getContext())));
break;
case llvm_max:
- pfunc = llvm::Intrinsic::getDeclaration(
+ pfunc = llvm::Intrinsic::getOrInsertDeclaration(
m_ConstantBufferReplaceShaderPatterns, Intrinsic::maxnum,
llvm::ArrayRef<llvm::Type *>(Type::getFloatTy(m_ConstantBufferReplaceShaderPatterns->getContext())));
break;
case llvm_min:
- pfunc = llvm::Intrinsic::getDeclaration(
+ pfunc = llvm::Intrinsic::getOrInsertDeclaration(
m_ConstantBufferReplaceShaderPatterns, Intrinsic::minnum,
llvm::ArrayRef<llvm::Type *>(Type::getFloatTy(m_ConstantBufferReplaceShaderPatterns->getContext())));
break;
diff --git a/IGC/Compiler/IGCPassSupport.h b/IGC/Compiler/IGCPassSupport.h
index 107b395..1fde96b 100644
--- a/IGC/Compiler/IGCPassSupport.h
+++ b/IGC/Compiler/IGCPassSupport.h
@@ -20,6 +20,7 @@ See LICENSE.TXT for details.
#include "Compiler/InitializePasses.h"
#include "common/LLVMWarningsPush.hpp"
+#include "llvm/Config/llvm-config.h"
#include "llvm/InitializePasses.h"
#include <llvm/Pass.h>
#include "llvm/Support/Threading.h"
@@ -45,6 +46,17 @@ See LICENSE.TXT for details.
#define IGC_INITIALIZE_AG_DEPENDENCY(depName) INITIALIZE_AG_DEPENDENCY(depName)
+#if LLVM_VERSION_MAJOR >= 22
+#define IGC_INITIALIZE_PASS_END(passName, arg, name, cfg, analysis) \
+ PassInfo *PI = \
+ new PassInfo(name, arg, &passName ::ID, PassInfo::NormalCtor_t(callDefaultCtor<passName>), cfg, analysis); \
+ Registry.registerPass(*PI, true); \
+ } \
+ static llvm::once_flag Initialize##passName##PassFlag; \
+ void initialize##passName##Pass(PassRegistry &Registry) { \
+ llvm::call_once(Initialize##passName##PassFlag, initialize##passName##PassOnce, std::ref(Registry)); \
+ }
+#else
#define IGC_INITIALIZE_PASS_END(passName, arg, name, cfg, analysis) \
PassInfo *PI = \
new PassInfo(name, arg, &passName ::ID, PassInfo::NormalCtor_t(callDefaultCtor<passName>), cfg, analysis); \
@@ -55,6 +67,11 @@ See LICENSE.TXT for details.
void initialize##passName##Pass(PassRegistry &Registry) { \
llvm::call_once(Initialize##passName##PassFlag, initialize##passName##PassOnce, std::ref(Registry)); \
}
+#endif \
+ static llvm::once_flag Initialize##passName##PassFlag; \
+ void initialize##passName##Pass(PassRegistry &Registry) { \
+ llvm::call_once(Initialize##passName##PassFlag, initialize##passName##PassOnce, std::ref(Registry)); \
+ }
#define IGC_INITIALIZE_AG_PASS(passName, agName, arg, name, cfg, analysis, def) \
static void *initialize##passName##PassOnce(PassRegistry &Registry) { \
diff --git a/IGC/Compiler/LegalizationPass.cpp b/IGC/Compiler/LegalizationPass.cpp
index 6e0ccae..3d595a5 100644
--- a/IGC/Compiler/LegalizationPass.cpp
+++ b/IGC/Compiler/LegalizationPass.cpp
@@ -259,7 +259,7 @@ void Legalization::visitBinaryOperator(llvm::BinaryOperator &I) {
if (I.getOpcode() == Instruction::FRem && (I.getType()->isFloatTy() || I.getType()->isHalfTy())) {
bool hasFP16Floor = !m_ctx->platform.supportFP16Rounding();
Type *floorType = hasFP16Floor ? I.getType() : m_builder->getFloatTy();
- Function *floorFunc = Intrinsic::getDeclaration(m_ctx->getModule(), Intrinsic::floor, floorType);
+ Function *floorFunc = Intrinsic::getOrInsertDeclaration(m_ctx->getModule(), Intrinsic::floor, floorType);
m_builder->SetInsertPoint(&I);
Value *a = I.getOperand(0);
Value *b = I.getOperand(1);
@@ -1213,7 +1213,7 @@ void Legalization::visitStoreInst(StoreInst &I) {
PointerType *ptrTy = cast<PointerType>(I.getPointerOperand()->getType());
unsigned addressSpace = ptrTy->getAddressSpace();
- PointerType *I8PtrTy = m_builder->getInt8PtrTy(addressSpace);
+ PointerType *I8PtrTy = PointerType::get(m_builder->getInt8Ty(), addressSpace);
Value *I8PtrOp = m_builder->CreateBitCast(I.getPointerOperand(), I8PtrTy);
IGC::cloneStore(&I, newVal, I8PtrOp);
@@ -1276,7 +1276,7 @@ void Legalization::visitLoadInst(LoadInst &I) {
m_builder->SetInsertPoint(&I);
PointerType *ptrTy = cast<PointerType>(I.getPointerOperand()->getType());
unsigned addressSpace = ptrTy->getAddressSpace();
- PointerType *I8PtrTy = m_builder->getInt8PtrTy(addressSpace);
+ PointerType *I8PtrTy = PointerType::get(m_builder->getInt8Ty(), addressSpace);
Value *I8PtrOp = m_builder->CreateBitCast(I.getPointerOperand(), I8PtrTy);
LoadInst *pNewLoadInst = IGC::cloneLoad(&I, m_builder->getInt8Ty(), I8PtrOp);
@@ -1847,7 +1847,7 @@ void Legalization::visitIntrinsicInst(llvm::IntrinsicInst &I) {
// demote back.
Value *Val = Builder.CreateFPExt(I.getOperand(0), Builder.getFloatTy());
Value *Callee =
- Intrinsic::getDeclaration(I.getParent()->getParent()->getParent(), intrinsicID, Builder.getFloatTy());
+ Intrinsic::getOrInsertDeclaration(I.getParent()->getParent()->getParent(), intrinsicID, Builder.getFloatTy());
Val = Builder.CreateCall(Callee, ArrayRef<Value *>(Val));
Val = Builder.CreateFPTrunc(Val, I.getType());
I.replaceAllUsesWith(Val);
diff --git a/IGC/Compiler/Legalizer/InstPromoter.cpp b/IGC/Compiler/Legalizer/InstPromoter.cpp
index 82ee857..4155393 100644
--- a/IGC/Compiler/Legalizer/InstPromoter.cpp
+++ b/IGC/Compiler/Legalizer/InstPromoter.cpp
@@ -232,7 +232,7 @@ bool InstPromoter::visitLoadInst(LoadInst &I) {
Type *PromotedTy = TySeq->front();
- Value *NewBasePtr = IRB->CreatePointerCast(OldPtr, IRB->getInt8PtrTy(AS), Twine(OldPtr->getName(), ".ptrcast"));
+ Value *NewBasePtr = IRB->CreatePointerCast(OldPtr, PointerType::get(IRB->getInt8Ty(), AS), Twine(OldPtr->getName(), ".ptrcast"));
// Different from promotion of regular instructions, such as 'add', promotion
// of load is required to split the original load into small ones and
@@ -307,7 +307,7 @@ bool InstPromoter::visitStoreInst(StoreInst &I) {
Value *PromotedVal = ValSeq->front();
- Value *NewBasePtr = IRB->CreatePointerCast(OldPtr, IRB->getInt8PtrTy(AS), Twine(OldPtr->getName(), ".ptrcast"));
+ Value *NewBasePtr = IRB->CreatePointerCast(OldPtr, PointerType::get(IRB->getInt8Ty(), AS), Twine(OldPtr->getName(), ".ptrcast"));
unsigned Off = 0;
for (unsigned TotalStoreBits = TL->getTypeStoreSizeInBits(OrigTy), ActualStoreBits = 0; TotalStoreBits != 0;
@@ -639,7 +639,7 @@ std::pair<Value *, Type *> InstPromoter::preparePromotedIntrinsicInst(IntrinsicI
IGC_ASSERT(PromotedBitWidth == ValBitWidth);
}
- Function *Func = Intrinsic::getDeclaration(I.getModule(), I.getIntrinsicID(), PromotedTy);
+ Function *Func = Intrinsic::getOrInsertDeclaration(I.getModule(), I.getIntrinsicID(), PromotedTy);
return {IRB->CreateCall(Func, PromotedArgs), PromotedTy};
}
diff --git a/IGC/Compiler/Legalizer/PeepholeTypeLegalizer.cpp b/IGC/Compiler/Legalizer/PeepholeTypeLegalizer.cpp
index 81ffbd7..6418ca3 100644
--- a/IGC/Compiler/Legalizer/PeepholeTypeLegalizer.cpp
+++ b/IGC/Compiler/Legalizer/PeepholeTypeLegalizer.cpp
@@ -611,7 +611,7 @@ void PeepholeTypeLegalizer::legalizeUnaryInstruction(Instruction &I) {
I.eraseFromParent();
} else {
Value *newUpBitCast = m_builder->CreateBitCast(
- I.getOperand(0), Type::getIntNPtrTy(I.getContext(), promoteToInt, I.getType()->getPointerAddressSpace()));
+ I.getOperand(0), PointerType::get(Type::getIntNTy(I.getContext(), promoteToInt), I.getType()->getPointerAddressSpace()));
Value *newDownBitCast = m_builder->CreateBitCast(newUpBitCast, I.getType());
I.replaceAllUsesWith(newDownBitCast);
@@ -1033,7 +1033,7 @@ void PeepholeTypeLegalizer::cleanupZExtInst(Instruction &I) {
auto Load = cast<LoadInst>(prevInst);
unsigned zext_size = I.getType()->getScalarSizeInBits();
auto max_srcSize = APInt::getMaxValue(srcSize).getZExtValue();
- auto ptrTy = Type::getIntNPtrTy(I.getContext(), zext_size, Load->getPointerAddressSpace());
+ auto ptrTy = PointerType::get(Type::getIntNTy(I.getContext(), zext_size), Load->getPointerAddressSpace());
auto ldTy = Type::getIntNTy(I.getContext(), zext_size);
auto newBitcast = m_builder->CreateBitCast(prevInst->getOperand(0), ptrTy);
diff --git a/IGC/Compiler/Legalizer/TypeLegalizer.cpp b/IGC/Compiler/Legalizer/TypeLegalizer.cpp
index d75fb79..d7c1b32 100644
--- a/IGC/Compiler/Legalizer/TypeLegalizer.cpp
+++ b/IGC/Compiler/Legalizer/TypeLegalizer.cpp
@@ -420,7 +420,7 @@ void TypeLegalizer::promoteConstant(ValueSeq *ValSeq, TypeSeq *TySeq, Constant *
Type *PromotedTy = TySeq->front();
- auto *ExtValue = isSigned ? ConstantExpr::getSExt(C, PromotedTy) : ConstantExpr::getZExt(C, PromotedTy);
+ auto *ExtValue = isSigned ? ConstantExpr::getCast(Instruction::SExt, C, PromotedTy) : ConstantExpr::getCast(Instruction::ZExt, C, PromotedTy);
ValSeq->push_back(ExtValue);
}
diff --git a/IGC/Compiler/LowPrecisionOptPass.cpp b/IGC/Compiler/LowPrecisionOptPass.cpp
index 72a7e11..fe3e9a9 100644
--- a/IGC/Compiler/LowPrecisionOptPass.cpp
+++ b/IGC/Compiler/LowPrecisionOptPass.cpp
@@ -322,7 +322,7 @@ void LowPrecisionOpt::visitIntrinsicInst(llvm::IntrinsicInst &I) {
if (!func_llvm_floor_f32)
func_llvm_floor_f32 =
- llvm::Intrinsic::getDeclaration(m_currFunction->getParent(), Intrinsic::floor, m_builder->getFloatTy());
+ llvm::Intrinsic::getOrInsertDeclaration(m_currFunction->getParent(), Intrinsic::floor, m_builder->getFloatTy());
auto floor32 = m_builder->CreateCall(func_llvm_floor_f32, src);
#if VALUE_NAME_ENABLE
diff --git a/IGC/Compiler/Optimizer/BuiltInFuncImport.cpp b/IGC/Compiler/Optimizer/BuiltInFuncImport.cpp
index 38450bc..223ebef 100644
--- a/IGC/Compiler/Optimizer/BuiltInFuncImport.cpp
+++ b/IGC/Compiler/Optimizer/BuiltInFuncImport.cpp
@@ -188,7 +188,7 @@ static bool isMangledImageFn(StringRef FName, const MangleSubstTy &MangleSubst)
bool UpdateMangle = std::any_of(MangleSubst.begin(), MangleSubst.end(),
[=](PairTy Pair) { return FName.find(Pair.first) != StringRef::npos; });
- return (FName.startswith("_Z") && UpdateMangle);
+ return (FName.starts_with("_Z") && UpdateMangle);
}
static std::string updatedMangleName(const std::string &FuncName, const std::string &Mangle) {
@@ -427,8 +427,8 @@ void BIImport::fixSPIRFunctionsReturnType(Module &M) {
if (F.isDeclaration()) {
auto FuncName = F.getName();
- if (FuncName.equals("intel_is_traversal_done") || FuncName.equals("intel_get_hit_front_face") ||
- FuncName.equals("intel_has_committed_hit")) {
+ if (FuncName == "intel_is_traversal_done" || FuncName == "intel_get_hit_front_face" ||
+ FuncName == "intel_has_committed_hit") {
if (!F.getReturnType()->isIntegerTy(8))
continue;
@@ -479,7 +479,7 @@ void BIImport::fixSPIRFunctionsReturnType(Module &M) {
// bitcast must be replaced with bitcast + addrspacecast.
void BIImport::fixInvalidBitcasts(llvm::Module &M) {
for (auto &F : M) {
- if (!F.getName().startswith("__builtin"))
+ if (!F.getName().starts_with("__builtin"))
continue;
// Collect invalid bitcasts with address space change.
@@ -642,14 +642,14 @@ bool BIImport::runOnModule(Module &M) {
// temporary work around for sampler types and pipes
for (auto &func : M) {
auto funcName = func.getName();
- if (funcName.startswith("__builtin_IB_convert_sampler_to_int") ||
- funcName.startswith("__builtin_IB_convert_pipe_ro_to_intel_pipe") ||
- funcName.startswith("__builtin_IB_convert_pipe_wo_to_intel_pipe")) {
+ if (funcName.starts_with("__builtin_IB_convert_sampler_to_int") ||
+ funcName.starts_with("__builtin_IB_convert_pipe_ro_to_intel_pipe") ||
+ funcName.starts_with("__builtin_IB_convert_pipe_wo_to_intel_pipe")) {
for (auto Users : func.users()) {
if (auto CI = dyn_cast<CallInst>(Users)) {
IRBuilder<> builder(CI);
Value *newV;
- if (funcName.startswith("__builtin_IB_convert_sampler_to_int")) {
+ if (funcName.starts_with("__builtin_IB_convert_sampler_to_int")) {
newV = builder.CreatePtrToInt(CI->getOperand(0), CI->getType());
} else
newV = builder.CreateBitOrPointerCast(CI->getOperand(0), CI->getType());
@@ -665,7 +665,7 @@ bool BIImport::runOnModule(Module &M) {
auto funcName = F.getName();
// Builtin for OCL support for function pointers
// Gets the function address
- if (funcName.startswith("__builtin_IB_get_function_pointer")) {
+ if (funcName.starts_with("__builtin_IB_get_function_pointer")) {
for (auto user : F.users()) {
if (CallInst *CI = dyn_cast<CallInst>(&*user)) {
// Strip if CI->getArgOperand(0) is ConstExpr bitcast which happens when
@@ -695,7 +695,7 @@ bool BIImport::runOnModule(Module &M) {
}
// Builtin for OCL support for function pointers
// Calls a function address
- else if (funcName.startswith("__builtin_IB_call_function_pointer")) {
+ else if (funcName.starts_with("__builtin_IB_call_function_pointer")) {
for (auto user : F.users()) {
if (CallInst *CI = dyn_cast<CallInst>(&*user)) {
IGCLLVM::IRBuilder<> builder(CI);
@@ -713,7 +713,7 @@ bool BIImport::runOnModule(Module &M) {
}
// Handles the function pointer SIMD variant functions
- else if (funcName.startswith("__intel_create_simd_variant")) {
+ else if (funcName.starts_with("__intel_create_simd_variant")) {
// If we encounter this call, we need to enable this flag to indicate we need to compile multiple SIMD
auto pCtx = getAnalysis<CodeGenContextWrapper>().getCodeGenContext();
pCtx->m_enableSimdVariantCompilation = true;
@@ -752,7 +752,7 @@ bool BIImport::runOnModule(Module &M) {
// FIXME: This is a temp solution, eventually if we support argument variants etc, it's unlikely
// we will have all the information for the variant index in this pass, and will have to move it
// to later passes. For now, since we only require subgroup size, this should suffice.
- else if (funcName.startswith("__intel_indirect_call")) {
+ else if (funcName.starts_with("__intel_indirect_call")) {
MetaDataUtils *pMdUtils = getAnalysis<MetaDataUtilsWrapper>().getMetaDataUtils();
for (auto user : F.users()) {
if (CallInst *CI = dyn_cast<CallInst>(&*user)) {
@@ -1158,8 +1158,8 @@ bool PreBIImportAnalysis::runOnModule(Module &M) {
for (; instUse != instEnd; ++instUse) {
if (CallInst *useInst = dyn_cast<CallInst>(instUse->getUser())) {
StringRef funcName = useInst->getCalledFunction()->getName();
- if (!funcName.startswith(cosBuiltinName) && !funcName.startswith(sinBuiltinName) &&
- !funcName.startswith(sinPiBuiltinName) && !funcName.startswith(cosPiBuiltinName)) {
+ if (!funcName.starts_with(cosBuiltinName) && !funcName.starts_with(sinBuiltinName) &&
+ !funcName.starts_with(sinPiBuiltinName) && !funcName.starts_with(cosPiBuiltinName)) {
return true;
}
} else
@@ -1171,7 +1171,7 @@ bool PreBIImportAnalysis::runOnModule(Module &M) {
auto modMD = getAnalysis<MetaDataUtilsWrapper>().getModuleMetaData();
if ((modMD->compOpt.MatchSinCosPi) && !(modMD->compOpt.FastRelaxedMath) &&
- (funcName.startswith(cosBuiltinName) || funcName.startswith(sinBuiltinName))) {
+ (funcName.starts_with(cosBuiltinName) || funcName.starts_with(sinBuiltinName))) {
for (auto Users : pFunc->users()) {
if (auto CI = dyn_cast<CallInst>(Users)) {
IRBuilder<> builder(CI);
@@ -1234,9 +1234,9 @@ bool PreBIImportAnalysis::runOnModule(Module &M) {
InstToModify.push_back(std::make_tuple(fmulInst, intValue, srcPos));
std::string newName;
- if (funcName.startswith(cosBuiltinName)) {
+ if (funcName.starts_with(cosBuiltinName)) {
newName = cosPiBuiltinName;
- } else if (funcName.startswith(sinBuiltinName)) {
+ } else if (funcName.starts_with(sinBuiltinName)) {
newName = sinPiBuiltinName;
}
diff --git a/IGC/Compiler/Optimizer/CodeAssumption.cpp b/IGC/Compiler/Optimizer/CodeAssumption.cpp
index 31f4340..bbf6026 100644
--- a/IGC/Compiler/Optimizer/CodeAssumption.cpp
+++ b/IGC/Compiler/Optimizer/CodeAssumption.cpp
@@ -61,8 +61,8 @@ void CodeAssumption::uniformHelper(Module *M) {
StringRef FN = F->getName();
// sub_group_id
- if (!FN.equals("_Z25__spirv_BuiltInSubgroupIdv") && !FN.equals("__builtin_spirv_BuiltInSubgroupId") &&
- !FN.equals("_Z16get_sub_group_idv"))
+ if (FN != "_Z25__spirv_BuiltInSubgroupIdv" && FN != "__builtin_spirv_BuiltInSubgroupId" &&
+ FN != "_Z16get_sub_group_idv")
continue;
// find all the callees
for (auto ui = F->use_begin(), ue = F->use_end(); ui != ue; ++ui) {
diff --git a/IGC/Compiler/Optimizer/GatingSimilarSamples.cpp b/IGC/Compiler/Optimizer/GatingSimilarSamples.cpp
index a6b99e4..6f52e7c 100644
--- a/IGC/Compiler/Optimizer/GatingSimilarSamples.cpp
+++ b/IGC/Compiler/Optimizer/GatingSimilarSamples.cpp
@@ -19,6 +19,7 @@ SPDX-License-Identifier: MIT
#include <llvmWrapper/IR/InstrTypes.h>
#include <llvmWrapper/IR/BasicBlock.h>
#include "Probe/Assertion.h"
+#include "common/LLVMUtils.h"
using namespace llvm;
using namespace IGC;
@@ -30,13 +31,13 @@ static bool samplesAveragedEqually(const std::vector<Instruction *> &similarSamp
unsigned totalSimilarSamples = similarToTexelSampleInstsCount + 1; // texel(sample2) + similar to texel(sample3,4,5)
const float cmpAveragingFactor = (float)1.0 / (float(totalSimilarSamples));
for (auto sampleInst : similarSampleInsts) {
- Instruction *inst = sampleInst->getNextNonDebugInstruction();
+ Instruction *inst = IGC::getNextNonDbgInstruction(sampleInst);
std::set<Value *> texels; // for storing texel_x, texel_y, texel_z of this sampleInst
for (int i = 0; i < 3; i++) {
if (inst->getOpcode() == Instruction::ExtractElement) {
texels.insert(inst);
- inst = inst->getNextNonDebugInstruction();
+ inst = IGC::getNextNonDbgInstruction(inst);
} else {
return false; // Sample->followed by 3 EE == this pattern is not matching
}
@@ -59,7 +60,7 @@ static bool samplesAveragedEqually(const std::vector<Instruction *> &similarSamp
} else {
return false; // 3 EE -> followed by 3 FMuls == this pattern is not matching
}
- inst = inst->getNextNonDebugInstruction();
+ inst = IGC::getNextNonDbgInstruction(inst);
}
IGC_ASSERT_MESSAGE(texels.size() == 0, " All texels.x/y/z were not multiplied by same float");
texels.clear();
@@ -92,7 +93,7 @@ static bool detectSampleAveragePattern2(const std::vector<Instruction *> &sample
Instruction *rgb[3] = {nullptr};
for (unsigned i = 0; i < nSampleInsts; i++) {
- Instruction *inst = sampleInsts[i]->getNextNonDebugInstruction();
+ Instruction *inst = IGC::getNextNonDbgInstruction(sampleInsts[i]);
for (unsigned j = 0; j < 3; j++) {
ExtractElementInst *ei = dyn_cast<ExtractElementInst>(inst);
if (!ei) {
@@ -122,7 +123,7 @@ static bool detectSampleAveragePattern2(const std::vector<Instruction *> &sample
}
rgb[idx] = fadd;
}
- inst = inst->getNextNonDebugInstruction();
+ inst = IGC::getNextNonDbgInstruction(inst);
}
if (isa<ExtractElementInst>(inst)) {
return false;
@@ -342,13 +343,13 @@ bool GatingSimilarSamples::runOnFunction(llvm::Function &F) {
return false;
// extract original texel.xyz and averaged color.xyz values for creating 3 PHI nodes
- Instruction *texel_x = texelSample->getNextNonDebugInstruction();
+ Instruction *texel_x = IGC::getNextNonDbgInstruction(texelSample);
if (!dyn_cast<ExtractElementInst>(texel_x))
return false;
- Instruction *texel_y = texel_x->getNextNonDebugInstruction();
+ Instruction *texel_y = IGC::getNextNonDbgInstruction(texel_x);
if (!dyn_cast<ExtractElementInst>(texel_y))
return false;
- Instruction *texel_z = texel_y->getNextNonDebugInstruction();
+ Instruction *texel_z = IGC::getNextNonDbgInstruction(texel_y);
if (!dyn_cast<ExtractElementInst>(texel_z))
return false;
diff --git a/IGC/Compiler/Optimizer/IntDivRemIncrementReduction.cpp b/IGC/Compiler/Optimizer/IntDivRemIncrementReduction.cpp
index 8779dd1..c4818bd 100644
--- a/IGC/Compiler/Optimizer/IntDivRemIncrementReduction.cpp
+++ b/IGC/Compiler/Optimizer/IntDivRemIncrementReduction.cpp
@@ -16,6 +16,8 @@ SPDX-License-Identifier: MIT
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/Analysis/ValueTracking.h"
+#include "llvm/Analysis/WithCache.h"
+#include "llvm/Analysis/SimplifyQuery.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/Function.h"
@@ -495,8 +497,7 @@ std::pair<Value *, APInt> IntDivRemIncrementReductionImpl::getBaseAndOffset(Valu
// only one operand is a constant
if (I->getOpcode() == Instruction::Add || // ADD inst
(I->getOpcode() == Instruction::Or && // OR inst with no common bits set between both operands
- haveNoCommonBitsSet(I->getOperand(0), I->getOperand(1), I->getFunction()->getParent()->getDataLayout(),
- nullptr, I, DT))) {
+ haveNoCommonBitsSet(WithCache<const Value *>(I->getOperand(0)), WithCache<const Value *>(I->getOperand(1)), SimplifyQuery(I->getFunction()->getParent()->getDataLayout(), DT)))) {
if (c0)
return {I->getOperand(1), c0->getValue()};
else
diff --git a/IGC/Compiler/Optimizer/OCLBIUtils.cpp b/IGC/Compiler/Optimizer/OCLBIUtils.cpp
index 07ea5ab..377784a 100644
--- a/IGC/Compiler/Optimizer/OCLBIUtils.cpp
+++ b/IGC/Compiler/Optimizer/OCLBIUtils.cpp
@@ -48,7 +48,7 @@ Function *CCommand::getFunctionDeclaration(GenISAIntrinsic::ID id, ArrayRef<Type
}
Function *CCommand::getFunctionDeclaration(IGCLLVM::Intrinsic id, ArrayRef<Type *> Tys) {
- return Intrinsic::getDeclaration(m_pFunc->getParent(), id, Tys);
+ return Intrinsic::getOrInsertDeclaration(m_pFunc->getParent(), id, Tys);
}
void CCommand::replaceCallInst(IGCLLVM::Intrinsic intrinsicName, ArrayRef<Type *> Tys) {
@@ -118,8 +118,8 @@ void CImagesBI::prepareCoords(Dimension Dim, Value *Coord, Value *Zero) {
void CImagesBI::CreateInlineSamplerAnnotations(Module *M, InlineSamplersMD &inlineSamplerMD, int samplerValue) {
inlineSamplerMD.m_Value = samplerValue;
- if (llvm::StringRef(M->getTargetTriple()).startswith("igil") ||
- llvm::StringRef(M->getTargetTriple()).startswith("gpu_64")) {
+ if (M->getTargetTriple().getTriple().starts_with("igil") ||
+ M->getTargetTriple().getTriple().starts_with("gpu_64")) {
inlineSamplerMD.addressMode = samplerValue & LEGACY_SAMPLER_ADDRESS_MASK;
switch (samplerValue & LEGACY_SAMPLER_ADDRESS_MASK) {
case LEGACY_CLK_ADDRESS_NONE:
@@ -181,7 +181,7 @@ void CImagesBI::CreateInlineSamplerAnnotations(Module *M, InlineSamplersMD &inli
inlineSamplerMD.BorderColorG = (0.0f);
inlineSamplerMD.BorderColorB = (0.0f);
inlineSamplerMD.BorderColorA = (0.0f);
- } else if (llvm::StringRef(M->getTargetTriple()).startswith("spir")) {
+ } else if (M->getTargetTriple().getTriple().starts_with("spir")) {
switch (samplerValue & SPIR_SAMPLER_ADDRESS_MASK) {
case SPIR_CLK_ADDRESS_NONE:
inlineSamplerMD.TCXAddressMode = (iOpenCL::SAMPLER_TEXTURE_ADDRESS_MODE_CLAMP);
@@ -1233,9 +1233,9 @@ public:
IGCLLVM::IRBuilder<> IRB(m_pCallInst);
- Value *pDsti8 = IRB.CreateBitCast(pDst, IRB.getInt8PtrTy(cast<PointerType>(pDst->getType())->getAddressSpace()));
+ Value *pDsti8 = IRB.CreateBitCast(pDst, PointerType::get(IRB.getInt8Ty(), cast<PointerType>(pDst->getType())->getAddressSpace()));
- Value *pSrci8 = IRB.CreateBitCast(pSrc, IRB.getInt8PtrTy(cast<PointerType>(pSrc->getType())->getAddressSpace()));
+ Value *pSrci8 = IRB.CreateBitCast(pSrc, PointerType::get(IRB.getInt8Ty(), cast<PointerType>(pSrc->getType())->getAddressSpace()));
CallInst *pCall = IRB.CreateMemCpy(pDsti8, pSrci8, pNumBytes, int_cast<unsigned int>(Align));
pCall->setDebugLoc(m_DL);
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/AggregateArguments/AggregateArguments.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/AggregateArguments/AggregateArguments.cpp
index 0b686d2..847864e 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/AggregateArguments/AggregateArguments.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/AggregateArguments/AggregateArguments.cpp
@@ -243,7 +243,7 @@ void ResolveAggregateArguments::storeArgument(const Argument *arg, AllocaInst *b
// associated with the explicit given argument.
Function::arg_iterator implicitArgToStore = std::next(m_pFunction->arg_begin(), baseImplicitArg + startArgNo);
- Value *baseAsPtri8 = irBuilder.CreateBitCast(base, Type::getInt8PtrTy(base->getContext(), ADDRESS_SPACE_PRIVATE));
+ Value *baseAsPtri8 = irBuilder.CreateBitCast(base, PointerType::get(Type::getInt8Ty(base->getContext()), ADDRESS_SPACE_PRIVATE));
// Iterate over all base type args of the structure and store them
// into the correct offset from the alloca.
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/AlignmentAnalysis/AlignmentAnalysis.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/AlignmentAnalysis/AlignmentAnalysis.cpp
index 8632b00..ce85e4d 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/AlignmentAnalysis/AlignmentAnalysis.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/AlignmentAnalysis/AlignmentAnalysis.cpp
@@ -77,7 +77,7 @@ void AlignmentAnalysis::setArgumentAlignmentBasedOnOptionalMetadata(Function &F)
continue;
}
- if (!Op->getString().endswith("*")) {
+ if (!Op->getString().ends_with("*")) {
// If the metadata string does not end with '*', skip this argument.
// This can be e.g. a struct pointer passed byval.
// DPC++ does not add "*" in this case and we will not be able to
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/Atomics/ResolveOCLAtomics.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/Atomics/ResolveOCLAtomics.cpp
index a9185f9..0d42ea6 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/Atomics/ResolveOCLAtomics.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/Atomics/ResolveOCLAtomics.cpp
@@ -79,7 +79,7 @@ void ResolveOCLAtomics::visitCallInst(CallInst &callInst) {
processGetGlobalLock(callInst);
}
- if (funcName.startswith("__builtin_IB_atomic")) {
+ if (funcName.starts_with("__builtin_IB_atomic")) {
IGC_ASSERT_MESSAGE(m_AtomicDescMap.count(funcName), "Unexpected IGC atomic function name.");
const OCLAtomicAttrs &attrs = m_AtomicDescMap[funcName];
processOCLAtomic(callInst, attrs.op, attrs.bufType);
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/BIFTransforms/BIFTransforms.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/BIFTransforms/BIFTransforms.cpp
index 8a1cf0b..35d2e2c 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/BIFTransforms/BIFTransforms.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/BIFTransforms/BIFTransforms.cpp
@@ -72,17 +72,17 @@ bool BIFTransforms::replaceBIF(Function &F) {
bool changed = false;
StringRef name = F.getName();
- if (name.startswith("_Z6length")) { // length --> fast_length
+ if (name.starts_with("_Z6length")) { // length --> fast_length
std::string newName("_Z11fast_length");
newName.append(name.data() + 9);
F.setName(newName);
changed = true;
- } else if (name.startswith("_Z9normalize")) { // normalize --> fast_normalize
+ } else if (name.starts_with("_Z9normalize")) { // normalize --> fast_normalize
std::string newName("_Z14fast_normalize");
newName.append(name.data() + 12);
F.setName(newName);
changed = true;
- } else if (name.startswith("_Z8distance")) { // distance --> fast_distance
+ } else if (name.starts_with("_Z8distance")) { // distance --> fast_distance
std::string newName("_Z13fast_distance");
newName.append(name.data() + 11);
F.setName(newName);
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/BfloatBuiltins/BfloatBuiltinsResolution.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/BfloatBuiltins/BfloatBuiltinsResolution.cpp
index a9b8392..c6b55b5 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/BfloatBuiltins/BfloatBuiltinsResolution.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/BfloatBuiltins/BfloatBuiltinsResolution.cpp
@@ -122,11 +122,11 @@ void BfloatBuiltinsResolution::visitCallInst(CallInst &CI) {
return;
}
+std::string MangledNameForDemangling = MangledName.str();
#if LLVM_VERSION_MAJOR < 20
// Workaround for LLVM 16 demangler not supporting DF16b mangling (even though LLVM 16 supports bfloat type)
// Support was implemented in LLVM 20
// (https://github.com/llvm/llvm-project/commit/a100fd8cbd3dad3846a6212d97279ca23db85c75)
- std::string MangledNameForDemangling = MangledName.str();
if (MangledName.contains("DF16b")) {
MangledNameForDemangling = replaceAll(MangledName, "DF16b", "u6__bf16");
}
@@ -145,7 +145,7 @@ void BfloatBuiltinsResolution::visitCallInst(CallInst &CI) {
StringRef DemangledNameRef = DemangledName;
bool IsSupported = false;
for (const auto &funcName : FuncNames) {
- if (DemangledNameRef.equals(funcName)) {
+ if (DemangledNameRef == funcName) {
IsSupported = true;
break;
}
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/BfloatFuncs/BfloatFuncsResolution.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/BfloatFuncs/BfloatFuncsResolution.cpp
index 4605039..e4cdb4f 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/BfloatFuncs/BfloatFuncsResolution.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/BfloatFuncs/BfloatFuncsResolution.cpp
@@ -63,7 +63,7 @@ void BfloatFuncsResolution::visitCallInst(CallInst &CI) {
std::string DNameStr = llvm::demangle(CI.getCalledFunction()->getName().str());
StringRef DName(DNameStr);
- if (!DName.startswith("__builtin_bf16"))
+ if (!DName.starts_with("__builtin_bf16"))
return;
m_builder->SetInsertPoint(&CI);
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/CorrectlyRoundedDivSqrt/CorrectlyRoundedDivSqrt.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/CorrectlyRoundedDivSqrt/CorrectlyRoundedDivSqrt.cpp
index aa31479..f5c013f 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/CorrectlyRoundedDivSqrt/CorrectlyRoundedDivSqrt.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/CorrectlyRoundedDivSqrt/CorrectlyRoundedDivSqrt.cpp
@@ -68,13 +68,13 @@ bool CorrectlyRoundedDivSqrt::runOnModule(Module &M) {
bool CorrectlyRoundedDivSqrt::processDeclaration(Function &F) {
StringRef name = F.getName();
- if (name.startswith("_Z4sqrt")) {
+ if (name.starts_with("_Z4sqrt")) {
std::string newName = name.str();
newName[2] = '7';
newName.insert(7, "_cr");
F.setName(newName);
return true;
- } else if (name.startswith("_Z16__spirv_ocl_sqrt")) {
+ } else if (name.starts_with("_Z16__spirv_ocl_sqrt")) {
std::string newName = name.str();
newName[3] = '9';
newName.insert(20, "_cr");
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/Decompose2DBlockFuncsWithHoisting/Decompose2DBlockFuncsWithHoisting.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/Decompose2DBlockFuncsWithHoisting/Decompose2DBlockFuncsWithHoisting.cpp
index 042399e..976f0bc 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/Decompose2DBlockFuncsWithHoisting/Decompose2DBlockFuncsWithHoisting.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/Decompose2DBlockFuncsWithHoisting/Decompose2DBlockFuncsWithHoisting.cpp
@@ -249,7 +249,7 @@ bool Decompose2DBlockFuncsWithHoisting::runOnFunction(Function &F) {
DL = &F.getParent()->getDataLayout();
LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
- E = std::make_unique<SCEVExpander>(*SE, *DL, "decompose-2d-block-funcs-with-hoisting");
+ E = std::make_unique<SCEVExpander>(*SE, "decompose-2d-block-funcs-with-hoisting");
Platform = &CGC->platform;
m_changed = false;
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/DpasFuncs/DpasFuncsResolution.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/DpasFuncs/DpasFuncsResolution.cpp
index 3155ddb..8a2b02a 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/DpasFuncs/DpasFuncsResolution.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/DpasFuncs/DpasFuncsResolution.cpp
@@ -307,26 +307,26 @@ void DpasFuncsResolution::visitCallInst(CallInst &CI) {
#endif
if (m_pCtx->platform.hasExecSize16DPAS()) {
// PVC
- if (funcName.startswith(DpasFuncsResolution::SG_PREFIX_IDPAS16)) {
+ if (funcName.starts_with(DpasFuncsResolution::SG_PREFIX_IDPAS16)) {
const int SG_PREFIX_LEN = DpasFuncsResolution::SG_PREFIX_IDPAS16.size();
IsIDpas = true;
if (!demangleSuffix(funcName, SG_PREFIX_LEN, false, IsIDpas, DstTy, AccTy, PA, PB, SD, RC, nullptr))
return;
iid = GenISAIntrinsic::GenISA_sub_group_dpas;
- } else if (funcName.startswith(DpasFuncsResolution::SG_PREFIX_IDPAS32N16)) {
+ } else if (funcName.starts_with(DpasFuncsResolution::SG_PREFIX_IDPAS32N16)) {
const int SG_PREFIX_LEN = DpasFuncsResolution::SG_PREFIX_IDPAS32N16.size();
IsIDpas = true;
IsDoubleSubgroup = true;
if (!demangleSuffix(funcName, SG_PREFIX_LEN, false, IsIDpas, DstTy, AccTy, PA, PB, SD, RC, nullptr))
return;
iid = GenISAIntrinsic::GenISA_sub_group_dpas;
- } else if (funcName.startswith(DpasFuncsResolution::SG_PREFIX_FDPAS16)) {
+ } else if (funcName.starts_with(DpasFuncsResolution::SG_PREFIX_FDPAS16)) {
const int SG_PREFIX_LEN = DpasFuncsResolution::SG_PREFIX_FDPAS16.size();
IsIDpas = false;
if (!demangleSuffix(funcName, SG_PREFIX_LEN, true, IsIDpas, DstTy, AccTy, PA, PB, SD, RC, nullptr))
return;
iid = GenISAIntrinsic::GenISA_sub_group_dpas;
- } else if (funcName.startswith(DpasFuncsResolution::SG_PREFIX_FDPAS32N16)) {
+ } else if (funcName.starts_with(DpasFuncsResolution::SG_PREFIX_FDPAS32N16)) {
const int SG_PREFIX_LEN = DpasFuncsResolution::SG_PREFIX_FDPAS32N16.size();
IsIDpas = false;
IsDoubleSubgroup = true;
@@ -338,39 +338,39 @@ void DpasFuncsResolution::visitCallInst(CallInst &CI) {
return;
}
} else {
- if (funcName.startswith(DpasFuncsResolution::SG_PREFIX_IDPAS)) {
+ if (funcName.starts_with(DpasFuncsResolution::SG_PREFIX_IDPAS)) {
const int SG_PREFIX_LEN = DpasFuncsResolution::SG_PREFIX_IDPAS.size();
IsIDpas = true;
if (!demangleSuffix(funcName, SG_PREFIX_LEN, false, IsIDpas, DstTy, AccTy, PA, PB, SD, RC, &IsDpasw))
return;
iid = GenISAIntrinsic::GenISA_sub_group_dpas;
- } else if (funcName.startswith(DpasFuncsResolution::SG_PREFIX_FDPAS)) {
+ } else if (funcName.starts_with(DpasFuncsResolution::SG_PREFIX_FDPAS)) {
const int SG_PREFIX_LEN = DpasFuncsResolution::SG_PREFIX_FDPAS.size();
IsIDpas = false;
if (!demangleSuffix(funcName, SG_PREFIX_LEN, false, IsIDpas, DstTy, AccTy, PA, PB, SD, RC, &IsDpasw))
return;
iid = GenISAIntrinsic::GenISA_sub_group_dpas;
- } else if (funcName.startswith(DpasFuncsResolution::WI_PREFIX_IDPAS)) {
+ } else if (funcName.starts_with(DpasFuncsResolution::WI_PREFIX_IDPAS)) {
const int WI_PREFIX_LEN = DpasFuncsResolution::WI_PREFIX_IDPAS.size();
IsIDpas = true;
if (!demangleSuffix(funcName, WI_PREFIX_LEN, false, IsIDpas, DstTy, AccTy, PA, PB, SD, RC, &IsDpasw))
return;
iid = GenISAIntrinsic::GenISA_dpas;
- } else if (funcName.startswith(DpasFuncsResolution::WI_PREFIX_FDPAS)) {
+ } else if (funcName.starts_with(DpasFuncsResolution::WI_PREFIX_FDPAS)) {
const int WI_PREFIX_LEN = DpasFuncsResolution::WI_PREFIX_FDPAS.size();
IsIDpas = false;
if (!demangleSuffix(funcName, WI_PREFIX_LEN, false, IsIDpas, DstTy, AccTy, PA, PB, SD, RC, &IsDpasw))
return;
iid = GenISAIntrinsic::GenISA_dpas;
- } else if (funcName.startswith(DpasFuncsResolution::SG_PREFIX_HFDPAS) ||
- funcName.startswith(DpasFuncsResolution::SG_PREFIX_BFDPAS)) {
+ } else if (funcName.starts_with(DpasFuncsResolution::SG_PREFIX_HFDPAS) ||
+ funcName.starts_with(DpasFuncsResolution::SG_PREFIX_BFDPAS)) {
const int SG_PREFIX_HF_LEN = DpasFuncsResolution::SG_PREFIX_HFDPAS.size();
IsIDpas = false;
if (!demangleSuffix(funcName, SG_PREFIX_HF_LEN, false, IsIDpas, DstTy, AccTy, PA, PB, SD, RC, &IsDpasw))
return;
iid = GenISAIntrinsic::GenISA_sub_group_dpas;
- } else if (funcName.startswith(DpasFuncsResolution::WI_PREFIX_HFDPAS) ||
- funcName.startswith(DpasFuncsResolution::WI_PREFIX_BFDPAS)) {
+ } else if (funcName.starts_with(DpasFuncsResolution::WI_PREFIX_HFDPAS) ||
+ funcName.starts_with(DpasFuncsResolution::WI_PREFIX_BFDPAS)) {
const int WI_PREFIX_HF_LEN = DpasFuncsResolution::WI_PREFIX_HFDPAS.size();
IsIDpas = false;
if (!demangleSuffix(funcName, WI_PREFIX_HF_LEN, false, IsIDpas, DstTy, AccTy, PA, PB, SD, RC, &IsDpasw))
@@ -548,7 +548,7 @@ bool DpasFuncsResolution::processCvt(CallInst &CI) {
GenISAIntrinsic::ID iid;
Value *args[3];
uint32_t argslen;
- if (funcName.startswith("__builtin_IB_ftobf_")) {
+ if (funcName.starts_with("__builtin_IB_ftobf_")) {
if (!demangleFCvtSuffix(funcName, (int)sizeof("__builtin_IB_ftobf_") - 1, &FP_RM, &VecLen, nullptr))
return false;
@@ -556,7 +556,7 @@ bool DpasFuncsResolution::processCvt(CallInst &CI) {
args[0] = CI.getArgOperand(0); // value to be converted
args[1] = ConstantInt::get(intTy, FP_RM); // rounding mode
argslen = 2;
- } else if (funcName.startswith("__builtin_IB_bftof_")) {
+ } else if (funcName.starts_with("__builtin_IB_bftof_")) {
// It is a precise conversion, no RM needed!
// Note that sizeof() includes the ending '\0', so need to do -1!
if (!demangleFCvtSuffix(funcName, (int)sizeof("__builtin_IB_bftof_") - 1, nullptr, &VecLen, nullptr))
@@ -565,7 +565,7 @@ bool DpasFuncsResolution::processCvt(CallInst &CI) {
iid = GenISAIntrinsic::GenISA_bftof;
args[0] = CI.getArgOperand(0);
argslen = 1;
- } else if (funcName.startswith("__builtin_IB_2fto2bf_")) {
+ } else if (funcName.starts_with("__builtin_IB_2fto2bf_")) {
if (!demangleFCvtSuffix(funcName, (int)sizeof("__builtin_IB_2fto2bf_") - 1, &FP_RM, &VecLen, nullptr))
return false;
@@ -574,7 +574,7 @@ bool DpasFuncsResolution::processCvt(CallInst &CI) {
args[1] = CI.getArgOperand(1); // value to be converted
args[2] = ConstantInt::get(intTy, FP_RM); // rounding mode
argslen = 3;
- } else if (funcName.startswith("__builtin_IB_hftobf8_")) {
+ } else if (funcName.starts_with("__builtin_IB_hftobf8_")) {
int sz = (int)sizeof("__builtin_IB_hftobf8_");
if (!demangleFCvtSuffix(funcName, sz - 1, nullptr, &VecLen, &isSat))
return false;
@@ -584,7 +584,7 @@ bool DpasFuncsResolution::processCvt(CallInst &CI) {
args[1] = ConstantInt::get(intTy, FP_RM); // rounding mode
args[2] = ConstantInt::get(boolTy, isSat); // saturation
argslen = 3;
- } else if (funcName.startswith("__builtin_IB_bf8tohf_")) {
+ } else if (funcName.starts_with("__builtin_IB_bf8tohf_")) {
int sz = (int)sizeof("__builtin_IB_bf8tohf_");
// It is a precise conversion, no RM needed!
// Note that sizeof() includes the ending '\0', so need to do -1!
@@ -594,7 +594,7 @@ bool DpasFuncsResolution::processCvt(CallInst &CI) {
iid = GenISAIntrinsic::GenISA_bf8tohf;
args[0] = CI.getArgOperand(0);
argslen = 1;
- } else if (funcName.startswith("__builtin_IB_hftohf8_")) {
+ } else if (funcName.starts_with("__builtin_IB_hftohf8_")) {
int sz = (int)sizeof("__builtin_IB_hftohf8_");
if (!demangleFCvtSuffix(funcName, sz - 1, nullptr, &VecLen, &isSat))
return false;
@@ -604,7 +604,7 @@ bool DpasFuncsResolution::processCvt(CallInst &CI) {
args[1] = ConstantInt::get(intTy, FP_RM); // rounding mode
args[2] = ConstantInt::get(boolTy, isSat); // saturation
argslen = 3;
- } else if (funcName.startswith("__builtin_IB_hf8tohf_")) {
+ } else if (funcName.starts_with("__builtin_IB_hf8tohf_")) {
int sz = (int)sizeof("__builtin_IB_hf8tohf_");
// It is a precise conversion, no RM needed!
// Note that sizeof() includes the ending '\0', so need to do -1!
@@ -614,7 +614,7 @@ bool DpasFuncsResolution::processCvt(CallInst &CI) {
iid = GenISAIntrinsic::GenISA_hf8tohf;
args[0] = CI.getArgOperand(0);
argslen = 1;
- } else if (funcName.startswith("__builtin_IB_ftotf32_")) {
+ } else if (funcName.starts_with("__builtin_IB_ftotf32_")) {
if (!demangleFCvtSuffix(funcName, (int)sizeof("__builtin_IB_ftotf32_") - 1, nullptr, &VecLen, nullptr))
return false;
@@ -880,7 +880,7 @@ bool DpasFuncsResolution::processBdpas(CallInst &CI) {
Type *IntTy = Type::getInt32Ty(Ctx);
int DstTy, AccTy, PA, PB, SD, RC;
- if (!m_pCtx->platform.hasExecSize16DPAS() || !FuncName.startswith(DpasFuncsResolution::SG_PREFIX_BDPAS16)) {
+ if (!m_pCtx->platform.hasExecSize16DPAS() || !FuncName.starts_with(DpasFuncsResolution::SG_PREFIX_BDPAS16)) {
return false;
}
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/ExtensionFuncs/ExtensionArgAnalysis.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/ExtensionFuncs/ExtensionArgAnalysis.cpp
index 4471645..8626b69 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/ExtensionFuncs/ExtensionArgAnalysis.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/ExtensionFuncs/ExtensionArgAnalysis.cpp
@@ -139,7 +139,7 @@ void ExtensionArgAnalysis::visitCallInst(llvm::CallInst &CI) {
StringRef name = F->getName();
- if (name.startswith("__builtin_IB_media_block_") || name == "__builtin_IB_media_block_rectangle_read") {
+ if (name.starts_with("__builtin_IB_media_block_") || name == "__builtin_IB_media_block_rectangle_read") {
SetExtension(0, ResourceExtensionTypeEnum::MediaResourceBlockType, m_MediaBlockArgs);
} else if (name == "__builtin_IB_vme_send_fbr" || name == "__builtin_IB_vme_send_ime") {
SetExtension(3, ResourceExtensionTypeEnum::MediaResourceType, m_MediaArgs);
@@ -150,7 +150,7 @@ void ExtensionArgAnalysis::visitCallInst(llvm::CallInst &CI) {
SetExtension(4, ResourceExtensionTypeEnum::MediaResourceType, m_MediaArgs);
SetExtension(5, ResourceExtensionTypeEnum::MediaResourceType, m_MediaArgs);
CheckandSetSIMD16();
- } else if (name.startswith("__builtin_IB_vme_send_ime_new") || name == "__builtin_IB_vme_send_sic_new" ||
+ } else if (name.starts_with("__builtin_IB_vme_send_ime_new") || name == "__builtin_IB_vme_send_sic_new" ||
name == "__builtin_IB_vme_send_fbr_new") {
// Handle image args.
SetExtension(1, ResourceExtensionTypeEnum::MediaResourceType, m_MediaArgs);
@@ -183,7 +183,7 @@ bool ExtensionArgAnalysis::runOnFunction(Function &F) {
m_extensionType = ResourceExtensionTypeEnum::NonExtensionType;
for (int func = VA_FUNCTION_ERODE; func < NUM_VA_FUNCTIONS; ++func) {
- if (funcName.equals(VA_FUNCTION_STRINGS[func])) {
+ if ((funcName == VA_FUNCTION_STRINGS[func])) {
// First function arg is the src image, second is the sampler,
// and third arg is output buffer (ignored by this analysis).
auto arg = F.arg_begin();
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/ExtensionFuncs/ExtensionFuncResolution.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/ExtensionFuncs/ExtensionFuncResolution.cpp
index b70eef4..2352b2e 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/ExtensionFuncs/ExtensionFuncResolution.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/ExtensionFuncs/ExtensionFuncResolution.cpp
@@ -51,15 +51,15 @@ void ExtensionFuncsResolution::visitCallInst(CallInst &CI) {
Function &F = *(CI.getParent()->getParent());
ImplicitArg::ArgType argType;
- if (funcName.equals(ExtensionFuncsAnalysis::VME_MB_BLOCK_TYPE)) {
+ if ((funcName == ExtensionFuncsAnalysis::VME_MB_BLOCK_TYPE)) {
argType = ImplicitArg::VME_MB_BLOCK_TYPE;
- } else if (funcName.equals(ExtensionFuncsAnalysis::VME_SUBPIXEL_MODE)) {
+ } else if ((funcName == ExtensionFuncsAnalysis::VME_SUBPIXEL_MODE)) {
argType = ImplicitArg::VME_SUBPIXEL_MODE;
- } else if (funcName.equals(ExtensionFuncsAnalysis::VME_SAD_ADJUST_MODE)) {
+ } else if ((funcName == ExtensionFuncsAnalysis::VME_SAD_ADJUST_MODE)) {
argType = ImplicitArg::VME_SAD_ADJUST_MODE;
- } else if (funcName.equals(ExtensionFuncsAnalysis::VME_SEARCH_PATH_TYPE)) {
+ } else if ((funcName == ExtensionFuncsAnalysis::VME_SEARCH_PATH_TYPE)) {
argType = ImplicitArg::VME_SEARCH_PATH_TYPE;
- } else if (funcName.startswith(ExtensionFuncsAnalysis::VME_HELPER_GET_HANDLE)) {
+ } else if (funcName.starts_with(ExtensionFuncsAnalysis::VME_HELPER_GET_HANDLE)) {
// Load from the opaque vme pointer and return the a vector with values.
IGC_ASSERT(IGCLLVM::getNumArgOperands(&CI) == 1);
IGCLLVM::IRBuilder<> builder(&CI);
@@ -71,7 +71,7 @@ void ExtensionFuncsResolution::visitCallInst(CallInst &CI) {
CI.replaceAllUsesWith(ret);
CI.eraseFromParent();
return;
- } else if (funcName.startswith(ExtensionFuncsAnalysis::VME_HELPER_GET_AS)) {
+ } else if (funcName.starts_with(ExtensionFuncsAnalysis::VME_HELPER_GET_AS)) {
// Store the VME values and return an opaque vme pointer.
IGC_ASSERT(IGCLLVM::getNumArgOperands(&CI) == 1);
IGCLLVM::IRBuilder<> builder(&*CI.getParent()->getParent()->begin()->getFirstInsertionPt());
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/ExtensionFuncs/ExtensionFuncsAnalysis.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/ExtensionFuncs/ExtensionFuncsAnalysis.cpp
index ccd5845..c1cef18 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/ExtensionFuncs/ExtensionFuncsAnalysis.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/ExtensionFuncs/ExtensionFuncsAnalysis.cpp
@@ -84,9 +84,9 @@ void ExtensionFuncsAnalysis::visitCallInst(CallInst &CI) {
// Check for VME function calls
if (Function *F = CI.getCalledFunction()) {
StringRef funcName = F->getName();
- if (funcName.equals(VME_MB_BLOCK_TYPE) || funcName.equals(VME_SUBPIXEL_MODE) ||
- funcName.equals(VME_SAD_ADJUST_MODE) || funcName.equals(VME_SEARCH_PATH_TYPE) ||
- funcName.startswith(VME_HELPER_GET_HANDLE) || funcName.startswith(VME_HELPER_GET_AS)) {
+ if ((funcName == VME_MB_BLOCK_TYPE) || (funcName == VME_SUBPIXEL_MODE) ||
+ (funcName == VME_SAD_ADJUST_MODE) || (funcName == VME_SEARCH_PATH_TYPE) ||
+ funcName.starts_with(VME_HELPER_GET_HANDLE) || funcName.starts_with(VME_HELPER_GET_AS)) {
m_hasVME = true;
}
}
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/GEPLoopStrengthReduction/GEPLoopStrengthReduction.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/GEPLoopStrengthReduction/GEPLoopStrengthReduction.cpp
index 78be6db..58e63ad 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/GEPLoopStrengthReduction/GEPLoopStrengthReduction.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/GEPLoopStrengthReduction/GEPLoopStrengthReduction.cpp
@@ -1146,7 +1146,7 @@ bool GEPLoopStrengthReduction::runOnFunction(llvm::Function &F) {
auto *WI = &FRPE.getWIAnalysis(&F);
// Using one SCEV expander between all reductions reduces number of duplicated new instructions.
- auto E = SCEVExpander(SE, DL, "gep-loop-strength-reduction");
+ auto E = SCEVExpander(SE, "gep-loop-strength-reduction");
SmallVector<ReductionCandidateGroup, 32> Candidates;
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/GenericAddressResolution/GASPropagator.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/GenericAddressResolution/GASPropagator.cpp
index 193b52b..df49067 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/GenericAddressResolution/GASPropagator.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/GenericAddressResolution/GASPropagator.cpp
@@ -313,9 +313,9 @@ static bool handleMemTransferInst(MemTransferInst &I) {
IGC_ASSERT(nullptr != I.getParent()->getParent());
Module *M = I.getParent()->getParent()->getParent();
if (isa<MemCpyInst>(I))
- Fn = Intrinsic::getDeclaration(M, Intrinsic::memcpy, Tys);
+ Fn = Intrinsic::getOrInsertDeclaration(M, Intrinsic::memcpy, Tys);
else if (isa<MemMoveInst>(I))
- Fn = Intrinsic::getDeclaration(M, Intrinsic::memmove, Tys);
+ Fn = Intrinsic::getOrInsertDeclaration(M, Intrinsic::memmove, Tys);
else
IGC_ASSERT_EXIT_MESSAGE(0, "unsupported memory intrinsic");
@@ -345,7 +345,7 @@ bool GASPropagator::visitMemSetInst(MemSetInst &I) {
Type *OrigDstTy = OrigDst->getType();
Type *Tys[] = {OrigDstTy, I.getArgOperand(2)->getType()};
- Function *Fn = Intrinsic::getDeclaration(I.getParent()->getParent()->getParent(), Intrinsic::memset, Tys);
+ Function *Fn = Intrinsic::getOrInsertDeclaration(I.getParent()->getParent()->getParent(), Intrinsic::memset, Tys);
I.setCalledFunction(Fn);
DstUse->set(OrigDst);
@@ -359,8 +359,8 @@ bool GASPropagator::visitCallInst(CallInst &I) {
return false;
PointerType *SrcPtrTy = cast<PointerType>(TheVal->getType());
- bool IsGAS2P = Callee->getName().equals("__builtin_IB_memcpy_generic_to_private");
- bool IsP2GAS = Callee->getName().equals("__builtin_IB_memcpy_private_to_generic");
+ bool IsGAS2P = (Callee->getName() == "__builtin_IB_memcpy_generic_to_private");
+ bool IsP2GAS = (Callee->getName() == "__builtin_IB_memcpy_private_to_generic");
if (IsGAS2P || IsP2GAS) {
Type *Tys[4];
Tys[0] = IsGAS2P ? I.getArgOperand(0)->getType() : SrcPtrTy;
@@ -399,7 +399,7 @@ bool GASPropagator::visitCallInst(CallInst &I) {
}
}
- if (Callee->getName().equals("__builtin_IB_to_local")) {
+ if ((Callee->getName() == "__builtin_IB_to_local")) {
Type *DstTy = I.getType();
Value *NewPtr = Constant::getNullValue(DstTy);
if (SrcPtrTy->getAddressSpace() == ADDRESS_SPACE_LOCAL) {
@@ -413,7 +413,7 @@ bool GASPropagator::visitCallInst(CallInst &I) {
return true;
}
- if (Callee->getName().equals("__builtin_IB_to_private")) {
+ if ((Callee->getName() == "__builtin_IB_to_private")) {
Type *DstTy = I.getType();
Value *NewPtr = Constant::getNullValue(DstTy);
if (SrcPtrTy->getAddressSpace() == ADDRESS_SPACE_PRIVATE) {
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/GenericAddressResolution/GASRetValuePropagator.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/GenericAddressResolution/GASRetValuePropagator.cpp
index 418352f..e3d49dd 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/GenericAddressResolution/GASRetValuePropagator.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/GenericAddressResolution/GASRetValuePropagator.cpp
@@ -312,5 +312,5 @@ void GASRetValuePropagator::updateDwarfAddressSpace(Function *F) {
DIDerivedType *GASRetValuePropagator::getDIDerivedTypeWithDwarfAddrspace(DIDerivedType *type, unsigned dwarfTag) {
return DIDerivedType::get(type->getContext(), type->getTag(), type->getName(), type->getFile(), type->getLine(),
type->getScope(), type->getBaseType(), type->getSizeInBits(), type->getAlignInBits(),
- type->getOffsetInBits(), dwarfTag, type->getFlags(), type->getExtraData());
+ type->getOffsetInBits(), dwarfTag, std::nullopt, type->getFlags(), type->getExtraData());
}
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/HandleDevicelibAssert/HandleDevicelibAssert.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/HandleDevicelibAssert/HandleDevicelibAssert.cpp
index 4901baa..1f0869b 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/HandleDevicelibAssert/HandleDevicelibAssert.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/HandleDevicelibAssert/HandleDevicelibAssert.cpp
@@ -38,7 +38,7 @@ bool HandleDevicelibAssert::runOnModule(Module &M) {
bool changed = false;
for (Function &F : M) {
- if (!F.getName().equals(ASSERT_FUNCTION_NAME))
+ if (!(F.getName() == ASSERT_FUNCTION_NAME))
continue;
if (F.isDeclaration())
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/ImageFuncs/ImageFuncResolution.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/ImageFuncs/ImageFuncResolution.cpp
index 5425436..ef32f0b 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/ImageFuncs/ImageFuncResolution.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/ImageFuncs/ImageFuncResolution.cpp
@@ -57,44 +57,44 @@ void ImageFuncResolution::visitCallInst(CallInst &CI) {
// Add appropriate sequence and image dimension func
StringRef funcName = CI.getCalledFunction()->getName();
- if (funcName.equals(ImageFuncsAnalysis::GET_IMAGE_HEIGHT)) {
+ if ((funcName == ImageFuncsAnalysis::GET_IMAGE_HEIGHT)) {
if (!isImplicitImageArgs) {
IGC_ASSERT_MESSAGE(false, "Getting Image Height from implicit args is supported only in bindful mode");
return;
}
imageRes = getImageHeight(CI);
- } else if (funcName.equals(ImageFuncsAnalysis::GET_IMAGE_WIDTH)) {
+ } else if ((funcName == ImageFuncsAnalysis::GET_IMAGE_WIDTH)) {
if (!isImplicitImageArgs) {
IGC_ASSERT_MESSAGE(false, "Getting Image Width from implicit args is supported only in bindful mode");
return;
}
imageRes = getImageWidth(CI);
- } else if (funcName.equals(ImageFuncsAnalysis::GET_IMAGE_DEPTH)) {
+ } else if ((funcName == ImageFuncsAnalysis::GET_IMAGE_DEPTH)) {
if (!isImplicitImageArgs) {
IGC_ASSERT_MESSAGE(false, "Getting Image Depth from implicit args is supported only in bindful mode");
return;
}
imageRes = getImageDepth(CI);
- } else if (funcName.equals(ImageFuncsAnalysis::GET_IMAGE_NUM_MIP_LEVELS)) {
+ } else if ((funcName == ImageFuncsAnalysis::GET_IMAGE_NUM_MIP_LEVELS)) {
imageRes = getImageNumMipLevels(CI);
- } else if (funcName.equals(ImageFuncsAnalysis::GET_IMAGE_CHANNEL_DATA_TYPE)) {
+ } else if ((funcName == ImageFuncsAnalysis::GET_IMAGE_CHANNEL_DATA_TYPE)) {
imageRes = getImageChannelDataType(CI);
- } else if (funcName.equals(ImageFuncsAnalysis::GET_IMAGE_CHANNEL_ORDER)) {
+ } else if ((funcName == ImageFuncsAnalysis::GET_IMAGE_CHANNEL_ORDER)) {
imageRes = getImageChannelOrder(CI);
- } else if (funcName.equals(ImageFuncsAnalysis::GET_IMAGE1D_ARRAY_SIZE) ||
- funcName.equals(ImageFuncsAnalysis::GET_IMAGE2D_ARRAY_SIZE)) {
+ } else if ((funcName == ImageFuncsAnalysis::GET_IMAGE1D_ARRAY_SIZE) ||
+ (funcName == ImageFuncsAnalysis::GET_IMAGE2D_ARRAY_SIZE)) {
if (!isImplicitImageArgs) {
IGC_ASSERT_MESSAGE(false, "Getting Image Array Size from implicit args is supported only in bindful mode");
return;
}
imageRes = getImageArraySize(CI);
- } else if (funcName.equals(ImageFuncsAnalysis::GET_IMAGE_NUM_SAMPLES)) {
+ } else if ((funcName == ImageFuncsAnalysis::GET_IMAGE_NUM_SAMPLES)) {
imageRes = getImageNumSamples(CI);
- } else if (funcName.equals(ImageFuncsAnalysis::GET_SAMPLER_ADDRESS_MODE)) {
+ } else if ((funcName == ImageFuncsAnalysis::GET_SAMPLER_ADDRESS_MODE)) {
imageRes = getSamplerAddressMode(CI);
- } else if (funcName.equals(ImageFuncsAnalysis::GET_SAMPLER_NORMALIZED_COORDS)) {
+ } else if ((funcName == ImageFuncsAnalysis::GET_SAMPLER_NORMALIZED_COORDS)) {
imageRes = getSamplerNormalizedCoords(CI);
- } else if (funcName.equals(ImageFuncsAnalysis::GET_SAMPLER_SNAP_WA_REQUIRED)) {
+ } else if ((funcName == ImageFuncsAnalysis::GET_SAMPLER_SNAP_WA_REQUIRED)) {
imageRes = getSamplerSnapWARequired(CI);
} else {
// Non image function, do nothing
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/ImageFuncs/ResolveSampledImageBuiltins.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/ImageFuncs/ResolveSampledImageBuiltins.cpp
index 8ff9b9e..7ae66ca 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/ImageFuncs/ResolveSampledImageBuiltins.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/ImageFuncs/ResolveSampledImageBuiltins.cpp
@@ -65,9 +65,9 @@ void ResolveSampledImageBuiltins::visitCallInst(CallInst &CI) {
Value *res = nullptr;
StringRef funcName = CI.getCalledFunction()->getName();
- if (funcName.equals(ResolveSampledImageBuiltins::GET_IMAGE)) {
+ if ((funcName == ResolveSampledImageBuiltins::GET_IMAGE)) {
res = lowerGetImage(CI);
- } else if (funcName.equals(ResolveSampledImageBuiltins::GET_SAMPLER)) {
+ } else if ((funcName == ResolveSampledImageBuiltins::GET_SAMPLER)) {
res = lowerGetSampler(CI);
} else {
return;
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/JointMatrixFuncsResolutionPass/JointMatrixFuncsResolutionPass.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/JointMatrixFuncsResolutionPass/JointMatrixFuncsResolutionPass.cpp
index 917e78c..291f87c 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/JointMatrixFuncsResolutionPass/JointMatrixFuncsResolutionPass.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/JointMatrixFuncsResolutionPass/JointMatrixFuncsResolutionPass.cpp
@@ -109,8 +109,8 @@ static bool isMatrixType(const Type *type) {
name = eltType->getStructName();
}
- if (name.startswith("intel.joint_matrix") || name.startswith("spirv.JointMatrixINTEL") ||
- name.startswith("spirv.CooperativeMatrixKHR"))
+ if (name.starts_with("intel.joint_matrix") || name.starts_with("spirv.JointMatrixINTEL") ||
+ name.starts_with("spirv.CooperativeMatrixKHR"))
return true;
return false;
@@ -953,13 +953,13 @@ bool JointMatrixFuncsResolutionPass::parseMatrixTypeNameLegacy(const Type *opaqu
StringRef name = IGCLLVM::getNonOpaquePtrEltTy(ptrType)->getStructName();
unsigned offset = 0;
- if (name.startswith("intel.joint_matrix_packedA_")) {
+ if (name.starts_with("intel.joint_matrix_packedA_")) {
outDescription->layout = LayoutPackedA;
offset += sizeof "intel.joint_matrix_packedA_";
- } else if (name.startswith("intel.joint_matrix_packedB_")) {
+ } else if (name.starts_with("intel.joint_matrix_packedB_")) {
outDescription->layout = LayoutPackedB;
offset += sizeof "intel.joint_matrix_packedB_";
- } else if (name.startswith("intel.joint_matrix_acc_")) {
+ } else if (name.starts_with("intel.joint_matrix_acc_")) {
outDescription->layout = LayoutRowMajor;
offset += sizeof "intel.joint_matrix_acc_";
} else {
@@ -1002,7 +1002,7 @@ bool JointMatrixFuncsResolutionPass::parseMatrixTypeNameLegacy(const Type *opaqu
bool JointMatrixFuncsResolutionPass::ParseMatrixTypeName(Type *opaqueType, JointMatrixTypeDescription *outDescription) {
StringRef name = GetMatrixTypeName(opaqueType);
- if (name.startswith("intel.joint_matrix")) {
+ if (name.starts_with("intel.joint_matrix")) {
return parseMatrixTypeNameLegacy(opaqueType, outDescription);
}
@@ -1577,7 +1577,7 @@ template <bool IsJointMatrix, bool IsChecked> Instruction *JointMatrixFuncsResol
* have a single set of store builtins for floats and integer */
LLVMContext &ctx = CI->getContext();
Type *retTy = Type::getVoidTy(ctx);
- Type *arrayTy = Type::getInt8PtrTy(ctx, ADDRESS_SPACE_PRIVATE);
+ Type *arrayTy = PointerType::get(Type::getInt8Ty(ctx), ADDRESS_SPACE_PRIVATE);
Module *M = CI->getParent()->getModule();
unsigned address_space = ptrVal->getType()->getPointerAddressSpace();
@@ -1652,7 +1652,7 @@ template <bool IsJointMatrix, bool IsChecked> Instruction *JointMatrixFuncsResol
* have a single set of store builtins for floats and integers */
LLVMContext &ctx = CI->getContext();
- Type *arrayTy = Type::getInt8PtrTy(ctx, ADDRESS_SPACE_PRIVATE);
+ Type *arrayTy = PointerType::get(Type::getInt8Ty(ctx), ADDRESS_SPACE_PRIVATE);
Module *M = CI->getParent()->getModule();
@@ -1828,7 +1828,7 @@ static Function *getMADBuiltin(Module *Mod, unsigned M, unsigned N, unsigned K,
std::string funcName = getMADBuiltinName(M, N, K, PA, PB, cDesc, dDesc);
Type *retTy = Type::getVoidTy(Mod->getContext());
- Type *argTy = Type::getInt8PtrTy(Mod->getContext(), ADDRESS_SPACE_PRIVATE);
+ Type *argTy = PointerType::get(Type::getInt8Ty(Mod->getContext()), ADDRESS_SPACE_PRIVATE);
FunctionType *funcType = FunctionType::get(retTy, {argTy, argTy, argTy, argTy}, false);
@@ -1917,7 +1917,7 @@ Instruction *JointMatrixFuncsResolutionPass::ResolveMad(CallInst *CI, unsigned O
builder.CreateStore(cMat, sliceC);
LLVMContext &ctx = CI->getContext();
- Type *arrayTy = Type::getInt8PtrTy(ctx, ADDRESS_SPACE_PRIVATE);
+ Type *arrayTy = PointerType::get(Type::getInt8Ty(ctx), ADDRESS_SPACE_PRIVATE);
Value *ptrA = builder.CreateBitCast(sliceA, arrayTy);
Value *ptrB = builder.CreateBitCast(sliceB, arrayTy);
@@ -2077,7 +2077,7 @@ Instruction *JointMatrixFuncsResolutionPass::ResolveFillChecked(CallInst *CI) {
Type *matTy = ResolveType(CI->getType(), &desc);
LLVMContext &ctx = CI->getContext();
Type *retTy = Type::getVoidTy(ctx);
- Type *arrayTy = Type::getInt8PtrTy(ctx, ADDRESS_SPACE_PRIVATE);
+ Type *arrayTy = PointerType::get(Type::getInt8Ty(ctx), ADDRESS_SPACE_PRIVATE);
Module *M = CI->getParent()->getModule();
@@ -2810,14 +2810,14 @@ void JointMatrixFuncsResolutionPass::visitCallInst(CallInst &CI) {
* future when returning and passing matrices by argument is
* supported also basic block terminators should be used as
* transformation starting point */
- if (funcName.startswith(JointMatrixBIPrefix) || funcName.contains(JointMatrixBISuffix) ||
+ if (funcName.starts_with(JointMatrixBIPrefix) || funcName.contains(JointMatrixBISuffix) ||
funcName.contains(CooperativeMatrixBISuffix)) {
ResolveSIMDSize(CI.getParent()->getParent());
ResolveCall(&CI);
return;
}
- if (funcName.startswith("_Z") &&
+ if (funcName.starts_with("_Z") &&
(funcName.contains("__spirv_JointMatrix") || funcName.contains("__spirv_CooperativeMatrix") ||
funcName.contains(JointMatrixFillPrefx))) {
ResolveSIMDSize(CI.getParent()->getParent());
@@ -2887,7 +2887,7 @@ std::string getTypeName(Type *T) {
DIType *getOrCreateType(Type *T, Module *M) {
DIType *diType = nullptr;
DIBuilder Builder(*M, true);
- DataLayout Layout(M);
+ const DataLayout &Layout = M->getDataLayout();
if (T->isPointerTy()) {
@@ -2935,7 +2935,7 @@ void JointMatrixFuncsResolutionPass::RecursiveSearchAndFixCanonicalizdGEPandLife
uint64_t pointerSize = DL.getPointerSizeInBits(GEP->getPointerAddressSpace()) / 8;
uint64_t offsetInElements = offset->getZExtValue() / pointerSize;
uint64_t correctOffset = offsetInElements * matrixTypeAllocSize;
- ConstantInt *newOffsetConstant = ConstantInt::get(offset->getType(), correctOffset);
+ ConstantInt *newOffsetConstant = cast<ConstantInt>(ConstantInt::get(offset->getType(), correctOffset));
GEP->setOperand(1, newOffsetConstant);
LLVM_DEBUG(dbgs().indent(2) << "Fixed index: " << *GEP << "\n");
}
@@ -2969,22 +2969,6 @@ void JointMatrixFuncsResolutionPass::visitAllocaInst(AllocaInst &I) {
// update debug info
{
- TinyPtrVector<DbgDeclareInst *> DDIs = FindDbgDeclareUses(&I);
-
- for (DbgDeclareInst *ddi : DDIs) {
- auto loc = ddi->getDebugLoc();
- auto var = ddi->getVariable();
- auto file = var->getFile();
- auto lineNo = var->getLine();
- auto scope = var->getScope();
-
- auto type = getOrCreateType(newInst->getType(), I.getModule());
-
- DIBuilder builder(*(I.getModule()));
- auto created = builder.createAutoVariable(scope, var->getName(), file, lineNo, type);
- builder.insertDbgValueIntrinsic(newInst, created, builder.createExpression(), loc, ddi);
- ddi->eraseFromParent();
- }
}
// update GEPs and lifetime intrinsics
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/KernelArgs/KernelArgs.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/KernelArgs/KernelArgs.cpp
index 83c155a..4719427 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/KernelArgs/KernelArgs.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/KernelArgs/KernelArgs.cpp
@@ -142,7 +142,7 @@ KernelArg::ArgType KernelArg::calcArgType(const Argument *arg, const StringRef t
case ADDRESS_SPACE_PRIVATE: {
Type *type = arg->getType();
- if (typeStr.equals("queue_t") || typeStr.equals("spirv.Queue")) {
+ if ((typeStr == "queue_t") || (typeStr == "spirv.Queue")) {
return KernelArg::ArgType::PTR_DEVICE_QUEUE;
} else if (arg->hasByValAttr() && type->isPointerTy() && arg->getParamByValType()->isStructTy()) {
// Pass by value structs will show up as private pointer
@@ -339,13 +339,13 @@ KernelArg::ArgType KernelArg::calcArgType(const ImplicitArg &arg) const {
}
KernelArg::AccessQual KernelArg::calcAccessQual(const Argument *arg, const StringRef qualStr) const {
- if (qualStr.equals("read_write"))
+ if ((qualStr == "read_write"))
return READ_WRITE;
- if (qualStr.startswith("read"))
+ if (qualStr.starts_with("read"))
return READ_ONLY;
- if (qualStr.startswith("write"))
+ if (qualStr.starts_with("write"))
return WRITE_ONLY;
return NONE;
@@ -406,7 +406,7 @@ unsigned int KernelArg::getLocationCount() const { return m_locationCount; }
unsigned int KernelArg::getLocationIndex() const { return m_locationIndex; }
bool KernelArg::isImage(const Argument *arg, const StringRef typeStr, ArgType &imageArgType) {
- if (!typeStr.startswith("image") && !typeStr.startswith("bindless"))
+ if (!typeStr.starts_with("image") && !typeStr.starts_with("bindless"))
return false;
// Get the original OpenCL type from the metadata and check if it's an image
@@ -414,62 +414,62 @@ bool KernelArg::isImage(const Argument *arg, const StringRef typeStr, ArgType &i
// Accept those too.
std::vector<std::string> accessQual{"_t", "_ro_t", "_wo_t", "_rw_t"};
for (auto &postfix : accessQual) {
- if (typeStr.equals("image1d" + postfix)) {
+ if ((typeStr == "image1d" + postfix)) {
imageArgType = ArgType::IMAGE_1D;
return true;
}
- if (typeStr.equals("image1d_buffer" + postfix)) {
+ if ((typeStr == "image1d_buffer" + postfix)) {
imageArgType = ArgType::IMAGE_1D_BUFFER;
return true;
}
- if (typeStr.equals("image2d" + postfix)) {
+ if ((typeStr == "image2d" + postfix)) {
imageArgType = ArgType::IMAGE_2D;
return true;
}
- if (typeStr.equals("image2d_depth" + postfix)) {
+ if ((typeStr == "image2d_depth" + postfix)) {
imageArgType = ArgType::IMAGE_2D_DEPTH;
return true;
}
- if (typeStr.equals("image2d_msaa" + postfix)) {
+ if ((typeStr == "image2d_msaa" + postfix)) {
imageArgType = ArgType::IMAGE_2D_MSAA;
return true;
}
- if (typeStr.equals("image2d_msaa_depth" + postfix)) {
+ if ((typeStr == "image2d_msaa_depth" + postfix)) {
imageArgType = ArgType::IMAGE_2D_MSAA_DEPTH;
return true;
}
- if (typeStr.equals("image3d" + postfix)) {
+ if ((typeStr == "image3d" + postfix)) {
imageArgType = ArgType::IMAGE_3D;
return true;
}
- if (typeStr.equals("image1d_array" + postfix)) {
+ if ((typeStr == "image1d_array" + postfix)) {
imageArgType = ArgType::IMAGE_1D_ARRAY;
return true;
}
- if (typeStr.equals("image2d_array" + postfix)) {
+ if ((typeStr == "image2d_array" + postfix)) {
imageArgType = ArgType::IMAGE_2D_ARRAY;
return true;
}
- if (typeStr.equals("image2d_array_depth" + postfix)) {
+ if ((typeStr == "image2d_array_depth" + postfix)) {
imageArgType = ArgType::IMAGE_2D_DEPTH_ARRAY;
return true;
}
- if (typeStr.equals("image2d_array_msaa" + postfix)) {
+ if ((typeStr == "image2d_array_msaa" + postfix)) {
imageArgType = ArgType::IMAGE_2D_MSAA_ARRAY;
return true;
}
- if (typeStr.equals("image2d_array_msaa_depth" + postfix)) {
+ if ((typeStr == "image2d_array_msaa_depth" + postfix)) {
imageArgType = ArgType::IMAGE_2D_MSAA_DEPTH_ARRAY;
return true;
}
@@ -477,82 +477,82 @@ bool KernelArg::isImage(const Argument *arg, const StringRef typeStr, ArgType &i
// See if these are address space decoded args.
// Get the original OpenCL type from the metadata and check if it's an image
- if (typeStr.equals("bindless_image1d_t")) {
+ if ((typeStr == "bindless_image1d_t")) {
imageArgType = ArgType::BINDLESS_IMAGE_1D;
return true;
}
- if (typeStr.equals("bindless_image1d_buffer_t")) {
+ if ((typeStr == "bindless_image1d_buffer_t")) {
imageArgType = ArgType::BINDLESS_IMAGE_1D_BUFFER;
return true;
}
- if (typeStr.equals("bindless_image2d_t")) {
+ if ((typeStr == "bindless_image2d_t")) {
imageArgType = ArgType::BINDLESS_IMAGE_2D;
return true;
}
- if (typeStr.equals("bindless_image2d_depth_t")) {
+ if ((typeStr == "bindless_image2d_depth_t")) {
imageArgType = ArgType::BINDLESS_IMAGE_2D_DEPTH;
return true;
}
- if (typeStr.equals("bindless_image2d_msaa_t")) {
+ if ((typeStr == "bindless_image2d_msaa_t")) {
imageArgType = ArgType::BINDLESS_IMAGE_2D_MSAA;
return true;
}
- if (typeStr.equals("bindless_image2d_msaa_depth_t")) {
+ if ((typeStr == "bindless_image2d_msaa_depth_t")) {
imageArgType = ArgType::BINDLESS_IMAGE_2D_MSAA_DEPTH;
return true;
}
- if (typeStr.equals("bindless_image3d_t")) {
+ if ((typeStr == "bindless_image3d_t")) {
imageArgType = ArgType::BINDLESS_IMAGE_3D;
return true;
}
- if (typeStr.equals("bindless_image_cube_array_t")) {
+ if ((typeStr == "bindless_image_cube_array_t")) {
imageArgType = ArgType::BINDLESS_IMAGE_CUBE_ARRAY;
return true;
}
- if (typeStr.equals("bindless_image_cube_t")) {
+ if ((typeStr == "bindless_image_cube_t")) {
imageArgType = ArgType::BINDLESS_IMAGE_CUBE;
return true;
}
- if (typeStr.equals("bindless_image1d_array_t")) {
+ if ((typeStr == "bindless_image1d_array_t")) {
imageArgType = ArgType::BINDLESS_IMAGE_1D_ARRAY;
return true;
}
- if (typeStr.equals("bindless_image2d_array_t")) {
+ if ((typeStr == "bindless_image2d_array_t")) {
imageArgType = ArgType::BINDLESS_IMAGE_2D_ARRAY;
return true;
}
- if (typeStr.equals("bindless_image2d_array_depth_t")) {
+ if ((typeStr == "bindless_image2d_array_depth_t")) {
imageArgType = ArgType::BINDLESS_IMAGE_2D_DEPTH_ARRAY;
return true;
}
- if (typeStr.equals("bindless_image2d_array_msaa_t")) {
+ if ((typeStr == "bindless_image2d_array_msaa_t")) {
imageArgType = ArgType::BINDLESS_IMAGE_2D_MSAA_ARRAY;
return true;
}
- if (typeStr.equals("bindless_image2d_array_msaa_depth_t")) {
+ if ((typeStr == "bindless_image2d_array_msaa_depth_t")) {
imageArgType = ArgType::BINDLESS_IMAGE_2D_MSAA_DEPTH_ARRAY;
return true;
}
- if (typeStr.equals("bindless_image_cube_array_depth_t")) {
+ if ((typeStr == "bindless_image_cube_array_depth_t")) {
imageArgType = ArgType::BINDLESS_IMAGE_CUBE_DEPTH_ARRAY;
return true;
}
- if (typeStr.equals("bindless_image_cube_depth_t")) {
+ if ((typeStr == "bindless_image_cube_depth_t")) {
imageArgType = ArgType::BINDLESS_IMAGE_CUBE_DEPTH;
return true;
}
@@ -562,11 +562,11 @@ bool KernelArg::isImage(const Argument *arg, const StringRef typeStr, ArgType &i
bool KernelArg::isSampler(const Argument *arg, const StringRef typeStr) {
// Get the original OpenCL type from the metadata and check if it's a sampler
- return (typeStr.equals("sampler_t"));
+ return ((typeStr == "sampler_t"));
}
bool KernelArg::isBindlessSampler(const Argument *arg, const StringRef typeStr) {
- return (typeStr.equals("bindless_sampler_t"));
+ return ((typeStr == "bindless_sampler_t"));
}
bool KernelArg::isArgPtrType() {
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/LSCFuncs/LSCFuncsResolution.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/LSCFuncs/LSCFuncsResolution.cpp
index 0ab2cc8..0c5ca69 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/LSCFuncs/LSCFuncsResolution.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/LSCFuncs/LSCFuncsResolution.cpp
@@ -291,35 +291,35 @@ void LSCFuncsResolution::visitCallInst(CallInst &CI) {
//////////////
// loads
- if (FN.startswith(LSCFuncsResolution::PREFIX_LSC_LOAD_global)) {
+ if (FN.starts_with(LSCFuncsResolution::PREFIX_LSC_LOAD_global)) {
lscCall = CreateLSCLoadIntrinsicCallInst(GenISAIntrinsic::GenISA_LSCLoad, false);
- } else if (FN.startswith(LSCFuncsResolution::PREFIX_LSC_LOAD_BLOCK_global)) {
+ } else if (FN.starts_with(LSCFuncsResolution::PREFIX_LSC_LOAD_BLOCK_global)) {
lscCall = CreateLSCLoadIntrinsicCallInst(GenISAIntrinsic::GenISA_LSCLoadBlock, false);
- } else if (FN.startswith(LSCFuncsResolution::PREFIX_LSC_LOAD_local)) {
+ } else if (FN.starts_with(LSCFuncsResolution::PREFIX_LSC_LOAD_local)) {
lscCall = CreateLSCLoadIntrinsicCallInst(GenISAIntrinsic::GenISA_LSCLoad, true);
- } else if (FN.startswith(LSCFuncsResolution::PREFIX_LSC_LOAD_CMASK_global)) {
+ } else if (FN.starts_with(LSCFuncsResolution::PREFIX_LSC_LOAD_CMASK_global)) {
lscCall = CreateLSCLoadCmaskIntrinsicCallInst(false);
- } else if (FN.startswith(LSCFuncsResolution::PREFIX_LSC_LOAD_CMASK_local)) {
+ } else if (FN.starts_with(LSCFuncsResolution::PREFIX_LSC_LOAD_CMASK_local)) {
lscCall = CreateLSCLoadCmaskIntrinsicCallInst(true);
//////////////
// prefetches
} else if (FN.consume_front(LSCFuncsResolution::PREFIX_LSC_SIMD_BLOCK_PREFETCH)) {
lscCall = CreateLSCSimdBlockPrefetchIntrinsicCallInst(FN);
- } else if (FN.startswith(LSCFuncsResolution::PREFIX_LSC_LOAD_status)) {
+ } else if (FN.starts_with(LSCFuncsResolution::PREFIX_LSC_LOAD_status)) {
lscCall = CreateLSCLoadStatusPreftchIntrinsicCallInst(GenISAIntrinsic::GenISA_LSCLoadStatus);
- } else if (FN.startswith(LSCFuncsResolution::PREFIX_LSC_PREFETCH)) {
+ } else if (FN.starts_with(LSCFuncsResolution::PREFIX_LSC_PREFETCH)) {
lscCall = CreateLSCLoadStatusPreftchIntrinsicCallInst(GenISAIntrinsic::GenISA_LSCPrefetch);
//////////////
// stores
- } else if (FN.startswith(LSCFuncsResolution::PREFIX_LSC_STORE_global)) {
+ } else if (FN.starts_with(LSCFuncsResolution::PREFIX_LSC_STORE_global)) {
lscCall = CreateLSCStoreIntrinsicCallInst(GenISAIntrinsic::GenISA_LSCStore, false);
- } else if (FN.startswith(LSCFuncsResolution::PREFIX_LSC_STORE_BLOCK_global)) {
+ } else if (FN.starts_with(LSCFuncsResolution::PREFIX_LSC_STORE_BLOCK_global)) {
lscCall = CreateLSCStoreIntrinsicCallInst(GenISAIntrinsic::GenISA_LSCStoreBlock, false);
- } else if (FN.startswith(LSCFuncsResolution::PREFIX_LSC_STORE_local)) {
+ } else if (FN.starts_with(LSCFuncsResolution::PREFIX_LSC_STORE_local)) {
lscCall = CreateLSCStoreIntrinsicCallInst(GenISAIntrinsic::GenISA_LSCStore, true);
- } else if (FN.startswith(LSCFuncsResolution::PREFIX_LSC_STORE_CMASK_global)) {
+ } else if (FN.starts_with(LSCFuncsResolution::PREFIX_LSC_STORE_CMASK_global)) {
lscCall = CreateLSCStoreCmaskIntrinsicCallInst(false);
- } else if (FN.startswith(LSCFuncsResolution::PREFIX_LSC_STORE_CMASK_local)) {
+ } else if (FN.starts_with(LSCFuncsResolution::PREFIX_LSC_STORE_CMASK_local)) {
lscCall = CreateLSCStoreCmaskIntrinsicCallInst(true);
//////////////
// 2d block intrinsics
@@ -353,15 +353,15 @@ void LSCFuncsResolution::visitCallInst(CallInst &CI) {
lscCall = CreateSubGroup2DBlockOperation(CI, FN, false);
//////////////
// atomics
- } else if (FN.startswith(LSCFuncsResolution::PREFIX_LSC_ATOMIC)) {
+ } else if (FN.starts_with(LSCFuncsResolution::PREFIX_LSC_ATOMIC)) {
bool isLocalMem = FN.find("_local_") != StringRef::npos;
lscCall = CreateLSCAtomicIntrinsicCallInst(isLocalMem);
//////////////
// misc stuff
- } else if (FN.startswith(LSCFuncsResolution::PREFIX_LSC_FENCE_EVICT_TO_MEMORY)) {
+ } else if (FN.starts_with(LSCFuncsResolution::PREFIX_LSC_FENCE_EVICT_TO_MEMORY)) {
// LSC fence
lscCall = CreateLSCFenceEvictToMemory();
- } else if (FN.startswith(LSCFuncsResolution::PREFIX_LSC_FENCE)) {
+ } else if (FN.starts_with(LSCFuncsResolution::PREFIX_LSC_FENCE)) {
// LSC fence
lscCall = CreateLSCFenceIntrinsicCallInst(CI);
} else {
@@ -1193,13 +1193,13 @@ Instruction *LSCFuncsResolution::CreateLSCSimdBlockPrefetchIntrinsicCallInst(Str
LscTypeInfo typeInfo{};
- if (elementTypeName.equals("uchar")) {
+ if ((elementTypeName == "uchar")) {
typeInfo.dataSize = LSC_DATA_SIZE_8b;
- } else if (elementTypeName.equals("ushort")) {
+ } else if ((elementTypeName == "ushort")) {
typeInfo.dataSize = LSC_DATA_SIZE_16b;
- } else if (elementTypeName.equals("uint")) {
+ } else if ((elementTypeName == "uint")) {
typeInfo.dataSize = LSC_DATA_SIZE_32b;
- } else if (elementTypeName.equals("ulong")) {
+ } else if ((elementTypeName == "ulong")) {
typeInfo.dataSize = LSC_DATA_SIZE_64b;
}
@@ -1484,11 +1484,11 @@ LscTypeInfo LSCFuncsResolution::decodeTypeInfoFromName() {
// they don't return data
// everything else is suffixed by the type and maybe a vector integer
- if ((FN.endswith("uchar_to_uint")) || (FN.endswith("uchar_from_uint"))) {
+ if ((FN.ends_with("uchar_to_uint")) || (FN.ends_with("uchar_from_uint"))) {
ti.dataSize = LSC_DATA_SIZE_8c32b;
ti.sizeOfType = 1;
return ti;
- } else if (FN.endswith("ushort_to_uint") || FN.endswith("ushort_from_uint")) {
+ } else if (FN.ends_with("ushort_to_uint") || FN.ends_with("ushort_from_uint")) {
ti.dataSize = LSC_DATA_SIZE_16c32b;
ti.sizeOfType = 2;
return ti;
@@ -1571,8 +1571,8 @@ LscTypeInfo LSCFuncsResolution::decodeTypeInfoFromName() {
// The legal prototypes provided in the builtin file constrain
// most mischief, but remember anyone can write a prototype.
if (ti.dataSize == LSC_DATA_SIZE_8b || ti.dataSize == LSC_DATA_SIZE_16b) {
- bool isPrefetchOrLoadStatus = FN.startswith(LSCFuncsResolution::PREFIX_LSC_LOAD_status) ||
- FN.startswith(LSCFuncsResolution::PREFIX_LSC_PREFETCH);
+ bool isPrefetchOrLoadStatus = FN.starts_with(LSCFuncsResolution::PREFIX_LSC_LOAD_status) ||
+ FN.starts_with(LSCFuncsResolution::PREFIX_LSC_PREFETCH);
if (!isPrefetchOrLoadStatus) {
// D8 and D16 aren't supported yet in normal (non-prefetch)
// loads and stores
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/LocalBuffers/InlineLocalsResolution.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/LocalBuffers/InlineLocalsResolution.cpp
index a4fe81c..9a7e9b8 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/LocalBuffers/InlineLocalsResolution.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/LocalBuffers/InlineLocalsResolution.cpp
@@ -308,7 +308,7 @@ void InlineLocalsResolution::collectInfoOnSharedLocalMem(Module &M) {
Instruction *inst = &(*I);
if (CallInst *CI = dyn_cast<CallInst>(inst)) {
Function *pFunc = CI->getCalledFunction();
- if (pFunc && pFunc->getName().equals(BUILTIN_MEMPOOL)) {
+ if (pFunc && (pFunc->getName() == BUILTIN_MEMPOOL)) {
// should always be called with constant operands
IGC_ASSERT(isa<ConstantInt>(CI->getArgOperand(0)));
IGC_ASSERT(isa<ConstantInt>(CI->getArgOperand(1)));
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/ManageableBarriers/ManageableBarriersResolution.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/ManageableBarriers/ManageableBarriersResolution.cpp
index 6543557..bed9cd4 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/ManageableBarriers/ManageableBarriersResolution.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/ManageableBarriers/ManageableBarriersResolution.cpp
@@ -74,7 +74,7 @@ Value *ManageableBarriersResolution::allocBarriersDataPool(Function *pFunc) {
new GlobalVariable(*(pFunc->getParent()), manageBarrierDataPoolType, false, GlobalVariable::InternalLinkage,
nullptr, "", nullptr, GlobalVariable::NotThreadLocal, ADDRESS_SPACE_LOCAL, false);
- Value *cast = BitCastInst::CreateBitOrPointerCast(SLMPool, builder.getInt8PtrTy(ADDRESS_SPACE_LOCAL), "", pFirstInst);
+ Value *cast = BitCastInst::CreateBitOrPointerCast(SLMPool, PointerType::get(builder.getInt8Ty(), ADDRESS_SPACE_LOCAL), "", pFirstInst);
return cast;
}
@@ -88,7 +88,7 @@ Value *ManageableBarriersResolution::preparePointerToBarrierStruct(Value *ptrToB
// Pick insterested us data/field from this selected barrier data
Value *barrierIdx2Field = builder.CreateAdd(ptrToBarrierSlotPtr2Int, builder.getInt32((int)FiledType * sizeof(int)));
- Value *slmPoolInt2Ptr = builder.CreateIntToPtr(barrierIdx2Field, builder.getInt8PtrTy(ADDRESS_SPACE_LOCAL));
+ Value *slmPoolInt2Ptr = builder.CreateIntToPtr(barrierIdx2Field, PointerType::get(builder.getInt8Ty(), ADDRESS_SPACE_LOCAL));
return slmPoolInt2Ptr;
}
@@ -103,7 +103,7 @@ Value *ManageableBarriersResolution::getManageableBarrierstructDataPtr(CallInst
// We need to move to correct barrier slot
Value *barrierIdx = builder.CreateMul(barrierID, builder.getInt32((int)MBDynamicStructFields::Max * sizeof(int)));
Value *slmBarrierSlotPtr2Int = builder.CreateAdd(barrierIdx, slmPoolPtr2Int);
- Value *slmBarrierSlotPtr = builder.CreateIntToPtr(slmBarrierSlotPtr2Int, builder.getInt8PtrTy(ADDRESS_SPACE_LOCAL));
+ Value *slmBarrierSlotPtr = builder.CreateIntToPtr(slmBarrierSlotPtr2Int, PointerType::get(builder.getInt8Ty(), ADDRESS_SPACE_LOCAL));
// Return ptr to the begining of the Barrier Data slot
return slmBarrierSlotPtr;
@@ -154,7 +154,7 @@ Value *ManageableBarriersResolution::getManageableBarrierstructDataFieldPtr(Valu
IGCIRBuilder<> builder(pInsertBefore);
Value *ptr8ty = preparePointerToBarrierStruct(ptrToBarrierSlot, DataType, pInsertBefore);
Value *ptr32ty =
- builder.CreatePointerCast(ptr8ty, Type::getInt32PtrTy(pInsertBefore->getContext(), ADDRESS_SPACE_LOCAL));
+ builder.CreatePointerCast(ptr8ty, PointerType::get(Type::getInt32Ty(pInsertBefore->getContext()), ADDRESS_SPACE_LOCAL));
return ptr32ty;
}
@@ -175,7 +175,7 @@ Value *ManageableBarriersResolution::prepareBarrierIDPoolPtr(Instruction *pInser
Value *offset2IDPool = builder.CreateAdd(
ptr2int, builder.getInt32(getMaxNamedBarrierCount() * (int)MBDynamicStructFields::Max * sizeof(int)));
Value *pIDPool = builder.CreateIntToPtr(offset2IDPool,
- PointerType::getInt32PtrTy(pInsertBefore->getContext(), ADDRESS_SPACE_LOCAL));
+ PointerType::get(Type::getInt32Ty(pInsertBefore->getContext()), ADDRESS_SPACE_LOCAL));
if (hasSimpleBarrier()) {
IGC_ASSERT_MESSAGE(mManageBarrierInstructionsInit.size() < 31, "There is no free ID for the barrier");
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/NamedBarriers/NamedBarriersResolution.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/NamedBarriers/NamedBarriersResolution.cpp
index d360b77..d994879 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/NamedBarriers/NamedBarriersResolution.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/NamedBarriers/NamedBarriersResolution.cpp
@@ -91,10 +91,10 @@ bool NamedBarriersResolution::runOnModule(Module &M) {
for (auto &func : M.getFunctionList()) {
StringRef funcName = func.getName();
- if (funcName.equals(NamedBarriersResolution::NAMED_BARRIERS_INIT)) {
+ if ((funcName == NamedBarriersResolution::NAMED_BARRIERS_INIT)) {
nbarrierInitF = &func;
- } else if (funcName.equals(NamedBarriersResolution::NAMED_BARRIERS_BARRIER_ARG2) ||
- funcName.equals(NamedBarriersResolution::NAMED_BARRIERS_BARRIER_ARG3)) {
+ } else if ((funcName == NamedBarriersResolution::NAMED_BARRIERS_BARRIER_ARG2) ||
+ (funcName == NamedBarriersResolution::NAMED_BARRIERS_BARRIER_ARG3)) {
nbarrierBarrierF = &func;
} else {
visit(func);
@@ -271,12 +271,12 @@ int NamedBarriersResolution::AlignNBCnt2BarrierNumber(uint NBCnt) {
}
bool NamedBarriersResolution::isNamedBarrierInit(StringRef &FunctionName) {
- return FunctionName.equals(NamedBarriersResolution::NAMED_BARRIERS_INIT);
+ return (FunctionName == NamedBarriersResolution::NAMED_BARRIERS_INIT);
}
bool NamedBarriersResolution::isNamedBarrierSync(StringRef &FunctionName) {
- return FunctionName.equals(NamedBarriersResolution::NAMED_BARRIERS_BARRIER_ARG2) ||
- FunctionName.equals(NamedBarriersResolution::NAMED_BARRIERS_BARRIER_ARG3);
+ return (FunctionName == NamedBarriersResolution::NAMED_BARRIERS_BARRIER_ARG2) ||
+ (FunctionName == NamedBarriersResolution::NAMED_BARRIERS_BARRIER_ARG3);
}
void NamedBarriersResolution::HandleNamedBarrierInitSW(CallInst &NBarrierInitCall) {
@@ -294,7 +294,7 @@ void NamedBarriersResolution::HandleNamedBarrierInitSW(CallInst &NBarrierInitCal
auto newName = "__builtin_spirv_OpNamedBarrierInitialize_i32_p3__namedBarrier_p3i32";
SmallVector<Type *, 3> ArgsTy{Type::getInt32Ty(context), m_NamedBarrierType->getPointerTo(SPIRAS_Local),
- Type::getInt32PtrTy(context, SPIRAS_Local)};
+ PointerType::get(Type::getInt32Ty(context), SPIRAS_Local)};
Type *BaseTy = m_NamedBarrierArray->getValueType();
auto pointerNBarrier = GetElementPtrInst::Create(BaseTy, m_NamedBarrierArray,
{ConstantInt::get(Type::getInt64Ty(module->getContext()), 0, true),
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/NontemporalLoadsAndStoresInAssert/NontemporalLoadsAndStoresInAssert.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/NontemporalLoadsAndStoresInAssert/NontemporalLoadsAndStoresInAssert.cpp
index a410a3e..2453f88 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/NontemporalLoadsAndStoresInAssert/NontemporalLoadsAndStoresInAssert.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/NontemporalLoadsAndStoresInAssert/NontemporalLoadsAndStoresInAssert.cpp
@@ -40,7 +40,7 @@ bool NontemporalLoadsAndStoresInAssert::runOnModule(Module &M) {
bool changed = false;
for (Function &F : M) {
- if (!F.getName().equals(ASSERT_FUNCTION_NAME))
+ if (!(F.getName() == ASSERT_FUNCTION_NAME))
continue;
for (auto I = inst_begin(F); I != inst_end(F); ++I) {
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/OpenCLPrintf/OpenCLPrintfResolution.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/OpenCLPrintf/OpenCLPrintfResolution.cpp
index 35890bb..c0c0504 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/OpenCLPrintf/OpenCLPrintfResolution.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/OpenCLPrintf/OpenCLPrintfResolution.cpp
@@ -609,7 +609,7 @@ CallInst *OpenCLPrintfResolution::genAtomicAdd(Value *outputBufferPtr, Value *da
// %writeOffset = call i32 @__builtin_IB_atomic_add_global_i32(i32 addrspace(1)* <outputBufferPtr>,
// i32 <dataSize>)
//
- Type *bufPtrType = Type::getInt32PtrTy(*m_context, ADDRESS_SPACE_GLOBAL);
+ Type *bufPtrType = PointerType::get(Type::getInt32Ty(*m_context), ADDRESS_SPACE_GLOBAL);
if (outputBufferPtr->getType() != bufPtrType) {
outputBufferPtr =
CastInst::Create(Instruction::CastOps::BitCast, outputBufferPtr, bufPtrType, "ptrBC", &printfCall);
@@ -746,7 +746,7 @@ Instruction *OpenCLPrintfResolution::generateCastToPtr(SPrintfArgDescriptor *arg
}
case IGC::SHADER_PRINTF_STRING_LITERAL: {
- castedType = Type::getInt64PtrTy(*m_context, ADDRESS_SPACE_GLOBAL);
+ castedType = PointerType::get(Type::getInt64Ty(*m_context), ADDRESS_SPACE_GLOBAL);
break;
}
case IGC::SHADER_PRINTF_POINTER:
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/PrivateMemory/PrivateMemoryResolution.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/PrivateMemory/PrivateMemoryResolution.cpp
index 84a336b..7d94f10 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/PrivateMemory/PrivateMemoryResolution.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/PrivateMemory/PrivateMemoryResolution.cpp
@@ -1029,18 +1029,7 @@ bool PrivateMemoryResolution::resolveAllocaInstructions(bool privateOnStack, boo
// Attaching this metadata is crucial to both properly interpret this locations as stack based ond to inline it.
// Because these are stack locations we can safely inline them even with optimizations disabled (O0).
- auto DbgDcls = llvm::FindDbgDeclareUses(pAI);
- for (auto DbgDcl : DbgDcls) {
- unsigned scalarBufferOffset = m_ModAllocaInfo->getBufferOffset(pAI);
- unsigned bufferSize = m_ModAllocaInfo->getBufferStride(pAI);
-
- // Attach metadata to instruction containing offset of storage
- auto OffsetMD =
- MDNode::get(builder.getContext(), ConstantAsMetadata::get(builder.getInt32(scalarBufferOffset)));
- DbgDcl->setMetadata("StorageOffset", OffsetMD);
- auto SizeMD = MDNode::get(builder.getContext(), ConstantAsMetadata::get(builder.getInt32(bufferSize)));
- DbgDcl->setMetadata("StorageSize", SizeMD);
- }
+ //
}
// Replace all uses of original alloca with the bitcast
pAI->replaceAllUsesWith(privateBuffer);
@@ -1219,11 +1208,11 @@ bool PrivateMemoryResolution::resolveAllocaInstructions(bool privateOnStack, boo
// because getImplicitArgValue() can move instructions, and it means that the insert point will be moved too.
Instruction *pointInstr = &*entryBuilder.GetInsertPoint();
if (pointInstr->isDebugOrPseudoInst())
- pointInstr = pointInstr->getNextNonDebugInstruction();
+ pointInstr = IGC::getNextNonDbgInstruction(pointInstr);
if (GenIntrinsicInst *inst = dyn_cast_or_null<GenIntrinsicInst>(pointInstr)) {
if (inst->getIntrinsicID() == GenISAIntrinsic::GenISA_getR0 ||
inst->getIntrinsicID() == GenISAIntrinsic::GenISA_getPrivateBase)
- pointInstr = inst->getNextNonDebugInstruction();
+ pointInstr = IGC::getNextNonDbgInstruction(inst);
}
// Find the implicit argument representing r0 and the private memory base.
@@ -1331,14 +1320,7 @@ bool PrivateMemoryResolution::resolveAllocaInstructions(bool privateOnStack, boo
// We can only safely inline such locations with optimizations disabled.
// On O2 we have no guarantee the offsets in registers are gonna be valid throughout the entire variable lifetime.
if (modMD->compOpt.OptDisable) {
- auto DbgDcls = llvm::FindDbgDeclareUses(pAI);
- for (auto DbgDcl : DbgDcls) {
- // Attach metadata to instruction containing offset of storage
- unsigned int scalarBufferOffset = m_ModAllocaInfo->getBufferOffset(pAI);
- auto OffsetMD =
- MDNode::get(builder.getContext(), ConstantAsMetadata::get(builder.getInt32(scalarBufferOffset)));
- DbgDcl->setMetadata("StorageOffset", OffsetMD);
- }
+ //
}
// Replace all uses of original alloca with the bitcast
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/PrivateMemory/PrivateMemoryUsageAnalysis.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/PrivateMemory/PrivateMemoryUsageAnalysis.cpp
index c4f29e3..290a4e7 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/PrivateMemory/PrivateMemoryUsageAnalysis.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/PrivateMemory/PrivateMemoryUsageAnalysis.cpp
@@ -172,7 +172,7 @@ void PrivateMemoryUsageAnalysis::visitCallInst(llvm::CallInst &CI) {
// Check if a sqrtd builtin is called to enable privMem
if (m_hasDPDivSqrtEmu && CI.hasName()) {
Function *calledFunc = CI.getCalledFunction();
- if (calledFunc && calledFunc->getName().startswith("__builtin_IB_native_sqrtd")) {
+ if (calledFunc && calledFunc->getName().starts_with("__builtin_IB_native_sqrtd")) {
m_hasPrivateMem = true;
}
}
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/ProcessBICodeAssumption/ProcessBICodeAssumption.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/ProcessBICodeAssumption/ProcessBICodeAssumption.cpp
index c4392e6..7584b65 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/ProcessBICodeAssumption/ProcessBICodeAssumption.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/ProcessBICodeAssumption/ProcessBICodeAssumption.cpp
@@ -83,7 +83,10 @@ void ProcessBICodeAssumption::visitCallInst(CallInst &CI) {
// Look for assume:
// %9 = icmp ult i64 %8, 2147483648
// call void @llvm.assume(i1 %9)
- if (!match(&CI, m_Intrinsic<Intrinsic::assume>(m_ICmp(Pred, m_Instruction(I), m_ConstantInt(Const)))))
+ if (!match(&CI, m_Intrinsic<Intrinsic::assume>(m_ICmp(m_Instruction(I), m_ConstantInt(Const)))))
+ return;
+
+ Pred = cast<ICmpInst>(CI.getArgOperand(0))->getPredicate();
return;
if (!matchCmp(Pred, Const))
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/ReplaceUnsupportedIntrinsics/ReplaceUnsupportedIntrinsics.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/ReplaceUnsupportedIntrinsics/ReplaceUnsupportedIntrinsics.cpp
index 2636b6c..9ce62ff 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/ReplaceUnsupportedIntrinsics/ReplaceUnsupportedIntrinsics.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/ReplaceUnsupportedIntrinsics/ReplaceUnsupportedIntrinsics.cpp
@@ -169,7 +169,7 @@ MemCpyInst *ReplaceUnsupportedIntrinsics::MemMoveToMemCpy(MemMoveInst *MM) {
Type *Tys[] = {Dst->getType(), Src->getType(), Size->getType()};
auto *M = MM->getParent()->getParent()->getParent();
- auto TheFn = Intrinsic::getDeclaration(M, Intrinsic::memcpy, Tys);
+ auto TheFn = Intrinsic::getOrInsertDeclaration(M, Intrinsic::memcpy, Tys);
return cast<MemCpyInst>(MemCpyInst::Create(TheFn, args));
}
@@ -471,8 +471,8 @@ void ReplaceUnsupportedIntrinsics::replaceMemcpy(IntrinsicInst *I) {
const uint32_t DstAS = MC->getDestAddressSpace();
LLVMContext &C = MC->getContext();
- Type *TySrcPtrI8 = Type::getInt8PtrTy(C, SrcAS);
- Type *TyDstPtrI8 = Type::getInt8PtrTy(C, DstAS);
+ Type *TySrcPtrI8 = PointerType::get(Type::getInt8Ty(C), SrcAS);
+ Type *TyDstPtrI8 = PointerType::get(Type::getInt8Ty(C), DstAS);
IGCLLVM::IRBuilder<> Builder(MC);
@@ -602,8 +602,8 @@ void ReplaceUnsupportedIntrinsics::replaceMemMove(IntrinsicInst *I) {
}
LLVMContext &C = MM->getContext();
- Type *TySrcPtrI8 = Type::getInt8PtrTy(C, SrcAS);
- Type *TyDstPtrI8 = Type::getInt8PtrTy(C, DstAS);
+ Type *TySrcPtrI8 = PointerType::get(Type::getInt8Ty(C), SrcAS);
+ Type *TyDstPtrI8 = PointerType::get(Type::getInt8Ty(C), DstAS);
auto *F = MM->getParent()->getParent();
@@ -758,7 +758,7 @@ void ReplaceUnsupportedIntrinsics::replaceMemset(IntrinsicInst *I) {
const uint32_t AS = MS->getDestAddressSpace();
LLVMContext &C = MS->getContext();
- Type *TyPtrI8 = Type::getInt8PtrTy(C, AS);
+ Type *TyPtrI8 = PointerType::get(Type::getInt8Ty(C), AS);
IGCLLVM::IRBuilder<> Builder(MS);
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/SetFastMathFlags/SetFastMathFlags.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/SetFastMathFlags/SetFastMathFlags.cpp
index b79f4fe..fbb0d90 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/SetFastMathFlags/SetFastMathFlags.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/SetFastMathFlags/SetFastMathFlags.cpp
@@ -120,7 +120,7 @@ bool SetFastMathFlags::setFlags(Function &F, FastMathFlags fmfs) {
}
StringRef DemangledNameRef = DemangledName;
- if (DemangledNameRef.equals(funcName)) {
+ if ((DemangledNameRef == funcName)) {
isUnoptimizedFunc = true;
break;
}
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/StackOverflowDetection/StackOverflowDetection.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/StackOverflowDetection/StackOverflowDetection.cpp
index fe4cc56..5d90e1c 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/StackOverflowDetection/StackOverflowDetection.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/StackOverflowDetection/StackOverflowDetection.cpp
@@ -46,8 +46,8 @@ bool StackOverflowDetectionPass::removeDummyCalls(Module &M) {
Function *callFunction = callI->getCalledFunction();
if (callFunction) {
auto callFunctionName = callFunction->getName();
- if (callFunctionName.startswith(STACK_OVERFLOW_INIT_BUILTIN_NAME) ||
- callFunctionName.startswith(STACK_OVERFLOW_DETECTION_BUILTIN_NAME)) {
+ if (callFunctionName.starts_with(STACK_OVERFLOW_INIT_BUILTIN_NAME) ||
+ callFunctionName.starts_with(STACK_OVERFLOW_DETECTION_BUILTIN_NAME)) {
ToDeleteInstructions.push_back(&I);
}
}
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/SubGroupFuncs/SubGroupFuncsResolution.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/SubGroupFuncs/SubGroupFuncsResolution.cpp
index 022f653..9c3f530 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/SubGroupFuncs/SubGroupFuncsResolution.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/SubGroupFuncs/SubGroupFuncsResolution.cpp
@@ -365,19 +365,19 @@ void SubGroupFuncsResolution::simdBlockRead(llvm::CallInst &CI, bool hasCacheCon
switch (scalarSizeInBits) {
case 8:
- types[1] = Type::getInt8PtrTy(C, AS);
+ types[1] = PointerType::get(Type::getInt8Ty(C), AS);
break;
case 16:
- types[1] = Type::getInt16PtrTy(C, AS);
+ types[1] = PointerType::get(Type::getInt16Ty(C), AS);
break;
case 64:
- types[1] = (Type::getInt64PtrTy(C, AS));
+ types[1] = (PointerType::get(Type::getInt64Ty(C), AS));
break;
default:
IGC_ASSERT_MESSAGE(0, "unrecognized bit width!");
// assertion failed but continue code failsafe using default 32
case 32:
- types[1] = (Type::getInt32PtrTy(C, AS));
+ types[1] = (PointerType::get(Type::getInt32Ty(C), AS));
break;
}
@@ -447,19 +447,19 @@ void SubGroupFuncsResolution::simdBlockWrite(llvm::CallInst &CI, bool hasCacheCo
switch (dataArg->getType()->getScalarType()->getScalarSizeInBits()) {
case 8:
- types.push_back(Type::getInt8PtrTy(C, AS));
+ types.push_back(PointerType::get(Type::getInt8Ty(C), AS));
break;
case 16:
- types.push_back(Type::getInt16PtrTy(C, AS));
+ types.push_back(PointerType::get(Type::getInt16Ty(C), AS));
break;
case 64:
- types.push_back(Type::getInt64PtrTy(C, AS));
+ types.push_back(PointerType::get(Type::getInt64Ty(C), AS));
break;
default:
IGC_ASSERT_MESSAGE(0, "unrecognized bit width!");
// assertion failed but continue code failsafe using default 32
case 32:
- types.push_back(Type::getInt32PtrTy(C, AS));
+ types.push_back(PointerType::get(Type::getInt32Ty(C), AS));
break;
}
@@ -565,7 +565,7 @@ void SubGroupFuncsResolution::visitCallInst(CallInst &CI) {
StringRef funcName = func->getName();
LLVMContext &Ctx = CI.getCalledFunction()->getContext();
- if (funcName.equals(SubGroupFuncsResolution::GET_MAX_SUB_GROUP_SIZE)) {
+ if ((funcName == SubGroupFuncsResolution::GET_MAX_SUB_GROUP_SIZE)) {
int32_t simdSize = GetSIMDSize(CI.getParent()->getParent());
if (simdSize == 8 || simdSize == 16 || simdSize == 32) {
auto *C = ConstantInt::get(Type::getInt32Ty(Ctx), simdSize);
@@ -579,7 +579,7 @@ void SubGroupFuncsResolution::visitCallInst(CallInst &CI) {
CI.replaceAllUsesWith(simdSize);
}
CI.eraseFromParent();
- } else if (funcName.equals(SubGroupFuncsResolution::GET_SUB_GROUP_LOCAL_ID)) {
+ } else if ((funcName == SubGroupFuncsResolution::GET_SUB_GROUP_LOCAL_ID)) {
// Creates intrinsics that will be lowered in the CodeGen and will handle the sub_group_local_id
IntegerType *typeInt32 = Type::getInt32Ty(Ctx);
@@ -591,13 +591,13 @@ void SubGroupFuncsResolution::visitCallInst(CallInst &CI) {
updateDebugLoc(&CI, simdLaneId);
CI.replaceAllUsesWith(simdLaneId);
CI.eraseFromParent();
- } else if (funcName.equals(SubGroupFuncsResolution::SUB_GROUP_SHUFFLE) ||
- funcName.equals(SubGroupFuncsResolution::SUB_GROUP_SHUFFLE_US) ||
- funcName.equals(SubGroupFuncsResolution::SUB_GROUP_SHUFFLE_F) ||
- funcName.equals(SubGroupFuncsResolution::SUB_GROUP_SHUFFLE_H) ||
- funcName.equals(SubGroupFuncsResolution::SUB_GROUP_SHUFFLE_C) ||
- funcName.equals(SubGroupFuncsResolution::SUB_GROUP_SHUFFLE_B) ||
- funcName.equals(SubGroupFuncsResolution::SUB_GROUP_SHUFFLE_DF)) {
+ } else if ((funcName == SubGroupFuncsResolution::SUB_GROUP_SHUFFLE) ||
+ (funcName == SubGroupFuncsResolution::SUB_GROUP_SHUFFLE_US) ||
+ (funcName == SubGroupFuncsResolution::SUB_GROUP_SHUFFLE_F) ||
+ (funcName == SubGroupFuncsResolution::SUB_GROUP_SHUFFLE_H) ||
+ (funcName == SubGroupFuncsResolution::SUB_GROUP_SHUFFLE_C) ||
+ (funcName == SubGroupFuncsResolution::SUB_GROUP_SHUFFLE_B) ||
+ (funcName == SubGroupFuncsResolution::SUB_GROUP_SHUFFLE_DF)) {
// Creates intrinsics that will be lowered in the CodeGen and will handle the sub_group_shuffle function
IRBuilder<> IRB(&CI);
Value *args[3];
@@ -611,13 +611,13 @@ void SubGroupFuncsResolution::visitCallInst(CallInst &CI) {
updateDebugLoc(&CI, simdShuffle);
CI.replaceAllUsesWith(simdShuffle);
CI.eraseFromParent();
- } else if (funcName.equals(SubGroupFuncsResolution::SUB_GROUP_BROADCAST) ||
- funcName.equals(SubGroupFuncsResolution::SUB_GROUP_BROADCAST_US) ||
- funcName.equals(SubGroupFuncsResolution::SUB_GROUP_BROADCAST_F) ||
- funcName.equals(SubGroupFuncsResolution::SUB_GROUP_BROADCAST_H) ||
- funcName.equals(SubGroupFuncsResolution::SUB_GROUP_BROADCAST_C) ||
- funcName.equals(SubGroupFuncsResolution::SUB_GROUP_BROADCAST_B) ||
- funcName.equals(SubGroupFuncsResolution::SUB_GROUP_BROADCAST_DF)) {
+ } else if ((funcName == SubGroupFuncsResolution::SUB_GROUP_BROADCAST) ||
+ (funcName == SubGroupFuncsResolution::SUB_GROUP_BROADCAST_US) ||
+ (funcName == SubGroupFuncsResolution::SUB_GROUP_BROADCAST_F) ||
+ (funcName == SubGroupFuncsResolution::SUB_GROUP_BROADCAST_H) ||
+ (funcName == SubGroupFuncsResolution::SUB_GROUP_BROADCAST_C) ||
+ (funcName == SubGroupFuncsResolution::SUB_GROUP_BROADCAST_B) ||
+ (funcName == SubGroupFuncsResolution::SUB_GROUP_BROADCAST_DF)) {
// Creates intrinsics that will be lowered in the CodeGen and will handle the sub_group_broadcast function
IRBuilder<> IRB(&CI);
Value *args[3];
@@ -631,13 +631,13 @@ void SubGroupFuncsResolution::visitCallInst(CallInst &CI) {
updateDebugLoc(&CI, simdBroadcast);
CI.replaceAllUsesWith(simdBroadcast);
CI.eraseFromParent();
- } else if (funcName.equals(SubGroupFuncsResolution::SUB_GROUP_CLUSTERED_BROADCAST) ||
- funcName.equals(SubGroupFuncsResolution::SUB_GROUP_CLUSTERED_BROADCAST_US) ||
- funcName.equals(SubGroupFuncsResolution::SUB_GROUP_CLUSTERED_BROADCAST_F) ||
- funcName.equals(SubGroupFuncsResolution::SUB_GROUP_CLUSTERED_BROADCAST_H) ||
- funcName.equals(SubGroupFuncsResolution::SUB_GROUP_CLUSTERED_BROADCAST_C) ||
- funcName.equals(SubGroupFuncsResolution::SUB_GROUP_CLUSTERED_BROADCAST_B) ||
- funcName.equals(SubGroupFuncsResolution::SUB_GROUP_CLUSTERED_BROADCAST_DF)) {
+ } else if ((funcName == SubGroupFuncsResolution::SUB_GROUP_CLUSTERED_BROADCAST) ||
+ (funcName == SubGroupFuncsResolution::SUB_GROUP_CLUSTERED_BROADCAST_US) ||
+ (funcName == SubGroupFuncsResolution::SUB_GROUP_CLUSTERED_BROADCAST_F) ||
+ (funcName == SubGroupFuncsResolution::SUB_GROUP_CLUSTERED_BROADCAST_H) ||
+ (funcName == SubGroupFuncsResolution::SUB_GROUP_CLUSTERED_BROADCAST_C) ||
+ (funcName == SubGroupFuncsResolution::SUB_GROUP_CLUSTERED_BROADCAST_B) ||
+ (funcName == SubGroupFuncsResolution::SUB_GROUP_CLUSTERED_BROADCAST_DF)) {
// Creates intrinsics that will be lowered in the CodeGen and will handle the sub_group_clustered_broadcast function
IRBuilder<> IRB(&CI);
Value *args[4];
@@ -662,9 +662,9 @@ void SubGroupFuncsResolution::visitCallInst(CallInst &CI) {
updateDebugLoc(&CI, simdClusteredBroadcast);
CI.replaceAllUsesWith(simdClusteredBroadcast);
CI.eraseFromParent();
- } else if (funcName.equals(SubGroupFuncsResolution::SUB_GROUP_SHUFFLE_DOWN) ||
- funcName.equals(SubGroupFuncsResolution::SUB_GROUP_SHUFFLE_DOWN_US) ||
- funcName.equals(SubGroupFuncsResolution::SUB_GROUP_SHUFFLE_DOWN_UC)) {
+ } else if ((funcName == SubGroupFuncsResolution::SUB_GROUP_SHUFFLE_DOWN) ||
+ (funcName == SubGroupFuncsResolution::SUB_GROUP_SHUFFLE_DOWN_US) ||
+ (funcName == SubGroupFuncsResolution::SUB_GROUP_SHUFFLE_DOWN_UC)) {
// Creates intrinsics that will be lowered in the CodeGen and will handle the sub_group_shuffle_down function
Value *args[3];
args[0] = CI.getArgOperand(0);
@@ -677,133 +677,133 @@ void SubGroupFuncsResolution::visitCallInst(CallInst &CI) {
updateDebugLoc(&CI, simdShuffleDown);
CI.replaceAllUsesWith(simdShuffleDown);
CI.eraseFromParent();
- } else if (funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_1_GBL) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_2_GBL) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_4_GBL) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_8_GBL) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_1_GBL_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_2_GBL_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_4_GBL_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_8_GBL_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_16_GBL_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_1_GBL_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_2_GBL_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_4_GBL_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_8_GBL_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_16_GBL_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_1_GBL_L) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_2_GBL_L) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_4_GBL_L) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_8_GBL_L)) {
+ } else if ((funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_1_GBL) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_2_GBL) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_4_GBL) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_8_GBL) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_1_GBL_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_2_GBL_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_4_GBL_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_8_GBL_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_16_GBL_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_1_GBL_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_2_GBL_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_4_GBL_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_8_GBL_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_16_GBL_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_1_GBL_L) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_2_GBL_L) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_4_GBL_L) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_8_GBL_L)) {
CheckSIMDSize(CI, "Block reads not supported in SIMD32");
simdBlockRead(CI);
- } else if (funcName.startswith("__builtin_IB_cache_controls_simd_block_read")) {
+ } else if (funcName.starts_with("__builtin_IB_cache_controls_simd_block_read")) {
CheckSIMDSize(CI, "Block reads not supported in SIMD32");
simdBlockRead(CI, true);
- } else if (funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_1_GBL) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_2_GBL) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_4_GBL) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_8_GBL) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_1_GBL_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_2_GBL_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_4_GBL_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_8_GBL_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_16_GBL_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_1_GBL_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_2_GBL_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_4_GBL_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_8_GBL_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_16_GBL_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_1_GBL_L) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_2_GBL_L) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_4_GBL_L) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_8_GBL_L)) {
+ } else if ((funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_1_GBL) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_2_GBL) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_4_GBL) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_8_GBL) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_1_GBL_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_2_GBL_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_4_GBL_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_8_GBL_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_16_GBL_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_1_GBL_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_2_GBL_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_4_GBL_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_8_GBL_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_16_GBL_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_1_GBL_L) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_2_GBL_L) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_4_GBL_L) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_8_GBL_L)) {
CheckSIMDSize(CI, "Block writes not supported in SIMD32");
simdBlockWrite(CI);
- } else if (funcName.startswith("__builtin_IB_cache_controls_simd_block_write")) {
+ } else if (funcName.starts_with("__builtin_IB_cache_controls_simd_block_write")) {
CheckSIMDSize(CI, "Block writes not supported in SIMD32");
simdBlockWrite(CI, true);
- } else if (funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_1_LCL) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_2_LCL) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_4_LCL) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_8_LCL) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_1_LCL_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_2_LCL_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_4_LCL_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_8_LCL_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_16_LCL_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_1_LCL_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_2_LCL_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_4_LCL_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_8_LCL_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_16_LCL_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_1_LCL_L) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_2_LCL_L) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_4_LCL_L) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_READ_8_LCL_L)) {
+ } else if ((funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_1_LCL) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_2_LCL) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_4_LCL) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_8_LCL) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_1_LCL_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_2_LCL_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_4_LCL_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_8_LCL_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_16_LCL_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_1_LCL_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_2_LCL_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_4_LCL_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_8_LCL_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_16_LCL_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_1_LCL_L) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_2_LCL_L) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_4_LCL_L) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_READ_8_LCL_L)) {
CheckSIMDSize(CI, "Block reads not supported in SIMD32");
simdBlockRead(CI);
- } else if (funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_1_LCL) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_2_LCL) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_4_LCL) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_8_LCL) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_1_LCL_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_2_LCL_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_4_LCL_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_8_LCL_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_16_LCL_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_1_LCL_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_2_LCL_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_4_LCL_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_8_LCL_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_16_LCL_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_1_LCL_L) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_2_LCL_L) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_4_LCL_L) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_BLOCK_WRITE_8_LCL_L)) {
+ } else if ((funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_1_LCL) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_2_LCL) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_4_LCL) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_8_LCL) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_1_LCL_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_2_LCL_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_4_LCL_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_8_LCL_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_16_LCL_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_1_LCL_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_2_LCL_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_4_LCL_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_8_LCL_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_16_LCL_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_1_LCL_L) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_2_LCL_L) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_4_LCL_L) ||
+ (funcName == SubGroupFuncsResolution::SIMD_BLOCK_WRITE_8_LCL_L)) {
CheckSIMDSize(CI, "Block writes not supported in SIMD32");
simdBlockWrite(CI);
- } else if (funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_1) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_2) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_4) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_8) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_1_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_2_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_4_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_8_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_16_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_1_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_2_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_4_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_8_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_16_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_1_L) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_2_L) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_4_L) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_8_L)) {
+ } else if ((funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_1) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_2) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_4) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_8) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_1_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_2_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_4_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_8_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_16_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_1_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_2_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_4_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_8_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_16_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_1_L) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_2_L) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_4_L) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_READ_8_L)) {
CheckSIMDSize(CI, "SIMD Media Block Read not supported in SIMD32");
mediaBlockRead(CI);
- } else if (funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_1) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_2) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_4) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_8) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_1_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_2_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_4_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_8_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_16_B) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_1_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_2_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_4_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_8_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_16_H) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_1_L) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_2_L) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_4_L) ||
- funcName.equals(SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_8_L)) {
+ } else if ((funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_1) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_2) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_4) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_8) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_1_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_2_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_4_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_8_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_16_B) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_1_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_2_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_4_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_8_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_16_H) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_1_L) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_2_L) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_4_L) ||
+ (funcName == SubGroupFuncsResolution::SIMD_MEDIA_BLOCK_WRITE_8_L)) {
CheckSIMDSize(CI, "SIMD Media Block Write not supported in SIMD32");
mediaBlockWrite(CI);
- } else if (funcName.startswith(SubGroupFuncsResolution::MEDIA_BLOCK_READ)) {
+ } else if (funcName.starts_with(SubGroupFuncsResolution::MEDIA_BLOCK_READ)) {
// Creates intrinsics that will be lowered in the CodeGen and will handle the media_block_read
SmallVector<Value *, 5> args;
@@ -846,7 +846,7 @@ void SubGroupFuncsResolution::visitCallInst(CallInst &CI) {
CI.replaceAllUsesWith(MediaBlockRead);
CI.eraseFromParent();
- } else if (funcName.startswith(SubGroupFuncsResolution::MEDIA_BLOCK_WRITE)) {
+ } else if (funcName.starts_with(SubGroupFuncsResolution::MEDIA_BLOCK_WRITE)) {
// Creates intrinsics that will be lowered in the CodeGen and will handle the media_block_write
SmallVector<Value *, 5> args;
@@ -890,7 +890,7 @@ void SubGroupFuncsResolution::visitCallInst(CallInst &CI) {
CI.replaceAllUsesWith(MediaBlockWrite);
CI.eraseFromParent();
- } else if (funcName.equals(SubGroupFuncsResolution::MEDIA_BLOCK_RECTANGLE_READ)) {
+ } else if ((funcName == SubGroupFuncsResolution::MEDIA_BLOCK_RECTANGLE_READ)) {
// Creates intrinsics that will be lowered in the CodeGen and will handle the simd_media_block_read_8
SmallVector<Value *, 5> args;
pushMediaBlockArgs(args, CI);
@@ -905,7 +905,7 @@ void SubGroupFuncsResolution::visitCallInst(CallInst &CI) {
updateDebugLoc(&CI, MediaBlockRectangleRead);
CI.replaceAllUsesWith(MediaBlockRectangleRead);
CI.eraseFromParent();
- } else if (funcName.equals(SubGroupFuncsResolution::GET_IMAGE_BTI)) {
+ } else if ((funcName == SubGroupFuncsResolution::GET_IMAGE_BTI)) {
if (m_argIndexMap.empty()) {
BTIHelper(CI);
}
@@ -915,15 +915,15 @@ void SubGroupFuncsResolution::visitCallInst(CallInst &CI) {
CI.replaceAllUsesWith(imageIndex);
CI.eraseFromParent();
- } else if (funcName.startswith(SubGroupFuncsResolution::SUB_GROUP_REDUCE)) {
+ } else if (funcName.starts_with(SubGroupFuncsResolution::SUB_GROUP_REDUCE)) {
return subGroupArithmetic(CI, GetWaveOp(funcName), GroupOperationReduce);
- } else if (funcName.startswith(SubGroupFuncsResolution::SUB_GROUP_SCAN)) {
+ } else if (funcName.starts_with(SubGroupFuncsResolution::SUB_GROUP_SCAN)) {
return subGroupArithmetic(CI, GetWaveOp(funcName), GroupOperationScan);
- } else if (funcName.startswith(SubGroupFuncsResolution::SUB_GROUP_CLUSTERED_REDUCE)) {
+ } else if (funcName.starts_with(SubGroupFuncsResolution::SUB_GROUP_CLUSTERED_REDUCE)) {
return subGroupArithmetic(CI, GetWaveOp(funcName), GroupOperationClusteredReduce);
- } else if (funcName.startswith(SubGroupFuncsResolution::SUB_GROUP_CLUSTERED_SCAN)) {
+ } else if (funcName.starts_with(SubGroupFuncsResolution::SUB_GROUP_CLUSTERED_SCAN)) {
return subGroupArithmetic(CI, GetWaveOp(funcName), GroupOperationClusteredScan);
- } else if (funcName.startswith(SubGroupFuncsResolution::SUB_GROUP_BARRIER)) {
+ } else if (funcName.starts_with(SubGroupFuncsResolution::SUB_GROUP_BARRIER)) {
ModuleMetaData *modMD = getAnalysis<MetaDataUtilsWrapper>().getModuleMetaData();
// Subgroup barrier is a no-op in HW.
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/TransformUnmaskedFunctionsPass/TransformUnmaskedFunctionsPass.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/TransformUnmaskedFunctionsPass/TransformUnmaskedFunctionsPass.cpp
index c98a2d2..7d8583e 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/TransformUnmaskedFunctionsPass/TransformUnmaskedFunctionsPass.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/TransformUnmaskedFunctionsPass/TransformUnmaskedFunctionsPass.cpp
@@ -13,6 +13,7 @@ SPDX-License-Identifier: MIT
#include "Compiler/Optimizer/OpenCLPasses/TransformUnmaskedFunctionsPass/TransformUnmaskedFunctionsPass.h"
#include "llvmWrapper/Transforms/Utils/Cloning.h"
#include "Probe/Assertion.h"
+#include "common/LLVMUtils.h"
#include "common/LLVMWarningsPush.hpp"
#include "llvm/IR/Module.h"
@@ -52,7 +53,7 @@ static void annotateUnmaskedCallSite(CallInst *CI) {
Function *unmaskedEnd = GenISAIntrinsic::getDeclaration(M, GenISAIntrinsic::GenISA_UnmaskedRegionEnd);
builder.CreateCall(unmaskedBegin);
- builder.SetInsertPoint(CI->getNextNonDebugInstruction());
+ builder.SetInsertPoint(getNextNonDbgInstruction(CI));
builder.CreateCall(unmaskedEnd);
}
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/UndefinedReferences/UndefinedReferencesPass.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/UndefinedReferences/UndefinedReferencesPass.cpp
index a9c9530..8ae6ac9 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/UndefinedReferences/UndefinedReferencesPass.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/UndefinedReferences/UndefinedReferencesPass.cpp
@@ -82,10 +82,10 @@ static bool ExistUndefinedReferencesInModule(Module &module, CodeGenContext *CGC
for (auto &F : module) {
if (F.isDeclaration() && !F.isIntrinsic() && !GenISAIntrinsic::isIntrinsic(&F) && F.hasNUsesOrMore(1)) {
StringRef funcName = F.getName();
- if (!funcName.startswith("__builtin_IB") && funcName != "printf" &&
- !Regex("^_Z[0-9]+__builtin_bf16").match(funcName) && !funcName.startswith("__igcbuiltin_") &&
- !funcName.startswith("__translate_sampler_initializer") && !funcName.startswith("_Z20__spirv_SampledImage") &&
- !funcName.startswith("_Z21__spirv_VmeImageINTEL") &&
+ if (!funcName.starts_with("__builtin_IB") && funcName != "printf" &&
+ !Regex("^_Z[0-9]+__builtin_bf16").match(funcName) && !funcName.starts_with("__igcbuiltin_") &&
+ !funcName.starts_with("__translate_sampler_initializer") && !funcName.starts_with("_Z20__spirv_SampledImage") &&
+ !funcName.starts_with("_Z21__spirv_VmeImageINTEL") &&
funcName != BufferBoundsCheckingPatcher::BUFFER_SIZE_PLACEHOLDER_FUNCTION_NAME &&
!F.hasFnAttribute("referenced-indirectly")) {
ReportUndefinedReference(CGC, funcName, &F);
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/WGFuncs/WGFuncResolution.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/WGFuncs/WGFuncResolution.cpp
index e3b0cf5..716ecae 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/WGFuncs/WGFuncResolution.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/WGFuncs/WGFuncResolution.cpp
@@ -47,7 +47,7 @@ void WGFuncResolution::visitCallInst(CallInst &callInst) {
return;
}
StringRef funcName = pCalledFunc->getName();
- if (funcName.startswith("__builtin_IB_work_group_any")) {
+ if (funcName.starts_with("__builtin_IB_work_group_any")) {
SmallVector<Value *, 1> args;
args.push_back(callInst.getOperand(0));
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/WIFuncs/WIFuncResolution.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/WIFuncs/WIFuncResolution.cpp
index 5bb9cef..4f560f4 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/WIFuncs/WIFuncResolution.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/WIFuncs/WIFuncResolution.cpp
@@ -107,41 +107,41 @@ void WIFuncResolution::visitCallInst(CallInst &CI) {
// Add appropriate sequence and handle out of range where needed
StringRef funcName = CI.getCalledFunction()->getName();
- if (funcName.equals(WIFuncsAnalysis::GET_LOCAL_ID_X)) {
+ if ((funcName == WIFuncsAnalysis::GET_LOCAL_ID_X)) {
wiRes = getLocalId(CI, ImplicitArg::LOCAL_ID_X);
- } else if (funcName.equals(WIFuncsAnalysis::GET_LOCAL_ID_Y)) {
+ } else if ((funcName == WIFuncsAnalysis::GET_LOCAL_ID_Y)) {
wiRes = getLocalId(CI, ImplicitArg::LOCAL_ID_Y);
- } else if (funcName.equals(WIFuncsAnalysis::GET_LOCAL_ID_Z)) {
+ } else if ((funcName == WIFuncsAnalysis::GET_LOCAL_ID_Z)) {
wiRes = getLocalId(CI, ImplicitArg::LOCAL_ID_Z);
- } else if (funcName.equals(WIFuncsAnalysis::GET_GROUP_ID)) {
+ } else if ((funcName == WIFuncsAnalysis::GET_GROUP_ID)) {
wiRes = getGroupId(CI);
- } else if (funcName.equals(WIFuncsAnalysis::GET_LOCAL_THREAD_ID)) {
+ } else if ((funcName == WIFuncsAnalysis::GET_LOCAL_THREAD_ID)) {
wiRes = getLocalThreadId(CI);
- } else if (funcName.equals(WIFuncsAnalysis::GET_GLOBAL_SIZE)) {
+ } else if ((funcName == WIFuncsAnalysis::GET_GLOBAL_SIZE)) {
wiRes = getGlobalSize(CI);
- } else if (funcName.equals(WIFuncsAnalysis::GET_LOCAL_SIZE)) {
+ } else if ((funcName == WIFuncsAnalysis::GET_LOCAL_SIZE)) {
wiRes = getLocalSize(CI);
- } else if (funcName.equals(WIFuncsAnalysis::GET_ENQUEUED_LOCAL_SIZE)) {
+ } else if ((funcName == WIFuncsAnalysis::GET_ENQUEUED_LOCAL_SIZE)) {
wiRes = getEnqueuedLocalSize(CI);
- } else if (funcName.equals(WIFuncsAnalysis::GET_GLOBAL_OFFSET)) {
+ } else if ((funcName == WIFuncsAnalysis::GET_GLOBAL_OFFSET)) {
wiRes = getGlobalOffset(CI);
- } else if (funcName.equals(WIFuncsAnalysis::GET_WORK_DIM)) {
+ } else if ((funcName == WIFuncsAnalysis::GET_WORK_DIM)) {
wiRes = getWorkDim(CI);
- } else if (funcName.equals(WIFuncsAnalysis::GET_NUM_GROUPS)) {
+ } else if ((funcName == WIFuncsAnalysis::GET_NUM_GROUPS)) {
wiRes = getNumGroups(CI);
- } else if (funcName.equals(WIFuncsAnalysis::GET_STAGE_IN_GRID_ORIGIN)) {
+ } else if ((funcName == WIFuncsAnalysis::GET_STAGE_IN_GRID_ORIGIN)) {
wiRes = getStageInGridOrigin(CI);
- } else if (funcName.equals(WIFuncsAnalysis::GET_STAGE_IN_GRID_SIZE)) {
+ } else if ((funcName == WIFuncsAnalysis::GET_STAGE_IN_GRID_SIZE)) {
wiRes = getStageInGridSize(CI);
- } else if (funcName.equals(WIFuncsAnalysis::GET_SYNC_BUFFER)) {
+ } else if ((funcName == WIFuncsAnalysis::GET_SYNC_BUFFER)) {
wiRes = getSyncBufferPtr(CI);
- } else if (funcName.equals(WIFuncsAnalysis::GET_ASSERT_BUFFER)) {
+ } else if ((funcName == WIFuncsAnalysis::GET_ASSERT_BUFFER)) {
wiRes = getAssertBufferPtr(CI);
- } else if (funcName.equals(WIFuncsAnalysis::GET_REGION_GROUP_SIZE)) {
+ } else if ((funcName == WIFuncsAnalysis::GET_REGION_GROUP_SIZE)) {
wiRes = getRegionGroupSize(CI);
- } else if (funcName.equals(WIFuncsAnalysis::GET_REGION_GROUP_WG_COUNT)) {
+ } else if ((funcName == WIFuncsAnalysis::GET_REGION_GROUP_WG_COUNT)) {
wiRes = getRegionGroupWGCount(CI);
- } else if (funcName.equals(WIFuncsAnalysis::GET_REGION_GROUP_BARRIER_BUFFER)) {
+ } else if ((funcName == WIFuncsAnalysis::GET_REGION_GROUP_BARRIER_BUFFER)) {
wiRes = getRegionGroupBarrierBufferPtr(CI);
} else {
// Non WI function, do nothing
@@ -884,7 +884,7 @@ void LowerImplicitArgIntrinsics::visitCallInst(CallInst &CI) {
}
// Load data
- auto Int16Ptr = Type::getInt16PtrTy(F->getContext(), ADDRESS_SPACE_GLOBAL);
+ auto Int16Ptr = PointerType::get(Type::getInt16Ty(F->getContext()), ADDRESS_SPACE_GLOBAL);
auto Addr = Builder.CreateIntToPtr(Result, Int16Ptr);
auto LoadInst = Builder.CreateLoad(Builder.getInt16Ty(), Addr);
auto Trunc = Builder.CreateZExtOrBitCast(LoadInst, CI.getType());
diff --git a/IGC/Compiler/Optimizer/OpenCLPasses/WIFuncs/WIFuncsAnalysis.cpp b/IGC/Compiler/Optimizer/OpenCLPasses/WIFuncs/WIFuncsAnalysis.cpp
index 5aba647..0e85462 100644
--- a/IGC/Compiler/Optimizer/OpenCLPasses/WIFuncs/WIFuncsAnalysis.cpp
+++ b/IGC/Compiler/Optimizer/OpenCLPasses/WIFuncs/WIFuncsAnalysis.cpp
@@ -204,37 +204,37 @@ void WIFuncsAnalysis::visitCallInst(CallInst &CI) {
// Check for OpenCL WI function calls
StringRef funcName = F->getName();
- if (funcName.equals(GET_LOCAL_ID_X) || funcName.equals(GET_LOCAL_ID_Y) || funcName.equals(GET_LOCAL_ID_Z)) {
+ if ((funcName == GET_LOCAL_ID_X) || (funcName == GET_LOCAL_ID_Y) || (funcName == GET_LOCAL_ID_Z)) {
m_hasLocalID = true;
- } else if (funcName.equals(GET_GROUP_ID)) {
+ } else if ((funcName == GET_GROUP_ID)) {
m_hasGroupID = true;
- } else if (funcName.equals(GET_LOCAL_THREAD_ID)) {
+ } else if ((funcName == GET_LOCAL_THREAD_ID)) {
m_hasLocalThreadID = true;
- } else if (funcName.equals(WIFuncsAnalysis::GET_GLOBAL_OFFSET)) {
+ } else if ((funcName == WIFuncsAnalysis::GET_GLOBAL_OFFSET)) {
m_hasGlobalOffset = true;
- } else if (funcName.equals(GET_GLOBAL_SIZE)) {
+ } else if ((funcName == GET_GLOBAL_SIZE)) {
m_hasGlobalSize = true;
- } else if (funcName.equals(GET_LOCAL_SIZE)) {
+ } else if ((funcName == GET_LOCAL_SIZE)) {
m_hasLocalSize = true;
- } else if (funcName.equals(GET_WORK_DIM)) {
+ } else if ((funcName == GET_WORK_DIM)) {
m_hasWorkDim = true;
- } else if (funcName.equals(GET_NUM_GROUPS)) {
+ } else if ((funcName == GET_NUM_GROUPS)) {
m_hasNumGroups = true;
- } else if (funcName.equals(GET_ENQUEUED_LOCAL_SIZE)) {
+ } else if ((funcName == GET_ENQUEUED_LOCAL_SIZE)) {
m_hasEnqueuedLocalSize = true;
- } else if (funcName.equals(GET_STAGE_IN_GRID_ORIGIN)) {
+ } else if ((funcName == GET_STAGE_IN_GRID_ORIGIN)) {
m_hasStageInGridOrigin = true;
- } else if (funcName.equals(GET_STAGE_IN_GRID_SIZE)) {
+ } else if ((funcName == GET_STAGE_IN_GRID_SIZE)) {
m_hasStageInGridSize = true;
- } else if (funcName.equals(GET_SYNC_BUFFER)) {
+ } else if ((funcName == GET_SYNC_BUFFER)) {
m_hasSyncBuffer = true;
- } else if (funcName.equals(GET_ASSERT_BUFFER)) {
+ } else if ((funcName == GET_ASSERT_BUFFER)) {
m_hasAssertBuffer = true;
- } else if (funcName.equals(GET_REGION_GROUP_SIZE)) {
+ } else if ((funcName == GET_REGION_GROUP_SIZE)) {
m_hasRegionGroupSize = true;
- } else if (funcName.equals(GET_REGION_GROUP_WG_COUNT)) {
+ } else if ((funcName == GET_REGION_GROUP_WG_COUNT)) {
m_hasRegionGroupWGCount = true;
- } else if (funcName.equals(GET_REGION_GROUP_BARRIER_BUFFER)) {
+ } else if ((funcName == GET_REGION_GROUP_BARRIER_BUFFER)) {
m_hasRegionGroupBarrierBuffer = true;
}
}
diff --git a/IGC/Compiler/Optimizer/PreCompiledFuncImport.cpp b/IGC/Compiler/Optimizer/PreCompiledFuncImport.cpp
index 6b032b2..c0bffb2 100644
--- a/IGC/Compiler/Optimizer/PreCompiledFuncImport.cpp
+++ b/IGC/Compiler/Optimizer/PreCompiledFuncImport.cpp
@@ -579,23 +579,23 @@ bool PreCompiledFuncImport::runOnModule(Module &M) {
for (auto &I : BB) {
if (CallInst *CI = dyn_cast<CallInst>(&I)) {
if (Function *calledFunc = CI->getCalledFunction()) {
- if (calledFunc->getName().startswith("GenISA_fma_rtz")) {
+ if (calledFunc->getName().starts_with("GenISA_fma_rtz")) {
createIntrinsicCall(CI, GenISAIntrinsic::GenISA_fma_rtz);
- } else if (calledFunc->getName().startswith("GenISA_fma_rtp")) {
+ } else if (calledFunc->getName().starts_with("GenISA_fma_rtp")) {
createIntrinsicCall(CI, GenISAIntrinsic::GenISA_fma_rtp);
- } else if (calledFunc->getName().startswith("GenISA_fma_rtn")) {
+ } else if (calledFunc->getName().starts_with("GenISA_fma_rtn")) {
createIntrinsicCall(CI, GenISAIntrinsic::GenISA_fma_rtn);
- } else if (calledFunc->getName().startswith("GenISA_add_rte")) {
+ } else if (calledFunc->getName().starts_with("GenISA_add_rte")) {
createIntrinsicCall(CI, GenISAIntrinsic::GenISA_add_rte);
- } else if (calledFunc->getName().startswith("GenISA_add_rtz")) {
+ } else if (calledFunc->getName().starts_with("GenISA_add_rtz")) {
createIntrinsicCall(CI, GenISAIntrinsic::GenISA_add_rtz);
- } else if (calledFunc->getName().startswith("GenISA_add_rtn")) {
+ } else if (calledFunc->getName().starts_with("GenISA_add_rtn")) {
createIntrinsicCall(CI, GenISAIntrinsic::GenISA_add_rtn);
- } else if (calledFunc->getName().startswith("GenISA_add_rtp")) {
+ } else if (calledFunc->getName().starts_with("GenISA_add_rtp")) {
createIntrinsicCall(CI, GenISAIntrinsic::GenISA_add_rtp);
- } else if (calledFunc->getName().startswith("GenISA_mul_rtz")) {
+ } else if (calledFunc->getName().starts_with("GenISA_mul_rtz")) {
createIntrinsicCall(CI, GenISAIntrinsic::GenISA_mul_rtz);
- } else if (calledFunc->getName().startswith("GenISA_uitof_rtz")) {
+ } else if (calledFunc->getName().starts_with("GenISA_uitof_rtz")) {
createIntrinsicCall(CI, GenISAIntrinsic::GenISA_uitof_rtz);
}
}
@@ -800,23 +800,23 @@ PreCompiledFuncImport::ImportedFunction::ImportedFunction(Function *F)
// Get type of imported function.
StringRef name = F->getName();
- if (name.equals("__igcbuiltin_dp_div_nomadm_ieee") || name.equals("__igcbuiltin_dp_div_nomadm_fast") ||
- name.equals("__igcbuiltin_dp_sqrt_nomadm_ieee") || name.equals("__igcbuiltin_dp_sqrt_nomadm_fast")) {
+ if (name == "__igcbuiltin_dp_div_nomadm_ieee" || name == "__igcbuiltin_dp_div_nomadm_fast" ||
+ name == "__igcbuiltin_dp_sqrt_nomadm_ieee" || name == "__igcbuiltin_dp_sqrt_nomadm_fast") {
type = EmuType::FASTDP;
- } else if (name.equals("__igcbuiltin_dp_add") || name.equals("__igcbuiltin_dp_sub") ||
- name.equals("__igcbuiltin_dp_fma") || name.equals("__igcbuiltin_dp_mul") ||
- name.equals("__igcbuiltin_dp_div") || name.equals("__igcbuiltin_dp_cmp") ||
- name.equals("__igcbuiltin_dp_to_int32") || name.equals("__igcbuiltin_dp_to_uint32") ||
- name.equals("__igcbuiltin_int32_to_dp") || name.equals("__igcbuiltin_uint32_to_dp") ||
- name.equals("__igcbuiltin_dp_to_sp") || name.equals("__igcbuiltin_sp_to_dp") ||
- name.equals("__igcbuiltin_dp_sqrt")) {
+ } else if (name == "__igcbuiltin_dp_add" || name == "__igcbuiltin_dp_sub" ||
+ name == "__igcbuiltin_dp_fma" || name == "__igcbuiltin_dp_mul" ||
+ name == "__igcbuiltin_dp_div" || name == "__igcbuiltin_dp_cmp" ||
+ name == "__igcbuiltin_dp_to_int32" || name == "__igcbuiltin_dp_to_uint32" ||
+ name == "__igcbuiltin_int32_to_dp" || name == "__igcbuiltin_uint32_to_dp" ||
+ name == "__igcbuiltin_dp_to_sp" || name == "__igcbuiltin_sp_to_dp" ||
+ name == "__igcbuiltin_dp_sqrt") {
// If true, it is a slow version of DP emu functions. Those functions
// are the original ones for just passing conformance, not for perf.
type = EmuType::SLOWDP;
} else {
for (int i = 0; i < NUM_FUNCTIONS && type == EmuType::OTHER; ++i) {
for (int j = 0; j < NUM_TYPES && type == EmuType::OTHER; ++j) {
- if (name.equals(m_Int64SpDivRemFunctionNames[i][j]) || name.equals(m_Int64DpDivRemFunctionNames[i][j])) {
+ if (name == m_Int64SpDivRemFunctionNames[i][j] || name == m_Int64DpDivRemFunctionNames[i][j]) {
type = EmuType::INT64;
}
}
@@ -1032,7 +1032,7 @@ void PreCompiledFuncImport::processInt32Divide(BinaryOperator &inst, Int32Emulat
Function *func = m_pModule->getFunction(funcName);
Type *intTy = Type::getInt32Ty(inst.getContext());
- Type *intPtrTy = Type::getInt32PtrTy(inst.getContext());
+ Type *intPtrTy = PointerType::get(Type::getInt32Ty(inst.getContext()), 0);
// Try to look up the function in the module's symbol
// table first, else add it.
@@ -1800,7 +1800,7 @@ void PreCompiledFuncImport::visitCallInst(llvm::CallInst &I) {
StringRef fName = func->getName();
for (int FID = 0; FID < NUM_FUNCTION_IDS; ++FID) {
const PreCompiledFuncInfo &finfo = m_functionInfos[FID];
- if (fName.equals(finfo.FuncName)) {
+ if (fName == finfo.FuncName) {
m_libModuleToBeImported[finfo.LibModID] = true;
m_changed = true;
diff --git a/IGC/Compiler/Optimizer/Scalarizer.cpp b/IGC/Compiler/Optimizer/Scalarizer.cpp
index cbf0121..a2dff5a 100644
--- a/IGC/Compiler/Optimizer/Scalarizer.cpp
+++ b/IGC/Compiler/Optimizer/Scalarizer.cpp
@@ -872,7 +872,7 @@ void ScalarizeFunction::ScalarizeIntrinsic(IntrinsicInst &II) {
for (unsigned j = 0; j < NumOperands; j++)
ScalarOperands[j] = Operands[j][i];
- auto *ScalarIntr = CallInst::Create(Intrinsic::getDeclaration(II.getModule(), II.getIntrinsicID(), {ScalarType}),
+ auto *ScalarIntr = CallInst::Create(Intrinsic::getOrInsertDeclaration(II.getModule(), II.getIntrinsicID(), {ScalarType}),
ScalarOperands, II.getName() + ".scalar", &II);
ScalarIntr->copyMetadata(II);
NewScalarizedInsts[i] = ScalarIntr;
diff --git a/IGC/Compiler/SPIRMetaDataTranslation.cpp b/IGC/Compiler/SPIRMetaDataTranslation.cpp
index d400ccc..70b0c4d 100644
--- a/IGC/Compiler/SPIRMetaDataTranslation.cpp
+++ b/IGC/Compiler/SPIRMetaDataTranslation.cpp
@@ -115,7 +115,7 @@ bool SPIRMetaDataTranslation::runOnModule(Module &M) {
// check compiler options
for (auto i = spirMDUtils.getCompilerOptionsItem(0)->begin(), e = spirMDUtils.getCompilerOptionsItem(0)->end();
i != e; ++i) {
- if (StringRef(*i).startswith("-cl-std=CL") && i->length() >= 13) {
+ if (StringRef(*i).starts_with("-cl-std=CL") && i->length() >= 13) {
oclMajor = i->at(10) - '0';
oclMinor = i->at(12) - '0';
break;
diff --git a/IGC/Compiler/WorkaroundAnalysisPass.cpp b/IGC/Compiler/WorkaroundAnalysisPass.cpp
index 27c2638..557eb1c 100644
--- a/IGC/Compiler/WorkaroundAnalysisPass.cpp
+++ b/IGC/Compiler/WorkaroundAnalysisPass.cpp
@@ -589,7 +589,7 @@ void WAFMinFMax::visitCallInst(CallInst &I) {
m_builder->SetInsertPoint(&I);
IGCLLVM::Intrinsic IID = Intrinsic::minnum;
- Function *IFunc = Intrinsic::getDeclaration(I.getParent()->getParent()->getParent(), IID, I.getType());
+ Function *IFunc = Intrinsic::getOrInsertDeclaration(I.getParent()->getParent()->getParent(), IID, I.getType());
Value *QNaN = getQNaN(I.getType());
Value *src0 = I.getOperand(0);
diff --git a/IGC/DebugInfo/CMakeLists.txt b/IGC/DebugInfo/CMakeLists.txt
index 814f9be..6bf7776 100644
--- a/IGC/DebugInfo/CMakeLists.txt
+++ b/IGC/DebugInfo/CMakeLists.txt
@@ -1,36 +1,38 @@
-#=========================== begin_copyright_notice ============================
-#
-# Copyright (C) 2020-2023 Intel Corporation
-#
-# SPDX-License-Identifier: MIT
-#
-#============================ end_copyright_notice =============================
+include_directories("${CMAKE_CURRENT_SOURCE_DIR}")
+include_directories("${IGC_BUILD__IGC_BIN_DIR}/Release")
+include_directories("${IGC_OPTION__OUTPUT_DIR}/${IGC_CMAKE_CFG_INTDIR}")
-set(DEBUG_INFO_LIBRARY_SOURCES
- StreamEmitter.cpp
- DIE.cpp
- DwarfCompileUnit.cpp
- DwarfExpression.cpp
- LexicalScopes.cpp
- DwarfDebug.cpp
- VISADebugInfo.cpp
- VISADebugEmitter.cpp
- VISADebugDecoder.cpp
- VISAModule.cpp
-)
+set(IGC_BUILD__SRC__DebugInfo
+ "${CMAKE_CURRENT_SOURCE_DIR}/DIE.cpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/DwarfCompileUnit.cpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/DwarfDebug.cpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/DwarfExpression.cpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/LexicalScopes.cpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/StreamEmitter.cpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/VISADebugDecoder.cpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/VISADebugEmitter.cpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/VISADebugInfo.cpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/VISAModule.cpp")
-add_library(GenXDebugInfo STATIC ${DEBUG_INFO_LIBRARY_SOURCES})
-add_dependencies(GenXDebugInfo intrinsics_gen ${IGC_BUILD__PROJ__GenISAIntrinsics})
+set(IGC_BUILD__HDR__DebugInfo
+ "${CMAKE_CURRENT_SOURCE_DIR}/DIE.hpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/DwarfCompileUnit.hpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/DwarfDebug.hpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/DwarfExpression.hpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/EmitterOpts.hpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/LexicalScopes.hpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/StreamEmitter.hpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/Utils.hpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/VISADebugDecoder.hpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/VISADebugEmitter.hpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/VISADebugInfo.hpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/VISAIDebugEmitter.hpp"
+ "${CMAKE_CURRENT_SOURCE_DIR}/VISAModule.hpp")
-set_target_properties(GenXDebugInfo PROPERTIES FOLDER "Libraries")
+add_library(GenXDebugInfo STATIC
+ ${IGC_BUILD__SRC__DebugInfo}
+ ${IGC_BUILD__HDR__DebugInfo})
-igc_get_llvm_targets(LLVM_LIBS
- BinaryFormat
- Core
- MC
- Support
- )
+add_dependencies(GenXDebugInfo "${IGC_BUILD__PROJ__GenISAIntrinsics}")
-target_link_libraries(GenXDebugInfo
- ${LLVM_LIBS}
- )
+set_target_properties(GenXDebugInfo PROPERTIES FOLDER "Libraries")
diff --git a/IGC/DebugInfo/DwarfDebug.cpp b/IGC/DebugInfo/DwarfDebug.cpp
index 1a28d0f..76adba6 100644
--- a/IGC/DebugInfo/DwarfDebug.cpp
+++ b/IGC/DebugInfo/DwarfDebug.cpp
@@ -897,7 +897,7 @@ CompileUnit *DwarfDebug::constructCompileUnit(DICompileUnit *DIUnit) {
auto producer = DIUnit->getProducer();
auto strProducer = producer.str();
- if (producer.startswith("clang version")) {
+ if (producer.starts_with("clang version")) {
auto pos = strProducer.find("(");
strProducer = strProducer.substr(0, pos);
producer = strProducer.data();
@@ -1314,8 +1314,7 @@ void DwarfDebug::endSections() {
if (SCU.Sym->isInSection()) {
// Make a note of this symbol and it's section.
const MCSection *Section = &SCU.Sym->getSection();
- if (!Section->getKind().isMetadata())
- SectionMap[Section].push_back(SCU);
+ SectionMap[Section].push_back(SCU);
} else {
// Some symbols (e.g. common/bss on mach-o) can have no section but still
// appear in the output. This sucks as we rely on sections to build
diff --git a/IGC/DebugInfo/StreamEmitter.cpp b/IGC/DebugInfo/StreamEmitter.cpp
index bbfd65e..9aa710a 100644
--- a/IGC/DebugInfo/StreamEmitter.cpp
+++ b/IGC/DebugInfo/StreamEmitter.cpp
@@ -69,7 +69,7 @@ public:
VISAELFObjectWriter(uint8_t osABI, uint16_t eMachine)
: MCELFObjectTargetWriter(true /* is64Bit */, osABI, eMachine, true /* hasRelocationAddend */) {}
- unsigned getRelocType(MCContext &Ctx, const MCValue &Target, const MCFixup &Fixup, bool IsPCRel) const {
+ unsigned getRelocType(const MCFixup &Fixup, const MCValue &Target, bool IsPCRel) const override {
IGC_ASSERT_MESSAGE(IsPCRel == false, "expecting non-PC relative reloc type");
unsigned type = ELF::R_X86_64_NONE;
@@ -98,11 +98,13 @@ public:
class VISAAsmBackend : public MCAsmBackend {
StringRef m_targetTriple;
+ uint8_t m_osABI;
+ uint16_t m_eMachine;
public:
- VISAAsmBackend(StringRef targetTriple) : MCAsmBackend(support::endianness::little), m_targetTriple(targetTriple) {}
+ VISAAsmBackend(StringRef targetTriple, uint8_t osABI, uint16_t eMachine) : MCAsmBackend(llvm::endianness::little), m_targetTriple(targetTriple), m_osABI(osABI), m_eMachine(eMachine) {}
- unsigned getNumFixupKinds() const override { return 0; }
+ std::optional<MCFixupKind> getFixupKind(StringRef) const override { return std::nullopt; }
static unsigned getFixupKindLog2Size(unsigned Kind) {
switch (Kind) {
@@ -119,8 +121,7 @@ public:
}
}
- void applyFixup(const MCAssembler &Asm, const MCFixup &fixup, const MCValue &Target, MutableArrayRef<char> Data,
- uint64_t value, bool IsResolved, const MCSubtargetInfo *STI) const override {
+ void applyFixup(const MCFragment &, const MCFixup &fixup, const MCValue &Target, uint8_t *Data, uint64_t value, bool IsResolved) override {
unsigned size = 1 << getFixupKindLog2Size(fixup.getKind());
IGC_ASSERT_MESSAGE(fixup.getOffset() + size <= Data.size(), "Invalid fixup offset!");
@@ -136,14 +137,13 @@ public:
}
}
- bool mayNeedRelaxation(const MCInst &inst, const MCSubtargetInfo &STI) const override {
+ bool mayNeedRelaxation(unsigned Opcode, ArrayRef<MCOperand> Operands, const MCSubtargetInfo &STI) const override {
// TODO: implement this
IGC_ASSERT_EXIT_MESSAGE(0, "Unimplemented");
return false;
}
- bool fixupNeedsRelaxation(const MCFixup &fixup, uint64_t value, const MCRelaxableFragment *pDF,
- const MCAsmLayout &layout) const override {
+ bool fixupNeedsRelaxation(const MCFixup &fixup, uint64_t value) const override {
// TODO: implement this
IGC_ASSERT_EXIT_MESSAGE(0, "Unimplemented");
return false;
@@ -157,17 +157,14 @@ public:
return true;
}
- std::unique_ptr<MCObjectTargetWriter> createObjectTargetWriter() const override {
- // TODO: implement this
- IGC_ASSERT_UNREACHABLE(); // Unimplemented
- }
+ std::unique_ptr<MCObjectTargetWriter> createObjectTargetWriter() const override { return std::make_unique<VISAELFObjectWriter>(m_osABI, m_eMachine); }
}; // namespace IGC
class VISAMCCodeEmitter : public MCCodeEmitter {
/// EncodeInstruction - Encode the given \p inst to bytes on the output
/// stream \p OS.
- virtual void encodeInstruction(const MCInst &inst, raw_ostream &os, SmallVectorImpl<MCFixup> &fixups,
- const MCSubtargetInfo &m) const {
+ void encodeInstruction(const MCInst &inst, SmallVectorImpl<char> &CB, SmallVectorImpl<MCFixup> &fixups,
+ const MCSubtargetInfo &m) const override {
// TODO: implement this
IGC_ASSERT_EXIT_MESSAGE(0, "Unimplemented");
}
@@ -207,17 +204,13 @@ StreamEmitter::StreamEmitter(raw_pwrite_stream &outStream, const std::string &da
uint16_t eMachine = EM_INTEL_GEN;
if (StreamOptions.EnforceAMD64Machine)
eMachine = ELF::EM_X86_64;
- std::unique_ptr<MCAsmBackend> pAsmBackend = IGCLLVM::make_unique<VISAAsmBackend>(GetTargetTriple());
- std::unique_ptr<MCELFObjectTargetWriter> pTargetObjectWriter =
- IGCLLVM::make_unique<VISAELFObjectWriter>(osABI, eMachine);
- std::unique_ptr<MCObjectWriter> pObjectWriter =
- createELFObjectWriter(std::move(pTargetObjectWriter), outStream, true);
+ std::unique_ptr<MCAsmBackend> pAsmBackend = IGCLLVM::make_unique<VISAAsmBackend>(GetTargetTriple(), osABI, eMachine);
+ std::unique_ptr<MCObjectWriter> pObjectWriter = pAsmBackend->createObjectWriter(outStream);
std::unique_ptr<MCCodeEmitter> pCodeEmitter = IGCLLVM::make_unique<VISAMCCodeEmitter>();
- bool isRelaxAll = false;
bool isNoExecStack = false;
m_pMCStreamer = createELFStreamer(*m_pContext, std::move(pAsmBackend), std::move(pObjectWriter),
- std::move(pCodeEmitter), isRelaxAll);
+ std::move(pCodeEmitter));
IGCLLVM::initSections(m_pMCStreamer, isNoExecStack, m_pContext);
}
diff --git a/IGC/DebugInfo/Utils.hpp b/IGC/DebugInfo/Utils.hpp
index 6517870..f00ec84 100644
--- a/IGC/DebugInfo/Utils.hpp
+++ b/IGC/DebugInfo/Utils.hpp
@@ -94,7 +94,7 @@ inline int32_t getSourceLangLiteralMDValue(const llvm::DICompileUnit *compileUni
inline uint16_t getSourceLanguage(const llvm::DICompileUnit *compileUnit, const llvm::Module *module) {
int32_t sourceLanguage = getSourceLangLiteralMDValue(compileUnit, module);
if (sourceLanguage == SOURCE_LANG_LITERAL_MD_IS_NOT_PRESENT) {
- sourceLanguage = compileUnit->getSourceLanguage();
+ sourceLanguage = compileUnit->getSourceLanguage().getName();
}
return uint16_t(sourceLanguage);
}
diff --git a/IGC/DebugInfo/VISAModule.cpp b/IGC/DebugInfo/VISAModule.cpp
index 1d7040e..9ab0e66 100644
--- a/IGC/DebugInfo/VISAModule.cpp
+++ b/IGC/DebugInfo/VISAModule.cpp
@@ -485,7 +485,7 @@ const DbgDecoder::VarInfo *VISAModule::getVarInfo(const VISAObjectDebugInfo &VDI
for (const auto &VarInfo : VDI.getVISAVariables()) {
StringRef Name = VarInfo.name;
// TODO: what to do with variables starting with "T"?
- if (Name.startswith("V")) {
+ if (Name.starts_with("V")) {
Name = Name.drop_front();
unsigned RegNum = 0;
if (!Name.getAsInteger(10, RegNum))
diff --git a/IGC/GenISAIntrinsics/GenIntrinsicInst.h b/IGC/GenISAIntrinsics/GenIntrinsicInst.h
index 7c378e8..5253670 100644
--- a/IGC/GenISAIntrinsics/GenIntrinsicInst.h
+++ b/IGC/GenISAIntrinsics/GenIntrinsicInst.h
@@ -84,7 +84,7 @@ public:
// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const CallInst *I) {
if (const Function *CF = I->getCalledFunction()) {
- return (CF->getName().startswith(GenISAIntrinsic::getGenIntrinsicPrefix()));
+ return (CF->getName().starts_with(GenISAIntrinsic::getGenIntrinsicPrefix()));
}
return false;
}
diff --git a/IGC/GenISAIntrinsics/GenIntrinsicLookup.cpp b/IGC/GenISAIntrinsics/GenIntrinsicLookup.cpp
index f4d86c1..6452248 100644
--- a/IGC/GenISAIntrinsics/GenIntrinsicLookup.cpp
+++ b/IGC/GenISAIntrinsics/GenIntrinsicLookup.cpp
@@ -14,7 +14,7 @@ namespace IGC {
llvm::GenISAIntrinsic::ID LookupIntrinsicId(llvm::StringRef GenISAprefix, llvm::StringRef Name) {
- if (!Name.startswith(GenISAprefix))
+ if (!Name.starts_with(GenISAprefix))
return llvm::GenISAIntrinsic::ID::no_intrinsic;
static auto LengthTable = GetIntrinsicLookupTable();
diff --git a/IGC/GenISAIntrinsics/GenIntrinsics.h b/IGC/GenISAIntrinsics/GenIntrinsics.h
index 8cc901a..d07313d 100644
--- a/IGC/GenISAIntrinsics/GenIntrinsics.h
+++ b/IGC/GenISAIntrinsics/GenIntrinsics.h
@@ -32,7 +32,7 @@ struct IntrinsicComments {
IntrinsicComments getIntrinsicComments(ID id);
-/// Intrinsic::getDeclaration(M, ID) - Create or insert an LLVM Function
+/// Intrinsic::getOrInsertDeclaration(M, ID) - Create or insert an LLVM Function
/// declaration for an intrinsic, and return it.
///
/// The OverloadedTys parameter is for intrinsics with overloaded types
@@ -57,7 +57,7 @@ Function *getDeclaration(Module *M, ID id, ArrayRef<Type *> OverloadedTys = {},
// Override of isIntrinsic method defined in Function.h
inline const char *getGenIntrinsicPrefix() { return "llvm.genx."; }
-inline bool isIntrinsic(const Function *CF) { return (CF->getName().startswith(getGenIntrinsicPrefix())); }
+inline bool isIntrinsic(const Function *CF) { return (CF->getName().starts_with(getGenIntrinsicPrefix())); }
ID getIntrinsicID(const Function *F, bool useContextWrapper = true);
} // namespace GenISAIntrinsic
diff --git a/IGC/GenISAIntrinsics/generator/Intrinsic_definition_objects.py b/IGC/GenISAIntrinsics/generator/Intrinsic_definition_objects.py
index e6fa1f7..4bfbee0 100644
--- a/IGC/GenISAIntrinsics/generator/Intrinsic_definition_objects.py
+++ b/IGC/GenISAIntrinsics/generator/Intrinsic_definition_objects.py
@@ -155,7 +155,7 @@ class ParamAttributeID(Enum):
ByRef = 0
ByVal = 1
StructRet = 2
- NoCapture = 3
+ Captures = 3
def __str__(self):
return self.name
diff --git a/IGC/GenISAIntrinsics/generator/Intrinsic_definition_translation.py b/IGC/GenISAIntrinsics/generator/Intrinsic_definition_translation.py
index cffa5a8..4f85558 100644
--- a/IGC/GenISAIntrinsics/generator/Intrinsic_definition_translation.py
+++ b/IGC/GenISAIntrinsics/generator/Intrinsic_definition_translation.py
@@ -25,7 +25,7 @@ def translate_type_definition(type_description):
for type_str in type_description:
internal_types.append(translate_type_definition(type_str))
return TypeDefinition(TypeID.Struct, internal_types=internal_types)
- elif type_description.startswith('any'):
+ elif type_description.starts_with('any'):
if type_description == 'anyvector':
return TypeDefinition(TypeID.Vector, internal_type=TypeDefinition(TypeID.Any))
elif type_description == 'anyint':
@@ -39,55 +39,55 @@ def translate_type_definition(type_description):
return TypeDefinition(TypeID.Any, internal_type=default_type)
elif type_description == 'void':
return TypeDefinition(TypeID.Void)
- elif type_description.startswith('bool'):
+ elif type_description.starts_with('bool'):
type_def = TypeDefinition(TypeID.Integer, bit_width=1)
match = re.search("bool([0-9]+)", type_description)
if match is not None:
type_def = TypeDefinition(TypeID.Vector, num_elements=int(match.group(1)), internal_type=type_def)
return type_def
- elif type_description.startswith('char'):
+ elif type_description.starts_with('char'):
type_def = TypeDefinition(TypeID.Integer, bit_width=8)
match = re.search("char([0-9]+)", type_description)
if match is not None:
type_def = TypeDefinition(TypeID.Vector, num_elements=int(match.group(1)), internal_type=type_def)
return type_def
- elif type_description.startswith('short'):
+ elif type_description.starts_with('short'):
type_def = TypeDefinition(TypeID.Integer, bit_width=16)
match = re.search("short([0-9]+)", type_description)
if match is not None:
type_def = TypeDefinition(TypeID.Vector, num_elements=int(match.group(1)), internal_type=type_def)
return type_def
- elif type_description.startswith('int'):
+ elif type_description.starts_with('int'):
type_def = TypeDefinition(TypeID.Integer, bit_width=32)
match = re.search("int([0-9]+)", type_description)
if match is not None:
type_def = TypeDefinition(TypeID.Vector, num_elements=int(match.group(1)), internal_type=type_def)
return type_def
- elif type_description.startswith('long'):
+ elif type_description.starts_with('long'):
type_def = TypeDefinition(TypeID.Integer, bit_width=64)
match = re.search("long([0-9]+)", type_description)
if match is not None:
type_def = TypeDefinition(TypeID.Vector, num_elements=int(match.group(1)), internal_type=type_def)
return type_def
- elif type_description.startswith('half'):
+ elif type_description.starts_with('half'):
type_def = TypeDefinition(TypeID.Float, bit_width=16)
match = re.search("half([0-9]+)", type_description)
if match is not None:
type_def = TypeDefinition(TypeID.Vector, num_elements=int(match.group(1)), internal_type=type_def)
return type_def
- elif type_description.startswith('float'):
+ elif type_description.starts_with('float'):
type_def = TypeDefinition(TypeID.Float, bit_width=32)
match = re.search("float([0-9]+)", type_description)
if match is not None:
type_def = TypeDefinition(TypeID.Vector, num_elements=int(match.group(1)), internal_type=type_def)
return type_def
- elif type_description.startswith('double'):
+ elif type_description.starts_with('double'):
type_def = TypeDefinition(TypeID.Float, bit_width=32)
match = re.search("double([0-9]+)", type_description)
if match is not None:
type_def = TypeDefinition(TypeID.Vector, num_elements=int(match.group(1)), internal_type=type_def)
return type_def
- elif type_description.startswith('ptr_private'):
+ elif type_description.starts_with('ptr_private'):
# E2 <- E == IIT_PTR + AddressSpace == 0 (implicit for IIT_PTR) + 2 == IIT_I8
return TypeDefinition(TypeID.Pointer, address_space=AddressSpace.Private,
internal_type=TypeDefinition(TypeID.Integer, bit_width=8))
diff --git a/IGC/GenISAIntrinsics/generator/input/Intrinsic_definitions.yml b/IGC/GenISAIntrinsics/generator/input/Intrinsic_definitions.yml
index ca933bd..e517ad2 100644
--- a/IGC/GenISAIntrinsics/generator/input/Intrinsic_definitions.yml
+++ b/IGC/GenISAIntrinsics/generator/input/Intrinsic_definitions.yml
@@ -12033,7 +12033,7 @@ intrinsics:
name: Arg16
type_definition: *p_any_
comment: "payload"
- param_attr: !ParamAttributeID "NoCapture"
+ param_attr: !ParamAttributeID "Captures"
- !<ArgumentDefinition>
name: Arg17
type_definition: *i32
diff --git a/IGC/IRBuilderGenerator/main.cpp b/IGC/IRBuilderGenerator/main.cpp
index d8312c5..9c83b27 100644
--- a/IGC/IRBuilderGenerator/main.cpp
+++ b/IGC/IRBuilderGenerator/main.cpp
@@ -43,6 +43,7 @@ SPDX-License-Identifier: MIT
#include "llvm/Support/Signals.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/FileSystem.h"
+#include "llvm/Support/ManagedStatic.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/IRReader/IRReader.h"
@@ -136,6 +137,8 @@ using AlignMap = DenseMap<const Type *, uint32_t>;
// TODO: check for cycles if we want to process cyclic structures.
void findHoleTys(const Type *Ty, HoleMap &Tys) {
+ if (!Ty)
+ return;
if (auto *StructTy = dyn_cast<StructType>(Ty)) {
if (!StructTy->isLiteral()) {
assert(StructTy->hasName() && "no name?");
@@ -186,7 +189,7 @@ void emitType(const Type *Ty, const HoleMap &HoleTys, const AlignMap &Aligns, ra
if (auto *StructTy = dyn_cast<StructType>(Ty)) {
assert(!StructTy->isOpaque() && "encountered opaque struct?");
- if (!Root) {
+ if (!Root && StructTy->hasName() && !StructTy->getName().empty()) {
OS.indent(Level * 2) << sanitize(StructTy->getName().str()) << "(M";
HoleMap HoleTys;
findHoleTys(StructTy, HoleTys);
@@ -232,14 +235,7 @@ void emitType(const Type *Ty, const HoleMap &HoleTys, const AlignMap &Aligns, ra
OS << ",\n";
}
OS.indent(In * 2) << "};\n";
- {
- // Inject explicit padding as needed
- auto I = Aligns.find(StructTy);
- if (I != Aligns.end()) {
- OS.indent(In * 2) << "injectPadding(M, Tys, " << I->second << ", " << (StructTy->isPacked() ? "true" : "false")
- << ");\n";
- }
- }
+
if (StructTy->isLiteral()) {
OS.indent(In * 2) << "return StructType::get(M.getContext(), Tys, " << (StructTy->isPacked() ? "true" : "false")
<< ");\n";
@@ -293,18 +289,29 @@ void emitType(const Type *Ty, const HoleMap &HoleTys, const AlignMap &Aligns, ra
}
bool processAlignOf(const Function &F, AlignMap &Aligns) {
- if (F.arg_size() != 1) {
- errs() << F.getName() << ": Only one argument should be specified!\n";
- return false;
+ if (F.arg_size() == 1) {
+ const Argument *A = F.arg_begin();
+ auto *StructTy = cast<StructType>(A->getParamStructRetType());
+
+ Align Align = *A->getParamAlign();
+ Aligns[StructTy] = static_cast<uint32_t>(Align.value());
+
+ return true;
}
- const Argument *A = F.arg_begin();
- auto *StructTy = cast<StructType>(A->getParamStructRetType());
+ if (F.arg_empty()) {
+ auto *StructTy = dyn_cast<StructType>(F.getReturnType());
+ if (!StructTy) {
+ errs() << F.getName() << ": Return type should be struct!\n";
+ return false;
+ }
- Align Align = *A->getParamAlign();
- Aligns[StructTy] = static_cast<uint32_t>(Align.value());
+ Aligns[StructTy] = static_cast<uint32_t>(F.getParent()->getDataLayout().getABITypeAlign(StructTy).value());
+ return true;
+ }
- return true;
+ errs() << F.getName() << ": Only one argument should be specified!\n";
+ return false;
}
bool emitType(const StructType *Ty, StringRef FName, raw_ostream &OS, const AlignMap &Aligns, bool Root) {
@@ -325,15 +332,25 @@ bool emitType(const StructType *Ty, StringRef FName, raw_ostream &OS, const Alig
}
bool processGetType(const Function &F, raw_ostream &OS, const AlignMap &Aligns) {
- if (F.arg_size() != 1) {
- errs() << F.getName() << ": Should have only one argument!\n";
- return false;
+ if (F.arg_size() == 1) {
+ const Argument *A = F.arg_begin();
+ auto *STy = cast<StructType>(A->getParamStructRetType());
+
+ return emitType(STy, F.getName(), OS, Aligns, false);
}
- const Argument *A = F.arg_begin();
- auto *STy = cast<StructType>(A->getParamStructRetType());
+ if (F.arg_empty()) {
+ auto *STy = dyn_cast<StructType>(F.getReturnType());
+ if (!STy) {
+ errs() << F.getName() << ": Return type should be struct!\n";
+ return false;
+ }
+
+ return emitType(STy, F.getName(), OS, Aligns, false);
+ }
- return emitType(STy, F.getName(), OS, Aligns, false);
+ errs() << F.getName() << ": Should have only one argument!\n";
+ return false;
}
struct HookInfo {
@@ -1116,9 +1133,7 @@ void rewriteAnonTypes(Module &M) {
}
void preprocess(Module &M) {
- llvm::legacy::PassManager mpm;
- mpm.add(createUnifyFunctionExitNodesPass());
- mpm.add(createLowerSwitchPass());
+ llvm::legacy::PassManager mpm; mpm.add(createLowerSwitchPass());
mpm.run(M);
markInvariant(M);
diff --git a/IGC/LLVM3DBuilder/BuiltinsFrontendDefinitions.hpp b/IGC/LLVM3DBuilder/BuiltinsFrontendDefinitions.hpp
index 171f9a3..92ae7ea 100644
--- a/IGC/LLVM3DBuilder/BuiltinsFrontendDefinitions.hpp
+++ b/IGC/LLVM3DBuilder/BuiltinsFrontendDefinitions.hpp
@@ -2156,7 +2156,7 @@ inline SampleD_DC_FromCubeParams LLVM3DBuilder<T, Inserter>::Prepare_SAMPLE_D_DC
template <typename T, typename Inserter> llvm::Value *LLVM3DBuilder<T, Inserter>::CreateFAbs(llvm::Value *V) {
llvm::Module *module = this->GetInsertBlock()->getParent()->getParent();
- llvm::Function *fabs = llvm::Intrinsic::getDeclaration(module, llvm::Intrinsic::fabs, V->getType());
+ llvm::Function *fabs = llvm::Intrinsic::getOrInsertDeclaration(module, llvm::Intrinsic::fabs, V->getType());
return this->CreateCall(fabs, V);
}
@@ -2326,21 +2326,21 @@ template <typename T, typename Inserter> llvm::Value *LLVM3DBuilder<T, Inserter>
template <typename T, typename Inserter> llvm::Value *LLVM3DBuilder<T, Inserter>::CreateSin(llvm::Value *V) {
llvm::Module *module = this->GetInsertBlock()->getParent()->getParent();
- llvm::Function *sin = llvm::Intrinsic::getDeclaration(module, llvm::Intrinsic::sin, V->getType());
+ llvm::Function *sin = llvm::Intrinsic::getOrInsertDeclaration(module, llvm::Intrinsic::sin, V->getType());
return this->CreateCall(sin, V);
}
template <typename T, typename Inserter> llvm::Value *LLVM3DBuilder<T, Inserter>::CreateCos(llvm::Value *V) {
llvm::Module *module = this->GetInsertBlock()->getParent()->getParent();
- llvm::Function *cos = llvm::Intrinsic::getDeclaration(module, llvm::Intrinsic::cos, V->getType());
+ llvm::Function *cos = llvm::Intrinsic::getOrInsertDeclaration(module, llvm::Intrinsic::cos, V->getType());
return this->CreateCall(cos, V);
}
template <typename T, typename Inserter> llvm::Value *LLVM3DBuilder<T, Inserter>::CreateSqrt(llvm::Value *V) {
llvm::Module *module = this->GetInsertBlock()->getParent()->getParent();
- llvm::Function *sqrt = llvm::Intrinsic::getDeclaration(module, llvm::Intrinsic::sqrt, V->getType());
+ llvm::Function *sqrt = llvm::Intrinsic::getOrInsertDeclaration(module, llvm::Intrinsic::sqrt, V->getType());
return this->CreateCall(sqrt, V);
}
@@ -2348,7 +2348,7 @@ template <typename T, typename Inserter>
llvm::Value *LLVM3DBuilder<T, Inserter>::CreateFPow(llvm::Value *LHS, llvm::Value *RHS) {
llvm::Module *module = this->GetInsertBlock()->getParent()->getParent();
- llvm::Function *fpow = llvm::Intrinsic::getDeclaration(module, llvm::Intrinsic::pow, LHS->getType());
+ llvm::Function *fpow = llvm::Intrinsic::getOrInsertDeclaration(module, llvm::Intrinsic::pow, LHS->getType());
return this->CreateCall2(fpow, LHS, RHS);
}
@@ -2356,7 +2356,7 @@ template <typename T, typename Inserter>
llvm::Value *LLVM3DBuilder<T, Inserter>::CreateFMax(llvm::Value *LHS, llvm::Value *RHS) {
llvm::Module *module = this->GetInsertBlock()->getParent()->getParent();
- llvm::Function *fmax = llvm::Intrinsic::getDeclaration(module, llvm::Intrinsic::maxnum, LHS->getType());
+ llvm::Function *fmax = llvm::Intrinsic::getOrInsertDeclaration(module, llvm::Intrinsic::maxnum, LHS->getType());
return this->CreateCall2(fmax, LHS, RHS);
}
@@ -2364,7 +2364,7 @@ template <typename T, typename Inserter>
llvm::Value *LLVM3DBuilder<T, Inserter>::CreateFMin(llvm::Value *LHS, llvm::Value *RHS) {
llvm::Module *module = this->GetInsertBlock()->getParent()->getParent();
- llvm::Function *fmin = llvm::Intrinsic::getDeclaration(module, llvm::Intrinsic::minnum, LHS->getType());
+ llvm::Function *fmin = llvm::Intrinsic::getOrInsertDeclaration(module, llvm::Intrinsic::minnum, LHS->getType());
return this->CreateCall2(fmin, LHS, RHS);
}
@@ -2396,14 +2396,14 @@ template <typename T, typename Inserter> llvm::Value *LLVM3DBuilder<T, Inserter>
template <typename T, typename Inserter> llvm::Value *LLVM3DBuilder<T, Inserter>::CreateFLog(llvm::Value *V) {
llvm::Module *module = this->GetInsertBlock()->getParent()->getParent();
- llvm::Function *flog = llvm::Intrinsic::getDeclaration(module, llvm::Intrinsic::log2, V->getType());
+ llvm::Function *flog = llvm::Intrinsic::getOrInsertDeclaration(module, llvm::Intrinsic::log2, V->getType());
return this->CreateCall(flog, V);
}
template <typename T, typename Inserter> llvm::Value *LLVM3DBuilder<T, Inserter>::CreateFExp(llvm::Value *V) {
llvm::Module *module = this->GetInsertBlock()->getParent()->getParent();
- llvm::Function *fexp = llvm::Intrinsic::getDeclaration(module, llvm::Intrinsic::exp2, V->getType());
+ llvm::Function *fexp = llvm::Intrinsic::getOrInsertDeclaration(module, llvm::Intrinsic::exp2, V->getType());
return this->CreateCall(fexp, V);
}
@@ -2484,7 +2484,7 @@ template <typename T, typename Inserter> llvm::Value *LLVM3DBuilder<T, Inserter>
if (V->getType() == this->getDoubleTy()) {
return CreateDFloor(V);
} else {
- llvm::Function *floor = llvm::Intrinsic::getDeclaration(module, llvm::Intrinsic::floor, V->getType());
+ llvm::Function *floor = llvm::Intrinsic::getOrInsertDeclaration(module, llvm::Intrinsic::floor, V->getType());
return this->CreateCall(floor, V);
}
}
@@ -2568,7 +2568,7 @@ template <typename T, typename Inserter> llvm::Value *LLVM3DBuilder<T, Inserter>
if (V->getType() == this->getDoubleTy()) {
return CreateDCeil(V);
} else {
- llvm::Function *ceil = llvm::Intrinsic::getDeclaration(module, llvm::Intrinsic::ceil, V->getType());
+ llvm::Function *ceil = llvm::Intrinsic::getOrInsertDeclaration(module, llvm::Intrinsic::ceil, V->getType());
return this->CreateCall(ceil, V);
}
}
@@ -2640,7 +2640,7 @@ template <typename T, typename Inserter> llvm::Value *LLVM3DBuilder<T, Inserter>
if (V->getType() == this->getDoubleTy()) {
return CreateDTrunc(V);
} else {
- llvm::Function *trunc = llvm::Intrinsic::getDeclaration(module, llvm::Intrinsic::trunc, V->getType());
+ llvm::Function *trunc = llvm::Intrinsic::getOrInsertDeclaration(module, llvm::Intrinsic::trunc, V->getType());
return this->CreateCall(trunc, V);
}
}
@@ -2754,7 +2754,7 @@ template <typename T, typename Inserter> inline llvm::Value *LLVM3DBuilder<T, In
template <typename T, typename Inserter> llvm::Value *LLVM3DBuilder<T, Inserter>::CreateCtpop(llvm::Value *V) {
llvm::Module *module = this->GetInsertBlock()->getParent()->getParent();
- llvm::Function *ctpop = llvm::Intrinsic::getDeclaration(module, llvm::Intrinsic::ctpop, V->getType());
+ llvm::Function *ctpop = llvm::Intrinsic::getOrInsertDeclaration(module, llvm::Intrinsic::ctpop, V->getType());
return this->CreateCall(ctpop, V);
}
@@ -2820,7 +2820,7 @@ llvm::Value *LLVM3DBuilder<T, Inserter>::Create_MAD_Scalar(llvm::Value *float_sr
float_src2->getType() == this->getFloatTy() || float_src2->getType() == this->getDoubleTy()),
"Type check @MAD.scalar arg: 2");
- llvm::Function *madFunc = llvm::Intrinsic::getDeclaration(module, llvm::Intrinsic::fma, float_src0->getType());
+ llvm::Function *madFunc = llvm::Intrinsic::getOrInsertDeclaration(module, llvm::Intrinsic::fma, float_src0->getType());
llvm::Value *args[] = {float_src0, float_src1, float_src2};
llvm::Value *float_madres_s = this->CreateCall(madFunc, args);
@@ -2830,7 +2830,7 @@ llvm::Value *LLVM3DBuilder<T, Inserter>::Create_MAD_Scalar(llvm::Value *float_sr
template <typename T, typename Inserter>
llvm::Value *LLVM3DBuilder<T, Inserter>::CreatePow(llvm::Value *src0, llvm::Value *src1) {
llvm::Module *module = this->GetInsertBlock()->getParent()->getParent();
- llvm::Function *powFunc = llvm::Intrinsic::getDeclaration(module, llvm::Intrinsic::pow, src0->getType());
+ llvm::Function *powFunc = llvm::Intrinsic::getOrInsertDeclaration(module, llvm::Intrinsic::pow, src0->getType());
llvm::Value *args[] = {src0, src1};
llvm::Value *powres_s = this->CreateCall(powFunc, args);
@@ -3028,7 +3028,7 @@ template <typename T, typename Inserter> inline llvm::Value *LLVM3DBuilder<T, In
template <typename T, typename Inserter>
inline llvm::CallInst *LLVM3DBuilder<T, Inserter>::create_countbits(llvm::Value *src) {
llvm::Module *module = this->GetInsertBlock()->getParent()->getParent();
- llvm::Function *pFunc = llvm::Intrinsic::getDeclaration(module, llvm::Intrinsic::ctpop, this->getInt32Ty());
+ llvm::Function *pFunc = llvm::Intrinsic::getOrInsertDeclaration(module, llvm::Intrinsic::ctpop, this->getInt32Ty());
return this->CreateCall(pFunc, src);
}
diff --git a/IGC/OCLFE/igd_fcl_mcl/source/clang_tb.cpp b/IGC/OCLFE/igd_fcl_mcl/source/clang_tb.cpp
index 7ec183b..e8bcc45 100644
--- a/IGC/OCLFE/igd_fcl_mcl/source/clang_tb.cpp
+++ b/IGC/OCLFE/igd_fcl_mcl/source/clang_tb.cpp
@@ -978,7 +978,7 @@ std::string GetCDefinesForEnableList(llvm::StringRef enableListStr, unsigned int
ExtensionsRequiringManualFeatureMacros enabledExtensions;
for (auto ext : v) {
if (ext.consume_front("+")) {
- if (ext.equals("cl_intel_device_side_avc_motion_estimation")) {
+ if (ext == "cl_intel_device_side_avc_motion_estimation") {
// If the user provided -cl-std option we need to add the define only if it's 1.2 and above.
// This is because clang will not allow declarations of extension's functions which use avc types otherwise.
if (!(oclStd >= 120 || oclStd == 0))
@@ -986,13 +986,13 @@ std::string GetCDefinesForEnableList(llvm::StringRef enableListStr, unsigned int
}
// Only collect extensions needed for manual feature macro generation
- if (ext.equals("cl_khr_integer_dot_product")) {
+ if (ext == "cl_khr_integer_dot_product") {
enabledExtensions.integerDotProduct = true;
- } else if (ext.equals("cl_ext_float_atomics")) {
+ } else if (ext == "cl_ext_float_atomics") {
enabledExtensions.extFloatAtomics = true;
- } else if (ext.equals("cl_khr_fp16")) {
+ } else if (ext == "cl_khr_fp16") {
enabledExtensions.fp16 = true;
- } else if (ext.equals("cl_khr_fp64")) {
+ } else if (ext == "cl_khr_fp64") {
enabledExtensions.fp64 = true;
}
diff --git a/IGC/VectorCompiler/CMCL/lib/Support/BuiltinTranslator.cpp b/IGC/VectorCompiler/CMCL/lib/Support/BuiltinTranslator.cpp
index 42e4f75..9574d0b 100644
--- a/IGC/VectorCompiler/CMCL/lib/Support/BuiltinTranslator.cpp
+++ b/IGC/VectorCompiler/CMCL/lib/Support/BuiltinTranslator.cpp
@@ -164,7 +164,7 @@ Function *getAnyDeclarationForIdFromArgs(Type &RetTy, Range &&Args, unsigned Id,
if (Intrinsic::isOverloaded(IID))
Types.push_back(&RetTy);
- return Intrinsic::getDeclaration(&M, IID, Types);
+ return Intrinsic::getOrInsertDeclaration(&M, IID, Types);
}
static bool isCMCLBuiltin(const Function &F) {
@@ -325,7 +325,7 @@ static Value &createLLVMIntrinsic(const std::vector<Value *> &Operands,
auto IID = static_cast<Intrinsic::ID>(IntrinsicForBuiltin[BiID]);
assert(IID != Intrinsic::not_intrinsic && "Expected LLVM intrinsic");
Module *M = IRB.GetInsertBlock()->getModule();
- auto *Decl = Intrinsic::getDeclaration(M, IID, {&RetTy});
+ auto *Decl = Intrinsic::getOrInsertDeclaration(M, IID, {&RetTy});
return *IRB.CreateCall(Decl, Operands);
}
diff --git a/IGC/VectorCompiler/cmake/supported_platforms_list.cmake b/IGC/VectorCompiler/cmake/supported_platforms_list.cmake
index e8e14d5..81fd2b5 100644
--- a/IGC/VectorCompiler/cmake/supported_platforms_list.cmake
+++ b/IGC/VectorCompiler/cmake/supported_platforms_list.cmake
@@ -6,7 +6,7 @@
#
#============================ end_copyright_notice =============================
-set(SUPPORTED_VC_PLATFORMS
+set(ALL_SUPPORTED_VC_PLATFORMS
"Gen8"
"Gen9"
"Gen9LP"
@@ -23,3 +23,14 @@ set(SUPPORTED_VC_PLATFORMS
"Xe3P"
"Xe3PLPG"
)
+
+if(IGC_BUILD__VC_PLATFORMS)
+ foreach(PLTF IN LISTS IGC_BUILD__VC_PLATFORMS)
+ if(NOT PLTF IN_LIST ALL_SUPPORTED_VC_PLATFORMS)
+ message(FATAL_ERROR "Unsupported VC platform requested: ${PLTF}")
+ endif()
+ endforeach()
+ set(SUPPORTED_VC_PLATFORMS ${IGC_BUILD__VC_PLATFORMS})
+else()
+ set(SUPPORTED_VC_PLATFORMS ${ALL_SUPPORTED_VC_PLATFORMS})
+endif()
diff --git a/IGC/VectorCompiler/include/GenXSubtarget.h b/IGC/VectorCompiler/include/GenXSubtarget.h
index 46d7ebf..b4d0494 100644
--- a/IGC/VectorCompiler/include/GenXSubtarget.h
+++ b/IGC/VectorCompiler/include/GenXSubtarget.h
@@ -315,6 +315,8 @@ public:
bool isInternalIntrinsicSupported(unsigned ID) const;
+ const TargetRegisterInfo *getRegisterInfo() const override { return nullptr; }
+
public:
/// * translateMediaWalker - true if translate media walker APIs
bool translateMediaWalker() const { return !HasMediaWalker; }
diff --git a/IGC/VectorCompiler/include/GenXUtil.h b/IGC/VectorCompiler/include/GenXUtil.h
index 7499dcc..45ed39c 100644
--- a/IGC/VectorCompiler/include/GenXUtil.h
+++ b/IGC/VectorCompiler/include/GenXUtil.h
@@ -158,6 +158,8 @@ llvm::SmallPtrSet<User *, 4> peelBitCastsGetUsers(Value *const V);
// Get Value def ignoring possible bitcasts chain.
inline const Value *getBitCastedValue(const Value *V) {
IGC_ASSERT_MESSAGE(V, "non-null value expected");
+ if (!V)
+ return nullptr;
while (isa<BitCastInst>(V) ||
(isa<ConstantExpr>(V) &&
cast<ConstantExpr>(V)->getOpcode() == CastInst::BitCast))
diff --git a/IGC/VectorCompiler/include/vc/GenXCodeGen/TargetMachine.h b/IGC/VectorCompiler/include/vc/GenXCodeGen/TargetMachine.h
index 7fcd55a..b6dd80c 100644
--- a/IGC/VectorCompiler/include/vc/GenXCodeGen/TargetMachine.h
+++ b/IGC/VectorCompiler/include/vc/GenXCodeGen/TargetMachine.h
@@ -20,7 +20,7 @@ std::unique_ptr<llvm::TargetMachine> createGenXTargetMachine(
const llvm::Target &T, llvm::Triple TT, llvm::StringRef CPU,
llvm::StringRef Features, const llvm::TargetOptions &Options,
IGCLLVM::optional<llvm::Reloc::Model> RM,
- IGCLLVM::optional<llvm::CodeModel::Model> CM, llvm::CodeGenOpt::Level OL,
+ IGCLLVM::optional<llvm::CodeModel::Model> CM, llvm::CodeGenOptLevel OL,
std::unique_ptr<llvm::GenXBackendConfig> BC);
inline bool is32BitArch(llvm::Triple TT) {
diff --git a/IGC/VectorCompiler/include/vc/InternalIntrinsics/InternalIntrinsicInst.h b/IGC/VectorCompiler/include/vc/InternalIntrinsics/InternalIntrinsicInst.h
index abcfefe..a516087 100644
--- a/IGC/VectorCompiler/include/vc/InternalIntrinsics/InternalIntrinsicInst.h
+++ b/IGC/VectorCompiler/include/vc/InternalIntrinsics/InternalIntrinsicInst.h
@@ -42,7 +42,7 @@ public:
// Methods for support type inquiry through isa, cast, and dyn_cast:
static bool classof(const CallInst *I) {
if (const Function *CF = I->getCalledFunction()) {
- return CF->getName().startswith(
+ return CF->getName().starts_with(
vc::InternalIntrinsic::getInternalIntrinsicPrefix());
}
return false;
diff --git a/IGC/VectorCompiler/include/vc/InternalIntrinsics/InternalIntrinsics.h b/IGC/VectorCompiler/include/vc/InternalIntrinsics/InternalIntrinsics.h
index 3617006..109d1d1 100644
--- a/IGC/VectorCompiler/include/vc/InternalIntrinsics/InternalIntrinsics.h
+++ b/IGC/VectorCompiler/include/vc/InternalIntrinsics/InternalIntrinsics.h
@@ -70,7 +70,7 @@ inline bool isInternalIntrinsic(unsigned ID) {
/// getInternalIntrinsicID() returns InternalIntrinsic::not_internal_intrinsic!
inline bool isInternalIntrinsic(const llvm::Function *CF) {
IGC_ASSERT(CF);
- return CF->getName().startswith(getInternalIntrinsicPrefix());
+ return CF->getName().starts_with(getInternalIntrinsicPrefix());
}
inline bool isInternalIntrinsic(const llvm::Value *V) {
diff --git a/IGC/VectorCompiler/include/vc/Utils/GenX/TypeSize.h b/IGC/VectorCompiler/include/vc/Utils/GenX/TypeSize.h
index 376a632..1328b7f 100644
--- a/IGC/VectorCompiler/include/vc/Utils/GenX/TypeSize.h
+++ b/IGC/VectorCompiler/include/vc/Utils/GenX/TypeSize.h
@@ -36,8 +36,8 @@ public:
using SzType = uint64_t;
using DLTypeSize = llvm::TypeSize;
- static DLTypeSize InvalidDLSize() { return DLTypeSize::Fixed(0); }
- static DLTypeSize FixedDLSize(uint64_t SZ) { return DLTypeSize::Fixed(SZ); }
+ static DLTypeSize InvalidDLSize() { return DLTypeSize::getFixed(0); }
+ static DLTypeSize FixedDLSize(uint64_t SZ) { return DLTypeSize::getFixed(SZ); }
TypeSizeWrapper() = default;
TypeSizeWrapper(DLTypeSize TS) : TS(TS) {};
diff --git a/IGC/VectorCompiler/lib/BiF/CMakeLists.txt b/IGC/VectorCompiler/lib/BiF/CMakeLists.txt
index 41080ac..7708d98 100644
--- a/IGC/VectorCompiler/lib/BiF/CMakeLists.txt
+++ b/IGC/VectorCompiler/lib/BiF/CMakeLists.txt
@@ -79,3 +79,6 @@ else()
endif()
add_dependencies(VCEmbeddedBiF VCBiFPreparation)
target_link_libraries(VCEmbeddedBiF VCHeaders)
+set_property(GLOBAL PROPERTY JOB_POOLS vc_embedded_bif_pool=1)
+set_property(TARGET VCEmbeddedBiF PROPERTY JOB_POOL_COMPILE vc_embedded_bif_pool)
+target_compile_options(VCEmbeddedBiF PRIVATE -O0 -g0)
diff --git a/IGC/VectorCompiler/lib/BiF/cmake/Functions.cmake b/IGC/VectorCompiler/lib/BiF/cmake/Functions.cmake
index ae8f823..28a5211 100644
--- a/IGC/VectorCompiler/lib/BiF/cmake/Functions.cmake
+++ b/IGC/VectorCompiler/lib/BiF/cmake/Functions.cmake
@@ -195,6 +195,10 @@ function(vc_generate_optimized_bif RES_FILE BIF_OPT_BC_PATH MANGLED_BIF_NAME OPA
endif()
set(BIF_CPP_NAME ${MANGLED_BIF_NAME}.${OPAQUE_SUFFIX}.cpp)
set(BIF_CPP_PATH ${CMAKE_CURRENT_BINARY_DIR}/${BIF_CPP_NAME})
+ set(BIF_CPP_SHARDS "")
+ foreach(I RANGE 0 31)
+ list(APPEND BIF_CPP_SHARDS ${CMAKE_CURRENT_BINARY_DIR}/${MANGLED_BIF_NAME}.${OPAQUE_SUFFIX}.PLTF${I}.cpp)
+ endforeach()
set(BIF_SYMBOL ${MANGLED_BIF_NAME}RawData)
set(BIF_CONF_NAME "${MANGLED_BIF_NAME}.${OPAQUE_SUFFIX}.conf")
set(BIF_CONF_PATH ${CMAKE_CURRENT_BINARY_DIR}/${BIF_CONF_NAME})
@@ -216,13 +220,13 @@ function(vc_generate_optimized_bif RES_FILE BIF_OPT_BC_PATH MANGLED_BIF_NAME OPA
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/builtins.conf.in"
"${BIF_CONF_PATH}" @ONLY)
add_custom_command(
- OUTPUT ${BIF_CPP_PATH}
+ OUTPUT ${BIF_CPP_PATH} ${BIF_CPP_SHARDS}
COMMENT "vc_generate_optimized_bif: create hashed version of optimized functions"
COMMAND ${VCB_EXE} -BiFUnique -symb ${BIF_SYMBOL} -o ${BIF_CPP_PATH} ${BIF_CONF_PATH}
DEPENDS ${VCB_EXE} ${BIF_CONF_PATH} ${PLTF_BC_PATH_LIST})
add_custom_target(${TARGET_NAME}
- DEPENDS ${BIF_CPP_PATH})
- set(${RES_FILE} ${BIF_CPP_PATH} PARENT_SCOPE)
+ DEPENDS ${BIF_CPP_PATH} ${BIF_CPP_SHARDS})
+ set(${RES_FILE} ${BIF_CPP_PATH} ${BIF_CPP_SHARDS} PARENT_SCOPE)
endfunction()
# Takes CMCL source code, compiles it and produces an embeddable .cpp file
diff --git a/IGC/VectorCompiler/lib/Driver/Driver.cpp b/IGC/VectorCompiler/lib/Driver/Driver.cpp
index 6501d97..1d4e54e 100644
--- a/IGC/VectorCompiler/lib/Driver/Driver.cpp
+++ b/IGC/VectorCompiler/lib/Driver/Driver.cpp
@@ -73,6 +73,7 @@ SPDX-License-Identifier: MIT
#include "Probe/Assertion.h"
#include <memory>
+#include <llvm/Support/ManagedStatic.h>
#include <string>
using namespace llvm;
@@ -147,11 +148,10 @@ getModule(ArrayRef<char> Input, vc::FileType FType,
IGC_ASSERT_UNREACHABLE(); // Unknown input kind
}
-static Triple overrideTripleWithVC(StringRef TripleStr) {
- Triple T{TripleStr};
+static Triple overrideTripleWithVC(Triple T) {
// Normalize triple.
bool Is32Bit = T.isArch32Bit();
- if (TripleStr.startswith("genx32"))
+ if (T.str().starts_with("genx32"))
Is32Bit = true;
return Triple{Is32Bit ? "genx32-unknown-unknown" : "genx64-unknown-unknown"};
}
@@ -205,10 +205,10 @@ static std::string getSubtargetFeatureString(const vc::CompileOptions &Opts) {
return Features.getString();
}
-static CodeGenOpt::Level getCodeGenOptLevel(const vc::CompileOptions &Opts) {
+static CodeGenOptLevel getCodeGenOptLevel(const vc::CompileOptions &Opts) {
if (Opts.CodegenOptLevel == vc::OptimizerLevel::None)
- return CodeGenOpt::None;
- return CodeGenOpt::Default;
+ return CodeGenOptLevel::None;
+ return CodeGenOptLevel::Default;
}
static TargetOptions getTargetOptions(const vc::CompileOptions &Opts) {
@@ -356,7 +356,7 @@ createTargetMachine(const vc::CompileOptions &Opts,
const TargetOptions Options = getTargetOptions(Opts);
- CodeGenOpt::Level OptLevel = getCodeGenOptLevel(Opts);
+ CodeGenOptLevel OptLevel = getCodeGenOptLevel(Opts);
auto BC = std::make_unique<GenXBackendConfig>(
createBackendOptions(Opts),
createBackendData(ExtData, vc::is32BitArch(TheTriple) ? 32 : 64));
@@ -494,7 +494,7 @@ static void populateCodeGenPassManager(const vc::CompileOptions &Opts,
constexpr bool DisableIrVerifier = true;
#endif
- auto FileType = IGCLLVM::TargetMachine::CodeGenFileType::CGFT_AssemblyFile;
+ auto FileType = IGCLLVM::TargetMachine::CodeGenFileType::AssemblyFile;
llvm::raw_null_ostream NOS;
[[maybe_unused]] bool AddPasses =
@@ -578,13 +578,13 @@ struct DiagnosticContext {
bool Failed;
};
-void diagnosticHandlerCallback(const DiagnosticInfo &DI, void *Context) {
+void diagnosticHandlerCallback(const DiagnosticInfo *DI, void *Context) {
auto *DiagCtx = static_cast<DiagnosticContext *>(Context);
- auto Severity = DI.getSeverity();
+ auto Severity = DI->getSeverity();
DiagnosticPrinterRawOStream DP(DiagCtx->Log);
DiagCtx->Log << LLVMContext::getDiagnosticMessagePrefix(Severity) << ": ";
- DI.print(DP);
+ DI->print(DP);
DiagCtx->Log << "\n";
if (Severity == DS_Error)
@@ -639,7 +639,7 @@ vc::Compile(ArrayRef<char> Input, const vc::CompileOptions &Opts,
"Compiler error emitted in IR adaptors");
Triple TheTriple = overrideTripleWithVC(M.getTargetTriple());
- M.setTargetTriple(TheTriple.getTriple());
+ M.setTargetTriple(TheTriple);
auto ExpTargetMachine = createTargetMachine(Opts, ExtData, TheTriple);
if (!ExpTargetMachine)
@@ -735,7 +735,7 @@ parseApiOptions(StringSaver &Saver, StringRef ApiOptions, bool IsStrictMode) {
[&Opt](const char *ArgStr) { return Opt == ArgStr; });
};
const std::string VCCodeGenOptName =
- Options.getOption(OPT_vc_codegen).getPrefixedName();
+ Options.getOption(OPT_vc_codegen).getPrefixedName().str();
if (HasOption(VCCodeGenOptName)) {
const unsigned FlagsToInclude =
IGC::options::VCApiOption | IGC::options::IGCApiOption;
@@ -744,7 +744,7 @@ parseApiOptions(StringSaver &Saver, StringRef ApiOptions, bool IsStrictMode) {
}
// Deprecated -cmc parsing just for compatibility.
const std::string IgcmcOptName =
- Options.getOption(OPT_igcmc).getPrefixedName();
+ Options.getOption(OPT_igcmc).getPrefixedName().str();
if (HasOption(IgcmcOptName)) {
llvm::errs()
<< "'" << IgcmcOptName
diff --git a/IGC/VectorCompiler/lib/GenXCodeGen/GenXAnalysisDumper.cpp b/IGC/VectorCompiler/lib/GenXCodeGen/GenXAnalysisDumper.cpp
index e97e0de..c7a7f77 100644
--- a/IGC/VectorCompiler/lib/GenXCodeGen/GenXAnalysisDumper.cpp
+++ b/IGC/VectorCompiler/lib/GenXCodeGen/GenXAnalysisDumper.cpp
@@ -112,7 +112,7 @@ bool GenXAnalysisDumper::runOnFunction(Function &F) {
auto DumpName = makeOutputName(F, "f_" + DumpNamePrefix, DumpNameSuffix);
const auto &BC = getAnalysis<GenXBackendConfig>();
- vc::produceAuxiliaryShaderDumpFile(BC, DumpName, OS.str());
+ vc::produceAuxiliaryShaderDumpFile(BC, DumpName, StringRef(SerializedData));
return false;
}
@@ -126,6 +126,6 @@ bool GenXModuleAnalysisDumper::runOnModule(Module &M) {
auto DumpName = DumpNamePrefix + "M_" + DumpNameSuffix;
const auto &BC = getAnalysis<GenXBackendConfig>();
- vc::produceAuxiliaryShaderDumpFile(BC, DumpName, OS.str());
+ vc::produceAuxiliaryShaderDumpFile(BC, DumpName, StringRef(SerializedData));
return false;
}
diff --git a/IGC/VectorCompiler/lib/GenXCodeGen/GenXBaling.cpp b/IGC/VectorCompiler/lib/GenXCodeGen/GenXBaling.cpp
index e5fdbee..ca4f30c 100644
--- a/IGC/VectorCompiler/lib/GenXCodeGen/GenXBaling.cpp
+++ b/IGC/VectorCompiler/lib/GenXCodeGen/GenXBaling.cpp
@@ -1532,13 +1532,13 @@ void GenXBaling::processMainInst(Instruction *Inst, int IntrinID) {
// SimplifyInstruction does not work on abs, so we roll our own for now.
if (auto C = dyn_cast<Constant>(Inst->getOperand(0))) {
if (C->getType()->isIntOrIntVectorTy()) {
- if (!ConstantExpr::getICmp(CmpInst::ICMP_SLT, C,
+ if (!ConstantFoldCompareInstruction(CmpInst::ICMP_SLT, C,
Constant::getNullValue(C->getType()))
->isNullValue())
C = ConstantExpr::getNeg(C);
} else {
- if (!ConstantExpr::getFCmp(CmpInst::FCMP_OLT, C,
+ if (!ConstantFoldCompareInstruction(CmpInst::FCMP_OLT, C,
Constant::getNullValue(C->getType()))
->isNullValue()) {
C = llvm::ConstantFoldUnaryOpOperand(
diff --git a/IGC/VectorCompiler/lib/GenXCodeGen/GenXBiFPrepare.cpp b/IGC/VectorCompiler/lib/GenXCodeGen/GenXBiFPrepare.cpp
index 715f237..249cee3 100644
--- a/IGC/VectorCompiler/lib/GenXCodeGen/GenXBiFPrepare.cpp
+++ b/IGC/VectorCompiler/lib/GenXCodeGen/GenXBiFPrepare.cpp
@@ -115,7 +115,7 @@ bool GenXBiFPrepare::runOnModule(Module &M) {
bool GenXBiFPrepare::isLibraryFunction(const Function &F) {
const auto &Name = F.getName();
- return Name.startswith(vc::LibraryFunctionPrefix);
+ return Name.starts_with(vc::LibraryFunctionPrefix);
}
bool GenXBiFPrepare::isNeededForTarget(const Function &F,
@@ -138,17 +138,17 @@ bool GenXBiFPrepare::isNeededForTarget(const Function &F,
// Get rid of double precision fdiv and fsqrt emulation functions if target
// hw has native support
if (!ST.emulateFDivFSqrt64() &&
- (Name.startswith("fdiv") || Name.startswith("fsqrt")))
+ (Name.starts_with("fdiv") || Name.starts_with("fsqrt")))
return false;
}
- if (ST.hasIEEEDivSqrt() && Name.startswith("fdiv") &&
+ if (ST.hasIEEEDivSqrt() && Name.starts_with("fdiv") &&
F.getReturnType()->getScalarType()->isFloatTy())
return false;
static SmallVector<StringRef, 4> IDivRem = {"udiv", "sdiv", "urem", "srem"};
auto IsDivRem = llvm::any_of(
- IDivRem, [&Name](const auto &Arg) { return Name.startswith(Arg); });
+ IDivRem, [&Name](const auto &Arg) { return Name.starts_with(Arg); });
if (IsDivRem && ST.hasIntDivRem32() &&
!F.getReturnType()->isIntOrIntVectorTy(64))
return false;
@@ -156,34 +156,34 @@ bool GenXBiFPrepare::isNeededForTarget(const Function &F,
static SmallVector<StringRef, 4> FpCvt = {"fptosi", "fptoui", "sitofp",
"uitofp"};
auto IsFpCvt = llvm::any_of(
- FpCvt, [&Name](const auto &Arg) { return Name.startswith(Arg); });
+ FpCvt, [&Name](const auto &Arg) { return Name.starts_with(Arg); });
if (IsFpCvt && !ST.emulateLongLong())
return false;
// Remove L1-L2-L3 atomic routines for the platforms which don't support
// efficient 64-bit addressing
- if (!ST.supportEfficient64b() && Name.startswith("atomic") &&
- Name.endswith("v3i8"))
+ if (!ST.supportEfficient64b() && Name.starts_with("atomic") &&
+ Name.ends_with("v3i8"))
return false;
- if (!ST.hasMxfp() && Name.startswith("mxfp"))
+ if (!ST.hasMxfp() && Name.starts_with("mxfp"))
return false;
bool Is64bit =
IsDouble || F.getReturnType()->getScalarType()->isIntegerTy(64);
- if (!ST.hasLocalIntegerCas64() && Is64bit && Name.startswith("atomic_slm"))
+ if (!ST.hasLocalIntegerCas64() && Is64bit && Name.starts_with("atomic_slm"))
return false;
if (ST.hasInstrLocalAtomicAddF32() &&
F.getReturnType()->getScalarType()->isFloatTy() &&
- Name.startswith("atomic_slm"))
+ Name.starts_with("atomic_slm"))
return false;
// only half precision uses i32 data type
if (ST.hasInstrAtomicHF16() &&
F.getReturnType()->getScalarType()->isIntegerTy(32) &&
- Name.startswith("atomic_"))
+ Name.starts_with("atomic_"))
return false;
return true;
diff --git a/IGC/VectorCompiler/lib/GenXCodeGen/GenXBuiltinFunctions.cpp b/IGC/VectorCompiler/lib/GenXCodeGen/GenXBuiltinFunctions.cpp
index dc4d307..bb79f1e 100644
--- a/IGC/VectorCompiler/lib/GenXCodeGen/GenXBuiltinFunctions.cpp
+++ b/IGC/VectorCompiler/lib/GenXCodeGen/GenXBuiltinFunctions.cpp
@@ -71,7 +71,7 @@ private:
StringRef Suffix = "");
std::unique_ptr<Module> loadBuiltinLib(LLVMContext &Ctx, const DataLayout &DL,
- const std::string &Triple);
+ const Triple &Triple);
Value *createLibraryCall(Instruction &I, Function *Func,
ArrayRef<Value *> Args);
@@ -518,7 +518,7 @@ Function *GenXBuiltinFunctions::getBuiltinDeclaration(Module &M, StringRef Name,
std::unique_ptr<Module>
GenXBuiltinFunctions::loadBuiltinLib(LLVMContext &Ctx, const DataLayout &DL,
- const std::string &Triple) {
+ const Triple &Triple) {
MemoryBufferRef BiFBuffer =
getAnalysis<GenXBackendConfig>().getBiFModule(BiFKind::VCBuiltins);
diff --git a/IGC/VectorCompiler/lib/GenXCodeGen/GenXCisaBuilder.cpp b/IGC/VectorCompiler/lib/GenXCodeGen/GenXCisaBuilder.cpp
index 1b2b444..59a369d 100644
--- a/IGC/VectorCompiler/lib/GenXCodeGen/GenXCisaBuilder.cpp
+++ b/IGC/VectorCompiler/lib/GenXCodeGen/GenXCisaBuilder.cpp
@@ -2151,7 +2151,7 @@ static void diagnoseInlineAsm(llvm::LLVMContext &Context,
DiagnosticSeverity DS_type) {
auto *CI = cast<CallInst>(Inst);
const InlineAsm *IA = cast<InlineAsm>(IGCLLVM::getCalledValue(CI));
- const std::string Message = '"' + IA->getAsmString() + '"' + Suffix;
+ const std::string Message = std::string(1, 34) + IA->getAsmString().str() + std::string(1, 34) + Suffix;
vc::diagnose(Context, "GenXCisaBuilder", Message.c_str(), DS_type,
vc::WarningName::Generic, Inst);
}
diff --git a/IGC/VectorCompiler/lib/GenXCodeGen/GenXCoalescing.cpp b/IGC/VectorCompiler/lib/GenXCodeGen/GenXCoalescing.cpp
index 8856cc8..6a3b604 100644
--- a/IGC/VectorCompiler/lib/GenXCodeGen/GenXCoalescing.cpp
+++ b/IGC/VectorCompiler/lib/GenXCodeGen/GenXCoalescing.cpp
@@ -1527,7 +1527,7 @@ void GenXCoalescing::processKernelArgs(FunctionGroup *FG) {
auto F = FG->getHead();
if (!vc::isKernel(F))
return;
- Instruction *InsertBefore = F->front().getFirstNonPHIOrDbg();
+ Instruction *InsertBefore = &*F->front().getFirstNonPHIOrDbg();
vc::KernelMetadata KM{F};
unsigned Idx = 0;
for (auto ai = F->arg_begin(), ae = F->arg_end(); ai != ae; ++ai) {
diff --git a/IGC/VectorCompiler/lib/GenXCodeGen/GenXDebugInfo.cpp b/IGC/VectorCompiler/lib/GenXCodeGen/GenXDebugInfo.cpp
index c279758..ccdf11e 100644
--- a/IGC/VectorCompiler/lib/GenXCodeGen/GenXDebugInfo.cpp
+++ b/IGC/VectorCompiler/lib/GenXCodeGen/GenXDebugInfo.cpp
@@ -1,1598 +1,13 @@
-/*========================== begin_copyright_notice ============================
-
-Copyright (C) 2020-2026 Intel Corporation
-
-SPDX-License-Identifier: MIT
-
-============================= end_copyright_notice ===========================*/
-
-#include "FunctionGroup.h"
-
#include "GenXDebugInfo.h"
-#include "GenXTargetMachine.h"
-#include "GenXVisaRegAlloc.h"
-
-#include "vc/Support/BackendConfig.h"
-#include "vc/Support/GenXDiagnostic.h"
-#include "vc/Utils/GenX/KernelInfo.h"
-
-#include "visa/include/visaBuilder_interface.h"
-
-#include "DebugInfo/DwarfCompileUnit.hpp"
-#include "DebugInfo/StreamEmitter.hpp"
-#include "DebugInfo/VISADebugInfo.hpp"
-#include "DebugInfo/VISAIDebugEmitter.hpp"
-#include "DebugInfo/VISAModule.hpp"
-
-#include <llvm/Analysis/CallGraph.h>
-#include <llvm/CodeGen/TargetPassConfig.h>
-#include <llvm/IR/DebugInfoMetadata.h>
-#include <llvm/IR/Function.h>
-#include <llvm/IR/Instruction.h>
-#include <llvm/IR/IntrinsicInst.h>
-#include <llvm/InitializePasses.h>
-#include <llvm/Support/CommandLine.h>
-#include <llvm/Support/Casting.h>
-#include <llvm/Support/Errc.h>
-#include <llvm/Support/Error.h>
-
-#include "llvmWrapper/IR/DerivedTypes.h"
-
-#include "Probe/Assertion.h"
-
-#include <unordered_set>
-
-//
-/// GenXDebugInfo
-/// -------------
-///
-/// The goal of the pass is to provide debug information for each generated
-/// genisa instruction (if such information is available). The debug
-/// information is encoded in DWARF format.
-///
-/// Ultimately, the pass gets data from 2 sources:
-///
-/// 1. LLVM debug information encoded in LLVM IR itself. It captures the
-/// important pieces of the source language's Abstract Syntax Tree and
-/// maps it onto LLVM code.
-/// LLVM framework should maintain it automatically, given that we follow
-/// relatively simple rules while designing IR transformations:
-/// https://llvm.org/docs/HowToUpdateDebugInfo.html
-///
-/// 2. Debug information obtained from the finalizer. This information is
-/// encoded in some proprietary format (blob) and contains the following:
-/// a. mapping between vISA and genISA instructions
-/// b. live intervals of the virtual registers, information about spilled
-/// values, etc.
-/// c. call frame information
-///
-/// The pass feeds the above information to the DebugInfo library which in turn
-/// produces the final DWARF.
-///
-/// Operation of the pass
-/// ^^^^^^^^^^^^^^^^^^^^^
-///
-/// The pass assumes that some data is already being made available by other
-/// passes/analysis.
-///
-/// * FunctionGroupAnalysis:
-/// provides information about the overall "structure"
-/// of the program: functions, stack calls, indirect calls, subroutines and
-/// relationships.
-///
-/// * GenXModule:
-/// 1. for each LLVM Function provides information about
-/// LLVM instruction -> vISA instructions mapping. This information is
-/// produced/maintained during operation of CISABuilder pass.
-/// 2. for each LLVM Function provides access to a corresponding
-/// *VISAKernel* object.
-///
-/// * GenXVisaRegAlloc:
-/// provides the mapping between LLVM values and virtual registers.
-///
-/// * GenXCisaBuilder:
-/// provides access to VISABuilder, which allows us to have access to
-/// VISAKernel objects (some Functions from LLVM IR, like the ones
-/// representing kernel spawns these) that contain:
-/// a. debug information maintained by finalizer (see above)
-/// b. the respected gen binaries
-///
-/// Data Structures
-/// ^^^^^^^^^^^^^^^
-///
-/// Since data is aggregated from different sources, some extra data structures
-/// are used to simplify bookkeeping.
-///
-/// - *genx::di::VisaMapping*
-/// provides the mapping from LLMV IR instruction to vISA instruction index,
-/// that represents the first vISA instruction spawned by the LLVM IR
-/// instruction. A single LLVM IR instruction can spawn several
-/// vISA instructions - currently the number of spawned instructions is
-/// derived implicitly (which is not always correct but works in most of the
-/// cases).
-///
-/// - *ModuleToVisaTransformInfo*
-/// Provides information about how LLVM IR functions are mapped onto various
-/// vISA (and genISA) objects. Allows us to answer the following questions:
-/// - Is a function a subroutine on vISA level?
-/// - If a function is a subroutine, what LLVM IR function corresponds to
-/// vISA-level "owner" of this subroutine. An "owner" in this case is
-/// either VISAFunction or VISAKernel containing the subroutine.
-/// - Is LLVM IR function a "primary" one? "primary" function is the one
-/// that spawns vISA entity that gets compiled into a separate gen object
-/// - For an arbitrary LLVM IR function, get a set of "primary" functions
-/// that contain a compiled vISA corresponding to the function in question
-/// compiled into their gen objects.
-///
-/// - *ProgramInfo*
-/// A transient object that groups several llvm Functions that are eventually
-/// get compiled into a single gen entity. A separate elf file with the
-/// debug information is generated for each gen entity.
-/// The grouping is with a help of *ModuleToVisaTransformInfo* object.
-///
-/// - *GenObjectWrapper*
-/// Wrapper over the data produced by the finalizer after a kernel gets
-/// compiled. Simplifies/Provides access to the following:
-/// + gen binary (gen machine instructions)
-/// + decoded *gen* debug info and raw gen debug info blob
-/// + FINALIZER_INFO structure
-///
-/// - *CompiledVisaWrapper*
-/// For an arbitrary pair of llvm IR Function and VISAKernel objects,
-/// does the following:
-/// + Validates that IR Function and VISAKernel object are related (that is
-/// the vISA spawned by IR Function is owned by the VISAKernel.
-/// + Provides services to access *gen* debug info from an appropriate
-/// compiled object (*gen* debug info concept).
-///
-/// *GenXFunction*
-/// An object that loosely resembles MachineFunction from the LLVM Machine IR.
-/// This is an object that for a given LLVM IR Function provides access to:
-/// - LLVM IR Function
-/// - VisaMapping
-/// - Subtarget
-/// - data from CompiledVisaWrapper/GenObjectWrapper
-/// - GenXVisaRegAlloc
-/// GenXFunctoin serves as a primary method to communicate with the DebugInfo
-/// library. The data these objects hold allow us to reason about the debug
-/// information for any Gen construct (instruction, variable, etc).
-///
-/// Examples
-/// ^^^^^^^^
-///
-/// Examples below use the following naming conventions:
-/// K* - kernel function
-/// L* - subroutine (non-inlined function)
-/// S* - simple stack call
-/// I* - indirectly-called function
-///
-/// FunctionGroup construction peculiarities.
-///
-/// When function groups are constructed, we do some peculiar transformations.
-///
-/// Case_1 (FG):
-/// Source Code: { K1 calls L1, K2 calls L1 }
-/// IR after function groups: { G1 = {K1, L1}, G2 = { K2, L1'} },
-/// where L1' is a clone of L1.
-/// Case_2 (FG):
-/// Source Code: { K1 calls S_1, both call L1 }.
-/// IR after function groups: { G1 = {K1, L1, S1, L1' } }.
-/// Case_3 (FG):
-/// Source Code: { K1 calls I1 and I2 }.
-/// IR after function grups { G1 = {K1}, G2 = {I1}, G3={I2} }.
-///
-/// VISA/genISA construction peculiarities.
-///
-/// Case 1:
-/// Source code: K1, K2.
-/// Compilation phase:
-/// two function groups are created, K1 and K2 are heads.
-/// two different VISAKernel produced.
-/// DebugInfoGeneration:
-/// Decoded Debug info for each VISAKernel contains:
-/// one compiled object description.
-/// two "*.elf" files are created.
-///
-/// Case 2:
-/// Source code: K1, S1. K1 calls S1.
-/// Compilation phase:
-/// 1 function group is created, K1 is the head.
-/// 1 VISAKernel and 1 VISAFunction are created.
-/// DebugInfoGeneratation:
-/// Decoded debug info contains *2* compiled objects.
-/// Each object has separate vISA indexes - visa instructions are
-/// counted separately. Still, both are compiled into the same gen
-/// object, so only one "*.elf" file is emitted.
-///
-/// Case 3:
-/// Source code: K1, I1. K1 calls I1
-/// Compilation phase:
-/// 1 function group is created, K1 is the head.
-/// Somehow 2 VISAKernels are created.
-/// DebugInfoGeneratation:
-/// Decoded debug info contains *1* compiled objects (but we have 2
-/// VISAKernel).
-/// In the end, we emit two "*.elf" files.
-///
-//===----------------------------------------------------------------------===//
-
-#define DEBUG_TYPE "GENX_DEBUG_INFO"
using namespace llvm;
-static cl::opt<bool>
- DbgOpt_ValidationEnable("vc-dbginfo-enable-validation", cl::init(false),
- cl::Hidden,
- cl::desc("same as IGC_DebugInfoValidation"));
-static cl::opt<bool>
- DbgOpt_ZeBinCompatible("vc-experimental-dbg-info-zebin-compatible",
- cl::init(false), cl::Hidden,
- cl::desc("same as IGC_ZeBinCompatibleDebugging"));
-
-static cl::opt<std::string> DbgOpt_VisaTransformInfoPath(
- "vc-dump-module-to-visa-transform-info-path", cl::init(""), cl::Hidden,
- cl::desc("filename into which MVTI is dumped"));
-
-static cl::opt<bool> DbgOpt_VisaMappingPrintDbgIntrinsics(
- "vc-dump-visa-mapping-includes-dbgintrin", cl::init(false), cl::Hidden,
- cl::desc("include llvm.dbg intrinsics in visa mapping dump"));
-
-template <typename ContainerT>
-using EmplaceTy = decltype(std::declval<ContainerT>().emplace());
-
-template <typename ContainerT>
-using CheckedEmplace = decltype(std::declval<EmplaceTy<ContainerT>>().second);
-
-template <typename ContainerT>
-using IsCheckedEmplace = std::is_same<bool, CheckedEmplace<ContainerT>>;
-
-template <typename ContainerT>
-using IsNonCheckedEmplace =
- std::is_same<EmplaceTy<ContainerT>, typename ContainerT::iterator>;
-
-// Naive function that checks the presence of copies.
-// Container must be multimap-like, values must be comparable.
-template <typename ContainerT>
-static bool hasCopy(const ContainerT &Container,
- typename ContainerT::iterator ToCheck) {
- auto Range = Container.equal_range(ToCheck->first);
- auto Result = std::count_if(Range.first, Range.second, [ToCheck](auto It) {
- return It.second == ToCheck->second;
- });
-
- return Result > 1;
-}
-
-// checkedEmplace for multimap-like containers. It will be called if
-// Container.emplace() returns Container::iterator. For such containers, emplace
-// will always happen and therefore copies can be silently inserted.
-template <typename ContainerT, class... ArgsT>
-static std::enable_if_t<IsNonCheckedEmplace<ContainerT>::value, void>
-checkedEmplace(ContainerT &Container, ArgsT &&...Args) {
- auto Result = Container.emplace(std::forward<ArgsT>(Args)...);
- IGC_ASSERT_MESSAGE(!hasCopy(Container, Result),
- "a copy of the existing element was emplaced");
- (void)Result;
-}
-
-// checkedEmplace for map/set-like containers. If Container.emplace() returns a
-// pair whose second element has bool type, this version will be called.
-template <typename ContainerT, class... ArgsT>
-static std::enable_if_t<IsCheckedEmplace<ContainerT>::value, void>
-checkedEmplace(ContainerT &Container, ArgsT &&...Args) {
- auto Result = Container.emplace(std::forward<ArgsT>(Args)...);
- IGC_ASSERT_MESSAGE(Result.second, "unexpected insertion failure");
- (void)Result;
-}
-
-static bool compareFunctionNames(const Function *LF, const Function *RF) {
- IGC_ASSERT(LF && RF);
- return LF->getName() > RF->getName();
-}
-
-template <typename ContainerT>
-static std::vector<const Function *>
-extractSortedFunctions(const ContainerT &C) {
- std::vector<const Function *> Result;
- std::transform(C.begin(), C.end(), std::back_inserter(Result),
- [](const auto &It) { return It.first; });
- std::sort(Result.begin(), Result.end(), compareFunctionNames);
- return Result;
-}
-
-// NOTE: the term "program" is used to avoid a potential confusion
-// since the term "kernel" may introduce some ambiguity.
-// Here a "program" represents a kind of wrapper over a standalone vISA
-// object (which currently is produced by function groups and
-// visa-external functions) that finally gets compiled into a stand-alone
-// gen entity (binary gen kernel) with some auxiliary information
-struct ProgramInfo {
- struct FunctionInfo {
- const genx::di::VisaMapping &VisaMapping;
- const Function &F;
- };
-
- const ModuleToVisaTransformInfo &MVTI;
- VISAKernel &CompiledKernel;
- std::vector<FunctionInfo> FIs;
-
- const Function &getEntryPoint() const {
- IGC_ASSERT(!FIs.empty());
- return FIs.front().F;
- }
-};
-
-//
-// ModuleToVisaTransformInfo
-// Proides information about how LLVM IR functions are mapped onto various
-// vISA (and genISA) objects.
-class ModuleToVisaTransformInfo {
- using FunctionMapping =
- std::unordered_map<const Function *, const Function *>;
- using FunctionMultiMapping =
- std::unordered_multimap<const Function *, const Function *>;
- // Note: pointer to VISAKernel can represent either a true kernel or
- // VISAFunction, depending on the context (this is vISA API limitation)
- using FunctionToVisaMapping =
- std::unordered_map<const Function *, VISAKernel *>;
-
- // Records information about a subroutine and its "owner". The "owner" of
- // a subroutine is LLVM IR function that spawned *VISAFunction* that contains
- // vISA for the subroutine
- FunctionMapping SubroutineOwnersInfo;
- // "VisaSpanwer" is LLVM IR function that produce *VISAFunction*.
- // Different "VISAFunctions" have their own vISA instructions enumerated
- // separately, but they still can be compiled into a single gen object.
- // does not allow to distiguish those easily).
- FunctionToVisaMapping VisaSpawnerInfo;
- // A separate gen object is usually produced by KernelFunctions -
- // the relationsip between VisaFunction and KernelFunctions is
- // captured by the FunctionOnwers
- FunctionMultiMapping FunctionOwnersInfo;
- // "Kernel functions" are functions that produce genISA object
- // Usually these are FuntionGroup heads, but indirectly-called functions
- // also spawn there own genISA object files
- FunctionToVisaMapping KernelFunctionsInfo;
- std::unordered_set<const Function *> SourceLevelKernels;
-
- void extractSubroutineInfo(const Function &F, VISABuilder &VB,
- const FunctionGroupAnalysis &FGA);
- void extractVisaFunctionsEmitters(VISABuilder &VB,
- const FunctionGroupAnalysis &FGA,
- const CallGraph &CG);
-
- void extractKernelFunctions(VISABuilder &VB,
- const FunctionGroupAnalysis &FGA);
- void propagatePrimaryEmitter(const CallGraphNode &CGNode,
- const Function &PrimaryEmitter);
-
-public:
- void print(raw_ostream &OS) const;
- void dump() const;
-
- bool isSourceLevelKernel(const Function *F) const {
- return SourceLevelKernels.find(F) != SourceLevelKernels.end();
- }
- bool isKernelFunction(const Function *F) const {
- return KernelFunctionsInfo.find(F) != KernelFunctionsInfo.end();
- }
- bool isSubroutine(const Function *F) const {
- return SubroutineOwnersInfo.find(F) != SubroutineOwnersInfo.end();
- }
- bool isVisaFunctionSpawner(const Function *F) const {
- return VisaSpawnerInfo.find(F) != VisaSpawnerInfo.end();
- }
- // Currently unused
- // For a provided function returns visa object spawned by this function
- // visa object can represent either VISAKernel or VISAFunction
- VISAKernel *getSpawnedVISAFunction(const Function *F) const {
- IGC_ASSERT(!isSubroutine(F));
- auto SpawnedInfoIt = VisaSpawnerInfo.find(F);
- IGC_ASSERT_EXIT(SpawnedInfoIt != VisaSpawnerInfo.end());
- return SpawnedInfoIt->second;
- }
- // Return a VISA object representing true *VISAKernel* that was spawned by a
- // "kernel" function: IR kernel or indirectly called function.
- VISAKernel *getSpawnedVISAKernel(const Function *F) const {
- IGC_ASSERT_MESSAGE(isKernelFunction(F),
- "kernel or indirectly called function is expected");
- return KernelFunctionsInfo.at(F);
- }
- // return an "owner" (on vISA level) of the function representing a
- // subroutine
- const Function *getSubroutineOwner(const Function *F) const {
- IGC_ASSERT(isSubroutine(F));
- auto SubInfoIt = SubroutineOwnersInfo.find(F);
- IGC_ASSERT_EXIT(SubInfoIt != SubroutineOwnersInfo.end());
- return SubInfoIt->second;
- }
- // PrimaryEmitter is the function spawning gen object, that
- // contains the vISA object emitted by the specified function
- std::unordered_set<const Function *>
- getPrimaryEmittersForVisa(const Function *F, bool Strict = true) const;
-
- std::vector<const Function *> getPrimaryFunctions() const {
- return extractSortedFunctions(KernelFunctionsInfo);
- }
-
- std::vector<const Function *>
- getSecondaryFunctions(const Function *PrimaryFunction) const;
-
- ModuleToVisaTransformInfo(VISABuilder &VB, const FunctionGroupAnalysis &FGA,
- const CallGraph &CG);
-};
-
-#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
-void ModuleToVisaTransformInfo::dump() const {
- print(errs());
- errs() << "\n";
-}
-#endif
-
-void ModuleToVisaTransformInfo::print(raw_ostream &OS) const {
-
- auto KernelFunctions = extractSortedFunctions(KernelFunctionsInfo);
- auto Subroutines = extractSortedFunctions(SubroutineOwnersInfo);
- auto VisaProducers = extractSortedFunctions(VisaSpawnerInfo);
-
- // filter-out kernel functions
- VisaProducers.erase(
- std::remove_if(VisaProducers.begin(), VisaProducers.end(),
- [this](const auto *F) { return isKernelFunction(F); }),
- VisaProducers.end());
-
- auto PrintFunctionSubroutines = [this, &OS, &Subroutines](const Function *F,
- StringRef Prefix) {
- unsigned Counter = 0;
- for (const auto *LF : Subroutines) {
- if (getSubroutineOwner(LF) != F)
- continue;
- OS << Prefix << "l." << Counter << " " << LF->getName() << "\n";
- ++Counter;
- }
- };
-
- for (size_t i = 0, NumKF = KernelFunctions.size(); i < NumKF; ++i) {
- const auto *KF = KernelFunctions[i];
- OS << "[" << i << "] " << KF->getName() << " "
- << (SourceLevelKernels.count(KF) != 0 ? "(K)" : "(I)") << "\n";
-
- PrintFunctionSubroutines(KF, " ");
-
- unsigned SubIdx = 0;
- for (const auto *VF : VisaProducers) {
- if (!getPrimaryEmittersForVisa(VF).count(KF))
- continue;
- OS << " v." << SubIdx << " " << VF->getName() << "\n";
- PrintFunctionSubroutines(VF, " ");
- ++SubIdx;
- }
- }
-}
-
-using VMap = decltype(genx::di::VisaMapping::V2I);
-// Compare two functions with their visa-mapping
-static bool visaMapComparer(const Function *L, const Function *R,
- const VMap &V2IL, const VMap &V2IR) {
- if (V2IL.empty() && V2IR.empty())
- return compareFunctionNames(L, R);
- if (V2IL.empty())
- return false;
- if (V2IR.empty())
- return true;
- return V2IL.front().VisaIdx < V2IR.front().VisaIdx;
-}
-
-std::vector<const Function *> ModuleToVisaTransformInfo::getSecondaryFunctions(
- const Function *PrimaryFunction) const {
- auto IsSecondaryFunction = [PrimaryFunction, this](const Function *F) {
- if (F == PrimaryFunction)
- return false;
- return getPrimaryEmittersForVisa(F).count(PrimaryFunction) > 0;
- };
- IGC_ASSERT(isKernelFunction(PrimaryFunction));
- std::vector<const Function *> Result;
- for (const auto &[F, VF] : SubroutineOwnersInfo) {
- (void)VF;
- if (IsSecondaryFunction(F))
- Result.push_back(F);
- }
- for (const auto &[F, VF] : VisaSpawnerInfo) {
- (void)VF;
- if (IsSecondaryFunction(F))
- Result.push_back(F);
- }
- return Result;
-}
-
-void ModuleToVisaTransformInfo::extractSubroutineInfo(
- const Function &F, VISABuilder &VB, const FunctionGroupAnalysis &FGA) {
- IGC_ASSERT(isVisaFunctionSpawner(&F));
- const auto *Gr = FGA.getAnyGroup(&F);
- IGC_ASSERT(Gr);
- for (const Function *SF : *Gr) {
- if (isKernelFunction(SF))
- continue;
- if (vc::requiresStackCall(SF))
- continue;
- checkedEmplace(SubroutineOwnersInfo, SF, &F);
- }
-}
-
-std::unordered_set<const Function *>
-ModuleToVisaTransformInfo::getPrimaryEmittersForVisa(const Function *F,
- bool Strict) const {
- if (isSubroutine(F)) {
- auto SubrInfoIt = SubroutineOwnersInfo.find(F);
- IGC_ASSERT_EXIT(SubrInfoIt != SubroutineOwnersInfo.end());
- const Function *SubrOwner = SubrInfoIt->second;
- IGC_ASSERT(SubrOwner);
- IGC_ASSERT(!isSubroutine(SubrOwner));
- return getPrimaryEmittersForVisa(SubrOwner);
- }
- auto InfoRange = FunctionOwnersInfo.equal_range(F);
- std::unordered_set<const Function *> PrimaryEmitters;
- std::transform(InfoRange.first, InfoRange.second,
- std::inserter(PrimaryEmitters, PrimaryEmitters.end()),
- [](auto It) { return It.second; });
-
- if (Strict) {
- IGC_ASSERT_MESSAGE(!PrimaryEmitters.empty(),
- "could not get primary emitter");
- }
- return PrimaryEmitters;
-}
-
-void ModuleToVisaTransformInfo::propagatePrimaryEmitter(
- const CallGraphNode &CGNode, const Function &PrimaryEmitter) {
- const Function *F = CGNode.getFunction();
- if (!F)
- return;
- if (vc::requiresStackCall(F) && !vc::isIndirect(F)) {
- auto Range = FunctionOwnersInfo.equal_range(F);
- auto Res =
- std::find_if(Range.first, Range.second, [&PrimaryEmitter](auto Info) {
- return Info.second == &PrimaryEmitter;
- });
- // F -> PrimaryEmitter was already inserted. It happens if a recursion
- // exists.
- if (Res != Range.second)
- return;
- LLVM_DEBUG(dbgs() << "setting <" << PrimaryEmitter.getName()
- << "> as a host of the stack-callee <" << F->getName()
- << ">\n");
- checkedEmplace(FunctionOwnersInfo, F, &PrimaryEmitter);
- }
-
- for (const auto &CalleeCGNode : CGNode)
- propagatePrimaryEmitter(*CalleeCGNode.second, PrimaryEmitter);
-}
-
-void ModuleToVisaTransformInfo::extractVisaFunctionsEmitters(
- VISABuilder &VB, const FunctionGroupAnalysis &FGA, const CallGraph &CG) {
-
- // We've already collected kernels and indirect functions into
- // `KernelFunctionsInfo`.
- for (const auto &[F, VF] : KernelFunctionsInfo) {
- (void)VF;
- const auto *KFNode = CG[F];
- IGC_ASSERT(KFNode);
- propagatePrimaryEmitter(*KFNode, *F);
- }
- // Collect owned functions as a set of unique keys of FunctionOwnersInfo.
- std::unordered_set<const Function *> OwnedFunctions;
- std::transform(FunctionOwnersInfo.begin(), FunctionOwnersInfo.end(),
- std::inserter(OwnedFunctions, OwnedFunctions.begin()),
- [](auto Info) { return Info.first; });
-
- for (const Function *F : OwnedFunctions) {
- // Skip "KernelFunctions" because they have already been processed.
- if (vc::isIndirect(F) || vc::isKernel(F))
- continue;
- VISAKernel *VF = VB.GetVISAKernel(F->getName().str());
- checkedEmplace(VisaSpawnerInfo, F, VF);
- extractSubroutineInfo(*F, VB, FGA);
- }
-}
-
-void ModuleToVisaTransformInfo::extractKernelFunctions(
- VISABuilder &VB, const FunctionGroupAnalysis &FGA) {
- for (const auto *FG : FGA.AllGroups()) {
- for (const Function *F : *FG) {
- if (!vc::isIndirect(F) && !vc::isKernel(F))
- continue;
- VISAKernel *VF = VB.GetVISAKernel(F->getName().str());
- if (vc::isKernel(F))
- checkedEmplace(SourceLevelKernels, F);
- checkedEmplace(KernelFunctionsInfo, F, VF);
- checkedEmplace(VisaSpawnerInfo, F, VF);
- checkedEmplace(FunctionOwnersInfo, F, F);
-
- extractSubroutineInfo(*F, VB, FGA);
- }
- }
-}
-
-ModuleToVisaTransformInfo::ModuleToVisaTransformInfo(
- VISABuilder &VB, const FunctionGroupAnalysis &FGA, const CallGraph &CG) {
- extractKernelFunctions(VB, FGA);
- extractVisaFunctionsEmitters(VB, FGA, CG);
-
- for (const auto *FG : FGA.AllGroups()) {
- for (const Function *F : *FG) {
- if (isSourceLevelKernel(F))
- IGC_ASSERT(isKernelFunction(F) && isVisaFunctionSpawner(F) &&
- !isSubroutine(F));
- if (isKernelFunction(F))
- IGC_ASSERT(isVisaFunctionSpawner(F) && !isSubroutine(F));
- if (isVisaFunctionSpawner(F))
- IGC_ASSERT(!isSubroutine(F));
- if (isSubroutine(F))
- IGC_ASSERT(!isVisaFunctionSpawner(F) && !isKernelFunction(F));
- }
- }
-}
-
-namespace {
-
-class GenObjectWrapper {
- vISA::FINALIZER_INFO *JitInfo = nullptr;
- std::unique_ptr<IGC::VISADebugInfo> VISADebugInfo;
- // TODO: remove this once DbgDecoder is refactored
- unsigned GenDbgInfoDataSize = 0;
- void *GenDbgInfoDataPtr = nullptr;
-
- int GenBinaryDataSize = 0;
- void *GenBinaryDataPtr = nullptr;
-
- const Function &EntryPoint;
-
- std::string ErrMsg;
-
- void setError(const Twine &Msg) {
- ErrMsg.append((Msg + "<" + EntryPoint.getName().str() + ">").str());
-
- LLVM_DEBUG(dbgs() << "GOW creation for <" << EntryPoint.getName()
- << "> aborted: " << Msg.str());
- }
-
-public:
- const Function &getEntryPoint() const { return EntryPoint; }
-
- ArrayRef<char> getGenDebug() const {
- IGC_ASSERT(GenDbgInfoDataPtr);
- return ArrayRef<char>(static_cast<char *>(GenDbgInfoDataPtr),
- GenDbgInfoDataSize);
- }
-
- ArrayRef<char> getGenBinary() const {
- IGC_ASSERT(GenBinaryDataPtr);
- return ArrayRef<char>(static_cast<char *>(GenBinaryDataPtr),
- GenBinaryDataSize);
- }
-
- const IGC::VISADebugInfo &getVISADebugInfo() const {
- IGC_ASSERT(VISADebugInfo);
- return *VISADebugInfo;
- }
-
- const vISA::FINALIZER_INFO &getJitInfo() const {
- IGC_ASSERT(!hasErrors() && JitInfo);
- return *JitInfo;
- };
-
- GenObjectWrapper(VISAKernel &VK, const Function &F);
- ~GenObjectWrapper() { releaseDebugInfoResources(); }
- GenObjectWrapper(const GenObjectWrapper &) = delete;
- GenObjectWrapper &operator=(const GenObjectWrapper &) = delete;
-
- bool hasErrors() const { return !ErrMsg.empty(); }
-
- const std::string &getError() const { return ErrMsg; }
-
- void releaseDebugInfoResources() {
- if (!GenDbgInfoDataPtr) {
- IGC_ASSERT(GenDbgInfoDataSize == 0);
- return;
- }
- freeBlock(GenDbgInfoDataPtr);
- GenDbgInfoDataPtr = nullptr;
- GenDbgInfoDataSize = 0;
- }
-
- void printDecodedGenXDebug(raw_ostream &OS) const {
- IGC_ASSERT(!hasErrors());
- LLVM_DEBUG(dbgs() << "GenXDebugInfo size: " << GenDbgInfoDataSize << "\n");
- getVISADebugInfo().print(OS);
- }
-};
-
-GenObjectWrapper::GenObjectWrapper(VISAKernel &VK, const Function &F)
- : EntryPoint(F) {
- if (VK.GetJitInfo(JitInfo) != 0) {
- setError("could not extract jitter info");
- return;
- }
- IGC_ASSERT(JitInfo);
-
- // Extract Gen Binary (will need it for line table generation)
- VK.GetGenxBinary(GenBinaryDataPtr, GenBinaryDataSize);
- if (GenBinaryDataSize <= 0) {
- setError("could not extract gen binary from finalizer");
- return;
- }
-
- if (VK.GetGenxDebugInfo(GenDbgInfoDataPtr, GenDbgInfoDataSize) != 0) {
- setError("could not get gen debug information from finalizer");
- return;
- }
- if (!GenDbgInfoDataPtr) {
- setError("gen debug information reported by finalizer is inconsistent");
- return;
- }
- VISADebugInfo = std::make_unique<IGC::VISADebugInfo>(GenDbgInfoDataPtr);
-};
-
-class CompiledVisaWrapper {
-
- using FinalizedDI = IGC::DbgDecoder::DbgInfoFormat;
-
- const GenObjectWrapper &GOW;
- // underlying data is owned by VISADebugInfo, owned by GOW
- const FinalizedDI *VisaKernelDI = nullptr;
-
- std::string ErrMsg;
-
- void setErrorForFunction(const std::string &Err, const Function &F) {
- ErrMsg.append(Err).append("<").append(F.getName().str()).append(">");
-
- LLVM_DEBUG(dbgs() << "CW creation for <" << F.getName()
- << "> aborted: " << ErrMsg);
- }
-
-public:
- const vISA::FINALIZER_INFO &getJitInfo() const { return GOW.getJitInfo(); };
-
- const FinalizedDI &getFinalizerDI() const {
- IGC_ASSERT(ErrMsg.empty() && VisaKernelDI);
- return *VisaKernelDI;
- }
-
- const IGC::VISADebugInfo &getVISADebugInfo() const {
- return GOW.getVISADebugInfo();
- }
-
- ArrayRef<char> getGenDebug() const { return GOW.getGenDebug(); }
- ArrayRef<char> getGenBinary() const { return GOW.getGenBinary(); }
-
- const std::string &getError() const { return ErrMsg; }
-
- bool hasErrors() const { return !getError().empty(); }
-
- CompiledVisaWrapper(CompiledVisaWrapper &&Other) = default;
- CompiledVisaWrapper(const Function &F, StringRef CompiledObjectName,
- const GenObjectWrapper &GOWIn)
- : GOW(GOWIn) {
- struct Gen2VisaIdx {
- unsigned GenOffset;
- unsigned VisaIdx;
- };
- LLVM_DEBUG(dbgs() << "creating CW for <" << F.getName() << ">, using <"
- << CompiledObjectName
- << "> as a CompiledObject moniker\n");
- IGC_ASSERT(!GOW.hasErrors());
-
- const auto &CO = GOW.getVISADebugInfo().getRawDecodedData().compiledObjs;
- auto FoundCoIt = std::find_if(
- CO.begin(), CO.end(), [&CompiledObjectName](const auto &DI) {
- return CompiledObjectName == StringRef(DI.kernelName);
- });
- VisaKernelDI = (FoundCoIt == CO.end()) ? nullptr : &*FoundCoIt;
- if (!VisaKernelDI) {
- setErrorForFunction("could not find debug information for", F);
- return;
- }
- if (VisaKernelDI->CISAIndexMap.empty()) {
- setErrorForFunction("empty CisaIndexMap for", F);
- return;
- }
-
- std::vector<Gen2VisaIdx> Gen2Visa;
- std::transform(
- VisaKernelDI->CISAIndexMap.begin(), VisaKernelDI->CISAIndexMap.end(),
- std::back_inserter(Gen2Visa),
- [](const auto &V2G) { return Gen2VisaIdx{V2G.second, V2G.first}; });
-
- const auto &GenBinary = GOW.getGenBinary();
- // Make Sure that gen isa indeces are inside GenBinary
- const bool InBounds =
- std::all_of(Gen2Visa.begin(), Gen2Visa.end(), [&](const auto &Idx) {
- // <= Is because last index can be equal to the binary size
- return Idx.GenOffset <= GenBinary.size();
- });
- if (!InBounds) {
- setErrorForFunction("fatal error (debug info). inconsistent gen->visa "
- "mapping: gen index is out of bounds",
- F);
- return;
- }
-
- // Make Sure that gen isa indeces are unique and sorted
- const bool Sorted = std::is_sorted(
- Gen2Visa.begin(), Gen2Visa.end(),
- [](const auto &L, const auto &R) { return L.GenOffset < R.GenOffset; });
- const bool Validated =
- Sorted && (Gen2Visa.end() ==
- std::adjacent_find(Gen2Visa.begin(), Gen2Visa.end(),
- [](const auto &L, const auto &R) {
- return L.GenOffset == R.GenOffset;
- }));
- if (!Validated) {
- setErrorForFunction("fatal error (debug info). inconsistent gen->visa "
- "mapping: gen index are not ordered properly",
- F);
- return;
- }
- }
-};
-
-class GenXFunction final : public IGC::VISAModule {
-
-public:
- GenXFunction(const GenXSubtarget &STIn, const GenXVisaRegAlloc &RAIn,
- const GenXBaling &BAn, const Function &F,
- CompiledVisaWrapper &&CW, const genx::di::VisaMapping &V2I,
- const ModuleToVisaTransformInfo &MVTI, bool IsPrimary)
- : F{F}, ST{STIn}, VisaMapping{V2I}, CompiledVisa{std::move(CW)}, RA{RAIn},
- BA{BAn}, MVTI(MVTI), VISAModule(const_cast<Function *>(&F), IsPrimary) {
-
- if (MVTI.isSubroutine(&F))
- SetType(ObjectType::SUBROUTINE);
- else if (MVTI.isKernelFunction(&F))
- SetType(ObjectType::KERNEL);
- else
- SetType(ObjectType::STACKCALL_FUNC);
- }
-
- ~GenXFunction() {
- LLVM_DEBUG(dbgs() << "~GenXFunction() called for " << F.getName() << "\n");
- }
- GenXFunction(const GenXFunction &) = delete;
- GenXFunction &operator=(const GenXFunction &) = delete;
-
- llvm::StringRef GetVISAFuncName() const override {
- // TODO: this is not quite correct since VISA names is defined by VISA label
- return F.getName();
- }
-
- bool isSubroutine() const { return GetType() == ObjectType::SUBROUTINE; }
-
- bool isStackCall() const { return GetType() == ObjectType::STACKCALL_FUNC; }
-
- bool isKernel() const { return GetType() == ObjectType::KERNEL; }
-
- const IGC::VISAObjectDebugInfo &
- getVisaObjectDI(const IGC::VISADebugInfo &VDI) const override {
- StringRef CompiledObjectName =
- isSubroutine() ? MVTI.getSubroutineOwner(&F)->getName() : F.getName();
- return VDI.getVisaObjectByCompliledObjectName(CompiledObjectName);
- }
-
- unsigned int getUnpaddedProgramSize() const override {
- return CompiledVisa.getGenBinary().size();
- }
-
- bool isLineTableOnly() const override {
- IGC_ASSERT_MESSAGE(0, "isLineTableOnly()");
- return false;
- }
- unsigned getPrivateBaseReg() const override {
- IGC_ASSERT_MESSAGE(0, "getPrivateBaseReg() - not implemented");
- return 0;
- }
- unsigned getGRFSizeInBytes() const override { return ST.getGRFByteSize(); }
- unsigned getNumGRFs() const override {
- return CompiledVisa.getJitInfo().stats.numGRFTotal;
- }
- unsigned getPointerSize() const override {
- return F.getParent()->getDataLayout().getPointerSize();
- }
- uint64_t getTypeSizeInBits(Type *Ty) const override {
- return F.getParent()->getDataLayout().getTypeSizeInBits(Ty);
- }
- ArrayRef<char> getGenDebug() const override {
- return CompiledVisa.getGenDebug();
- }
- ArrayRef<char> getGenBinary() const override {
- return CompiledVisa.getGenBinary();
- }
-
- const IGC::VISADebugInfo &getVISADebugInfo() const {
- return CompiledVisa.getVISADebugInfo();
- }
-
- const IGC::DbgDecoder::DbgInfoFormat &getFinalizerDI() const {
- return CompiledVisa.getFinalizerDI();
- }
-
- const genx::di::VisaMapping &getVisaMapping() const { return VisaMapping; }
-
- static constexpr unsigned RdIndex =
- GenXIntrinsic::GenXRegion::RdIndexOperandNum;
- static constexpr unsigned RdVstride =
- GenXIntrinsic::GenXRegion::RdVStrideOperandNum;
- static constexpr unsigned RdWidth =
- GenXIntrinsic::GenXRegion::RdWidthOperandNum;
- static constexpr unsigned RdStride =
- GenXIntrinsic::GenXRegion::RdStrideOperandNum;
- static constexpr unsigned RdNumOp =
- GenXIntrinsic::GenXRegion::OldValueOperandNum;
-
- using OffsetsVector = llvm::SmallVector<unsigned, 0>;
-
- std::tuple<const Value *, OffsetsVector>
- calculateBaledLocation(const CallInst *UseInst, const GenXBaling &BA,
- const DataLayout &DL) const {
- IGC_ASSERT(UseInst);
- if (!GenXIntrinsic::isRdRegion(UseInst))
- return std::make_tuple(UseInst, OffsetsVector());
- auto BI = BA.getBaleInfo(UseInst);
-
- if (BI.Type != genx::BaleInfo::RDREGION ||
- !dyn_cast<ConstantInt>(UseInst->getOperand(RdIndex)) ||
- BI.isOperandBaled(RdNumOp) || !BA.isBaled(UseInst))
- return std::make_tuple(UseInst, OffsetsVector());
-
- auto GetSignConstant = [](Value *Operand) {
- auto *CI = cast<ConstantInt>(Operand);
- return CI->getSExtValue();
- };
-
- // In this place comes rdregion, whose operand is not baled - here we
- // build location for its operand
- LLVM_DEBUG(dbgs() << " Found Bale candidate for propagation:\n";
- UseInst->dump(););
- auto *VTy = dyn_cast<IGCLLVM::FixedVectorType>(UseInst->getType());
- // TODO: Investigate scalar
- if (!VTy)
- return std::make_tuple(UseInst, OffsetsVector());
- auto Vstride = GetSignConstant(UseInst->getOperand(RdVstride));
- auto Width = GetSignConstant(UseInst->getOperand(RdWidth));
- auto Stride = GetSignConstant(UseInst->getOperand(RdStride));
- // Convert start index from bytes to bits
- auto StartIdx =
- GetSignConstant(UseInst->getOperand(RdIndex)) * vc::ByteBits;
- auto ElSizeInBits = vc::getTypeSize(VTy->getElementType(), &DL).inBits();
- IGC_ASSERT(Width);
- unsigned NumElements = VTy->getNumElements() / Width;
- OffsetsVector Offsets;
-
- for (unsigned I = 0; I < NumElements; ++I) {
- for (unsigned J = 0; J < Width; ++J) {
- auto CurrOffset = StartIdx + ElSizeInBits * (I * Vstride + J * Stride);
- // Check type overflow
- IGC_ASSERT(CurrOffset <= std::numeric_limits<unsigned>::max());
- if ((CurrOffset % getGRFSizeInBits()) + ElSizeInBits >
- getGRFSizeInBits()) {
- LLVM_DEBUG(dbgs() << " Fail to generate Bale location element has "
- "crossGRF access\n");
- return std::make_tuple(UseInst, OffsetsVector());
- }
- Offsets.push_back(CurrOffset);
- }
- }
- // Replace value to source of rdregion
- return std::make_tuple(UseInst->getOperand(RdNumOp), std::move(Offsets));
- }
-
- IGC::VISAVariableLocation
- GetVariableLocation(const Instruction *DbgInst) const override {
- using Location = IGC::VISAVariableLocation;
- auto EmptyLoc = [this](StringRef Reason) {
- LLVM_DEBUG(dbgs() << " Empty Location Returned (" << Reason
- << ")\n <<<\n");
- return Location(this);
- };
-
- IGC_ASSERT(isa<DbgInfoIntrinsic>(DbgInst));
-
- LLVM_DEBUG(dbgs() << " >>>\n GetVariableLocation for " << *DbgInst
- << "\n");
- const DIVariable *VarDescr = nullptr;
- if (const auto *PDbgAddrInst = dyn_cast<DbgDeclareInst>(DbgInst)) {
- VarDescr = PDbgAddrInst->getVariable();
- } else if (const auto *PDbgValInst = dyn_cast<DbgValueInst>(DbgInst)) {
- VarDescr = PDbgValInst->getVariable();
- } else {
- return EmptyLoc("unsupported Debug Intrinsic");
- }
- const Value *DbgValue =
- IGCLLVM::getVariableLocation(cast<DbgVariableIntrinsic>(DbgInst));
-
- OffsetsVector Offsets;
- if (auto *UseInst = dyn_cast_or_null<CallInst>(DbgValue)) {
- std::tie(DbgValue, Offsets) =
- calculateBaledLocation(UseInst, BA, F.getParent()->getDataLayout());
- }
-
- IGC_ASSERT(VarDescr);
- if (!DbgValue) {
- if (const auto *LocalVar = dyn_cast<DILocalVariable>(VarDescr))
- if (LocalVar->isParameter())
- return EmptyLoc("unsupported parameter description");
- return EmptyLoc("unsupported DbgInst");
- }
- IGC_ASSERT(DbgValue);
- LLVM_DEBUG(dbgs() << " Value:" << *DbgValue << "\n");
- LLVM_DEBUG(dbgs() << " Var: " << VarDescr->getName()
- << "/Type:" << *VarDescr->getType() << "\n");
- if (isa<UndefValue>(DbgValue)) {
- return EmptyLoc("UndefValue");
- }
- if (auto *ConstVal = dyn_cast<Constant>(DbgValue)) {
- LLVM_DEBUG(dbgs() << " ConstantLoc\n <<<\n");
- return Location(ConstVal, this);
- }
-
- auto *Reg = getRegisterForValue(DbgValue);
- if (!Reg) {
- return EmptyLoc("could not find virtual register");
- }
-
- return Location(Reg->Num, std::move(Offsets), this);
- }
-
- void UpdateVisaId() override {
- // do nothing (the moment we need to advance index is controlled explicitly)
- }
- void ValidateVisaId() override {
- // do nothing (we don't need validation since VISA is built already)
- }
- uint16_t GetSIMDSize() const override { return 1; }
-
- void *getPrivateBase() const override { return nullptr; };
- void setPrivateBase(void *) override {};
-
- bool hasPTO() const override { return false; }
- int getPTOReg() const override { return -1; }
- int getFPReg() const override { return -1; }
- uint64_t getFPOffset() const override { return 16; }
-
- bool usesSlot1ScratchSpill() const override { return false; }
-
- const GenXVisaRegAlloc::Reg *getRegisterForValue(const Value *V) const {
- return RA.getRegForValueOrNull(const_cast<Value *>(V));
- }
-
- void printVisaMapping(raw_ostream &OS, unsigned Level = 0) const {
- const std::string Prefix(Level * 4, ' ');
- OS << Prefix;
- OS << "VisaMapping for <" << getFunction()->getName() << ">(";
- for (auto Arg : enumerate(getFunction()->args())) {
- OS << "a" << Arg.index() << ":";
- auto *Reg = getRegisterForValue(&Arg.value());
- if (Reg)
- Reg->print(OS);
- else
- OS << "_";
- OS << ";";
- }
- OS << ") - {\n";
-
- size_t SkippedIndex = 0;
- size_t SkippedCount = 0;
- auto PrintSkippedAndClearCount = [&SkippedIndex, &SkippedCount, &Prefix,
- &OS]() {
- if (!SkippedCount)
- return;
- OS << Prefix << " <" << SkippedIndex << ">: "
- << "skipped " << SkippedCount << " llvm.dbg.* intrinsics\n";
- SkippedCount = 0;
- };
-
- for (const auto &Mapping : VisaMapping.V2I) {
- auto VisaIndexCurr = Mapping.VisaIdx;
- auto VisaIndexNext = Mapping.VisaIdx + Mapping.VisaCount;
- const auto *Inst = Mapping.Inst;
-
- if (Mapping.IsDbgInst && !DbgOpt_VisaMappingPrintDbgIntrinsics) {
- if (!SkippedCount)
- SkippedIndex = VisaIndexCurr;
- ++SkippedCount;
- continue;
- }
-
- PrintSkippedAndClearCount();
-
- OS << Prefix;
- OS << " [" << VisaIndexCurr << ";" << VisaIndexNext << "): ";
-
- auto *Reg = getRegisterForValue(Inst);
- OS << "<";
- if (Reg)
- Reg->print(OS);
- OS << "> ";
-
- Inst->print(OS);
-
- if (auto DbgLoc = Inst->getDebugLoc()) {
- StringRef Filename = DbgLoc->getFilename();
- auto Line = DbgLoc->getLine();
- auto Col = DbgLoc->getColumn();
- OS << " [" << Filename << ":" << Line << "," << Col << "]";
- }
- OS << "\n";
- }
-
- PrintSkippedAndClearCount();
-
- OS << Prefix;
- OS << "}\n";
- }
-
- const ModuleToVisaTransformInfo &getMVTI() const { return MVTI; }
-
-private:
- const Function &F;
- const GenXSubtarget &ST;
- const genx::di::VisaMapping &VisaMapping;
- CompiledVisaWrapper CompiledVisa;
- const GenXVisaRegAlloc &RA;
- const GenXBaling &BA;
- const ModuleToVisaTransformInfo &MVTI;
-};
-
-using VisaMapType = std::vector<genx::di::VisaMapping::Mapping>;
-
-[[maybe_unused]] static bool validateVisaMapping(const VisaMapType &V2I) {
- // Last used visa index
- auto ExpectedNextId = V2I.cbegin()->VisaIdx;
- for (auto MappingIt = V2I.cbegin(); MappingIt != V2I.cend(); ++MappingIt) {
- auto VisaIndexCurr = MappingIt->VisaIdx;
- auto VisaIndexNext = MappingIt->VisaIdx + MappingIt->VisaCount;
- const auto *Inst = MappingIt->Inst;
-
- IGC_ASSERT(VisaIndexCurr <= VisaIndexNext);
- if (MappingIt->IsDbgInst) {
- IGC_ASSERT(isa<DbgInfoIntrinsic>(MappingIt->Inst));
- IGC_ASSERT(MappingIt->VisaCount == 0);
- } else {
- // Check that in map only real instructions
- IGC_ASSERT(MappingIt->VisaCount > 0);
- }
-
- // ExpectedNextId (from the previous iteration) should be the same as
- // the current index
- // In other words, we should have no gaps in vISA mapping
- if (ExpectedNextId != VisaIndexCurr) {
- LLVM_DEBUG(dbgs() << "Detected inconsistency, current visa-Index: "
- << VisaIndexCurr
- << " is not equal to expected visa-Index: "
- << ExpectedNextId << "\n");
- return false;
- }
-
- ExpectedNextId = VisaIndexNext;
- // Mapping may interupts in calls, because functions may be inlined.
- // Just do not check ExpectedNextId for the next instruction.
- if (isa<CallInst>(Inst) && !isa<DbgInfoIntrinsic>(Inst))
- ExpectedNextId = std::next(MappingIt)->VisaIdx;
-
- // Marker that this is the last instruction of a BB
- bool lastBlockInst = ((std::next(MappingIt) != V2I.cend()) &&
- (MappingIt->Inst->getParent() !=
- (std::next(MappingIt)->Inst->getParent())));
-
- // Current implementation does not create mapping for vISA labels.
- // That's why the next mapping is considered to be correct:
- // VisaMapping: [18;20): br label %1, !dbg !147
- // VisaMapping: [21;22): %icmp = icmp ult i32 %.06, 8, !dbg !148
- // In visaasm-file 20-th instruction will be a bb-label:
- // lifetime.start V51 /// $19
- // BB_1:
- // cmp.lt (M1, 1) P1 V105(0,0)<0;1,0> 0x8:ud /// $21
- // We avoid checking of the ExpectedNextId in such cases - [21;22).
- if (lastBlockInst) {
- ExpectedNextId = std::next(MappingIt)->VisaIdx;
- }
- }
- return true;
-}
-
-static void processGenXFunction(IGC::IDebugEmitter &Emitter, GenXFunction &GF) {
- Emitter.setCurrentVISA(&GF);
- const auto &V2I = GF.getVisaMapping().V2I;
- for (auto MappingIt = V2I.cbegin(); MappingIt != V2I.cend(); ++MappingIt) {
- auto VisaIndexCurr = MappingIt->VisaIdx;
- auto VisaIndexNext = MappingIt->VisaIdx + MappingIt->VisaCount;
-
- // Note: "index - 1" is because we mimic index values as if they were
- // before corresponding instructions were inserted
- GF.SetVISAId(VisaIndexCurr - 1);
- // we need this const_cast because of the flawed VISA Emitter API
- auto *Inst = const_cast<Instruction *>(MappingIt->Inst);
- Emitter.BeginInstruction(Inst);
- GF.SetVISAId(VisaIndexNext - 1);
- Emitter.EndInstruction(Inst);
- }
-}
-
-using GenXObjectHolder = std::unique_ptr<GenXFunction>;
-GenXObjectHolder buildGenXFunctionObject(const ModuleToVisaTransformInfo &MVTI,
- const GenObjectWrapper &GOW,
- const ProgramInfo::FunctionInfo &FI,
- const GenXSubtarget &ST,
- const GenXVisaRegAlloc &RA,
- const GenXBaling &BA) {
- StringRef CompiledObjectName = FI.F.getName();
- if (MVTI.isSubroutine(&FI.F))
- CompiledObjectName = MVTI.getSubroutineOwner(&FI.F)->getName();
-
- CompiledVisaWrapper CW(FI.F, CompiledObjectName, GOW);
- if (CW.hasErrors())
- vc::diagnose(FI.F.getContext(), "GenXDebugInfo", CW.getError());
-
- bool IsPrimaryFunction = &GOW.getEntryPoint() == &FI.F;
- return std::make_unique<GenXFunction>(
- ST, RA, BA, FI.F, std::move(CW), FI.VisaMapping, MVTI, IsPrimaryFunction);
-}
-
-using GenXObjectHolderList = std::vector<GenXObjectHolder>;
-GenXObjectHolderList translateProgramInfoToGenXFunctionObjects(
- const GenObjectWrapper &GOW, const ProgramInfo &PI, const GenXSubtarget &ST,
- const std::vector<const GenXVisaRegAlloc *> &RAs,
- const std::vector<const GenXBaling *> &BAs) {
- const auto &MVTI = PI.MVTI;
- GenXObjectHolderList GenXFunctionHolders;
- IGC_ASSERT(PI.FIs.size() == RAs.size());
- IGC_ASSERT(BAs.size() == RAs.size());
- auto Zippy = llvm::zip(RAs, BAs);
- std::transform(PI.FIs.begin(), PI.FIs.end(), Zippy.begin(),
- std::back_inserter(GenXFunctionHolders),
- [&ST, &MVTI, &GOW](const auto &FI, const auto &ZIP) {
- const GenXVisaRegAlloc *RA = std::get<0>(ZIP);
- const GenXBaling *BA = std::get<1>(ZIP);
- return buildGenXFunctionObject(MVTI, GOW, FI, ST, *RA, *BA);
- });
- return GenXFunctionHolders;
-}
-
-using GenXFunctionPtrList = std::vector<GenXFunction *>;
-using GenXFunctionConstPtrList = std::vector<const GenXFunction *>;
-GenXFunctionPtrList initializeDebugEmitter(
- IGC::IDebugEmitter &Emitter, const IGC::DebugEmitterOpts &DebugOpts,
- const ProgramInfo &PI, GenXObjectHolderList &&GFsHolderIn) {
-
- GenXFunctionPtrList GFPointers;
- for (auto &&GF : GFsHolderIn) {
- GFPointers.push_back(GF.get());
-
- if (GF->isPrimaryFunc()) {
- Emitter.Initialize(std::move(GF), DebugOpts);
- } else {
- Emitter.registerVISA(GFPointers.back());
- Emitter.resetModule(std::move(GF));
- }
- }
- // Currently Debug Info Emitter expects that GenXFunctions are
- // processed in the same order as they appear in the visa object
- // Ideally, the order should not matter - but we are not there yet
- // due to DwarfEmitter limitations
- std::sort(GFPointers.begin(), GFPointers.end(), [](auto *LGF, auto *RGF) {
- const auto &LDI = LGF->getFinalizerDI();
- const auto &RDI = RGF->getFinalizerDI();
- if (LDI.relocOffset == RDI.relocOffset)
- return visaMapComparer(LGF->getFunction(), RGF->getFunction(),
- LGF->getVisaMapping().V2I,
- RGF->getVisaMapping().V2I);
- return LDI.relocOffset < RDI.relocOffset;
- });
- return GFPointers;
-}
-
-std::string makePrefixForAuxiliaryShaderDump(const GenXBackendConfig &BC,
- const GenObjectWrapper &GOW) {
-
- const auto &KernelName = GOW.getEntryPoint().getName();
- std::string Prefix = "dbginfo_";
- if (!BC.dbgInfoDumpsNameOverride().empty())
- Prefix.append(BC.dbgInfoDumpsNameOverride()).append("_");
- Prefix.append(KernelName.str());
- return Prefix;
-}
-
-std::string serializeDecodedGenDebugInfo(const GenObjectWrapper &GOW) {
- std::string Result;
- llvm::raw_string_ostream OS(Result);
- GOW.printDecodedGenXDebug(OS);
- OS.flush();
- return Result;
-}
-
-using GFPtrSet = std::unordered_set<const GenXFunction *>;
-using KernelAndVisaOwners =
- std::pair<const GenXFunction *, GenXFunctionConstPtrList>;
-
-void printVisaMapping(raw_ostream &OS, const GenXFunction &GF, unsigned Level,
- GFPtrSet &NotPrinted) {
- IGC_ASSERT(NotPrinted.count(&GF));
- GF.printVisaMapping(OS, Level);
- NotPrinted.erase(&GF);
-}
-
-void printSubroutinesVisaMapping(raw_ostream &OS,
- GenXFunctionConstPtrList Subroutines,
- unsigned Level, GFPtrSet &NotPrinted) {
- // Sort is needed for printing elements with less visa index first
- std::sort(Subroutines.begin(), Subroutines.end(),
- [](const GenXFunction *L, const GenXFunction *R) {
- const auto &V2IL = L->getVisaMapping().V2I;
- const auto &V2IR = R->getVisaMapping().V2I;
- return visaMapComparer(L->getFunction(), R->getFunction(), V2IL,
- V2IR);
- });
- for (const auto *SGF : Subroutines)
- printVisaMapping(OS, *SGF, Level, NotPrinted);
-}
-
-void printVisaOwnerVisaMapping(raw_ostream &OS, const GenXFunction &VO,
- const GenXFunctionConstPtrList &Subroutines,
- unsigned Level, GFPtrSet &NotPrinted) {
- printVisaMapping(OS, VO, Level, NotPrinted);
-
- printSubroutinesVisaMapping(OS, Subroutines, Level + 1, NotPrinted);
-}
-
-bool isStackCallGF(const GenXFunction *GF) {
- IGC_ASSERT(GF);
- return GF->isStackCall();
-}
-
-bool isKernelGF(const GenXFunction *GF) {
- IGC_ASSERT(GF);
- return GF->isKernel();
-}
-
-KernelAndVisaOwners
-getKernelAndVisaOwners(const GenXFunctionConstPtrList &GFs) {
- IGC_ASSERT(!GFs.empty());
- GenXFunctionConstPtrList StackCalls;
- std::copy_if(GFs.begin(), GFs.end(), std::back_inserter(StackCalls),
- isStackCallGF);
- IGC_ASSERT(std::count_if(GFs.begin(), GFs.end(), isKernelGF) == 1);
- auto KGFIt = std::find_if(GFs.begin(), GFs.end(), isKernelGF);
- IGC_ASSERT_EXIT(KGFIt != GFs.end());
- return {*KGFIt, std::move(StackCalls)};
-}
-
-GenXFunctionConstPtrList
-getSubroutinesForVisaOwner(const GenXFunction &VO,
- const GenXFunctionConstPtrList &AllGFs) {
- const auto &MVTI = VO.getMVTI();
- GenXFunctionConstPtrList Result;
- std::copy_if(AllGFs.begin(), AllGFs.end(), std::back_inserter(Result),
- [&MVTI, &VO](const auto *GF) {
- if (!GF->isSubroutine())
- return false;
- const Function *F = GF->getFunction();
- return MVTI.getSubroutineOwner(F) == VO.getFunction();
- });
- return Result;
-}
-
-std::string serializeGFsVisaMapping(const GenXFunctionConstPtrList &GFs) {
- std::string Result;
- llvm::raw_string_ostream OS(Result);
-
- GFPtrSet ToPrint(GFs.begin(), GFs.end());
-
- auto [KGF, VisaOwners] = getKernelAndVisaOwners(GFs);
-
- printVisaOwnerVisaMapping(OS, *KGF, getSubroutinesForVisaOwner(*KGF, GFs), 0,
- ToPrint);
- for (const auto *SpawnerGF : VisaOwners)
- printVisaOwnerVisaMapping(OS, *SpawnerGF,
- getSubroutinesForVisaOwner(*SpawnerGF, GFs), 1,
- ToPrint);
- IGC_ASSERT(ToPrint.empty());
-
- OS.flush();
- return Result;
-}
-
-void dumpDebugInfo(const GenXBackendConfig &BC, const GenObjectWrapper &GOW,
- const GenXFunctionPtrList &GFs, const ArrayRef<char> ElfBin,
- const ArrayRef<char> ErrLog) {
-
- auto DecodedGenInfo = serializeDecodedGenDebugInfo(GOW);
- GenXFunctionConstPtrList CGFs;
- std::copy(GFs.begin(), GFs.end(), std::back_inserter(CGFs));
- auto SerializedVisaMapping = serializeGFsVisaMapping(CGFs);
-
- std::string Prefix = makePrefixForAuxiliaryShaderDump(BC, GOW);
-
- vc::produceAuxiliaryShaderDumpFile(BC, Twine(Prefix) + "_dwarf.elf", ElfBin);
- vc::produceAuxiliaryShaderDumpFile(BC, Twine(Prefix) + "_gen.dump",
- GOW.getGenDebug());
- vc::produceAuxiliaryShaderDumpFile(BC, Twine(Prefix) + "_gen.decoded.dump",
- DecodedGenInfo);
- vc::produceAuxiliaryShaderDumpFile(BC, Twine(Prefix) + "_visa.mapping",
- SerializedVisaMapping);
-
- if (!ErrLog.empty())
- vc::produceAuxiliaryShaderDumpFile(BC, Twine(Prefix) + ".dbgerr", ErrLog);
-}
-
-} // namespace
-
-void GenXDebugInfo::processKernel(const IGC::DebugEmitterOpts &DebugOpts,
- const ProgramInfo &PI) {
-
- IGC_ASSERT_MESSAGE(!PI.FIs.empty(),
- "Program must include at least one function");
- IGC_ASSERT_MESSAGE(PI.MVTI.getPrimaryEmittersForVisa(&PI.getEntryPoint())
- .count(&PI.getEntryPoint()) == 1,
- "The head of ProgramInfo is expected to be a kernel");
-
- GenObjectWrapper GOW(PI.CompiledKernel, PI.getEntryPoint());
- if (GOW.hasErrors())
- vc::diagnose(GOW.getEntryPoint().getContext(), "GenXDebugInfo",
- GOW.getError());
-
- LLVM_DEBUG(GOW.printDecodedGenXDebug(dbgs()));
-
- auto Deleter = [](IGC::IDebugEmitter *Emitter) {
- IGC::IDebugEmitter::Release(Emitter);
- };
- using EmitterHolder = std::unique_ptr<IGC::IDebugEmitter, decltype(Deleter)>;
- EmitterHolder Emitter(IGC::IDebugEmitter::Create(), Deleter);
-
- const auto &ST = getAnalysis<TargetPassConfig>()
- .getTM<GenXTargetMachine>()
- .getGenXSubtarget();
- auto *FGA = &getAnalysis<FunctionGroupAnalysis>();
- std::vector<const GenXVisaRegAlloc *> VisaRegAllocs;
- std::vector<const GenXBaling *> BalingList;
- for (const auto &FP : PI.FIs) {
- FunctionGroup *currentFG = FGA->getAnyGroup(&FP.F);
- VisaRegAllocs.push_back(
- &(getAnalysis<GenXVisaRegAllocWrapper>().getFGPassImpl(currentFG)));
- GenXBaling *Baling =
- &(getAnalysis<GenXGroupBalingWrapper>().getFGPassImpl(currentFG));
- BalingList.push_back(Baling);
- }
-
- GenXFunctionPtrList GFPointers =
- initializeDebugEmitter(*Emitter, DebugOpts, PI,
- translateProgramInfoToGenXFunctionObjects(
- GOW, PI, ST, VisaRegAllocs, BalingList));
-
- auto &KF = GOW.getEntryPoint();
- IGC_ASSERT(ElfOutputs.count(&KF) == 0);
- auto &ElfBin = ElfOutputs[&KF];
-
- for (auto *GF : GFPointers) {
- LLVM_DEBUG(dbgs() << "\n--- Processing GenXFunction: "
- << GF->getFunction()->getName().str() << " ---\n");
- LLVM_DEBUG(GF->printVisaMapping(dbgs()));
- IGC_ASSERT(validateVisaMapping(GF->getVisaMapping().V2I));
- processGenXFunction(*Emitter, *GF);
- bool ExpectMore = GF != GFPointers.back();
- LLVM_DEBUG(dbgs() << "--- Starting Debug Info Finalization (final: "
- << !ExpectMore << ") ---\n");
- auto Out = Emitter->Finalize(!ExpectMore, GF->getVISADebugInfo());
- if (!ExpectMore) {
- ElfBin = std::move(Out);
- } else {
- IGC_ASSERT(Out.empty());
- }
- LLVM_DEBUG(dbgs() << "--- \\ Debug Info Finalized / ---\n");
- }
-
- [[maybe_unused]] const auto &KernelName = KF.getName();
- LLVM_DEBUG(dbgs() << "got Debug Info for <" << KernelName.str() << "> "
- << "- " << ElfBin.size() << " bytes\n");
-
- const auto &BC = getAnalysis<GenXBackendConfig>();
- if (BC.dbgInfoDumpsEnabled()) {
- const auto &ErrLog = Emitter->getErrors();
- dumpDebugInfo(BC, GOW, GFPointers, ElfBin, {ErrLog.data(), ErrLog.size()});
- }
-
- return;
-}
-
void GenXDebugInfo::cleanup() { ElfOutputs.clear(); }
-void GenXDebugInfo::getAnalysisUsage(AnalysisUsage &AU) const {
- AU.addRequired<FunctionGroupAnalysis>();
- AU.addRequired<GenXBackendConfig>();
- AU.addRequired<GenXModule>();
- AU.addRequired<TargetPassConfig>();
- AU.addRequired<GenXVisaRegAllocWrapper>();
- AU.addRequired<CallGraphWrapperPass>();
- AU.addRequired<GenXGroupBaling>();
- AU.setPreservesAll();
-}
-
-void GenXDebugInfo::processPrimaryFunction(
- const IGC::DebugEmitterOpts &Opts, const ModuleToVisaTransformInfo &MVTI,
- const GenXModule &GM, VISABuilder &VB, const Function &PF) {
- LLVM_DEBUG(dbgs() << "DbgInfo: processing <" << PF.getName() << ">\n");
- IGC_ASSERT(MVTI.isKernelFunction(&PF));
- VISAKernel *VKEntry = MVTI.getSpawnedVISAKernel(&PF);
- IGC_ASSERT(VKEntry);
-
- using FunctionInfo = ProgramInfo::FunctionInfo;
- std::vector<FunctionInfo> FIs;
- FIs.push_back(FunctionInfo{*GM.getVisaMapping(&PF), PF});
- auto SecondaryFunctions = MVTI.getSecondaryFunctions(&PF);
- // Sorting by visa-elements, because finalizer expect sorted sequence
- // for emmiting correct debug hi/low pc for functions
- std::sort(SecondaryFunctions.begin(), SecondaryFunctions.end(),
- [&GM](const Function *L, const Function *R) {
- const auto &V2IL = GM.getVisaMapping(L)->V2I;
- const auto &V2IR = GM.getVisaMapping(R)->V2I;
- return visaMapComparer(L, R, V2IL, V2IR);
- });
- std::transform(SecondaryFunctions.begin(), SecondaryFunctions.end(),
- std::back_inserter(FIs), [&GM](const Function *F) {
- const auto &Mapping = *GM.getVisaMapping(F);
- return FunctionInfo{Mapping, *F};
- });
- processKernel(Opts, ProgramInfo{MVTI, *VKEntry, std::move(FIs)});
-}
-
-static void fillDbgInfoOptions(const GenXBackendConfig &BC,
- IGC::DebugEmitterOpts &DebugOpts) {
- DebugOpts.DebugEnabled = true;
-
- if (BC.emitDWARFDebugInfoForZeBin() || DbgOpt_ZeBinCompatible) {
- DebugOpts.ZeBinCompatible = true;
- DebugOpts.EnableRelocation = true;
- DebugOpts.EnforceAMD64Machine = true;
- }
- if (BC.enableDebugInfoValidation() || DbgOpt_ValidationEnable) {
- DebugOpts.EnableDebugInfoValidation = true;
- }
-}
+void GenXDebugInfo::getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); }
bool GenXDebugInfo::runOnModule(Module &M) {
- auto &GM = getAnalysis<GenXModule>();
- // Note: we check that MVTI dumps were not requested here,
- // since it is possible to request those without the presence of
- // debug information
- if (!GM.emitDebugInformation() && DbgOpt_VisaTransformInfoPath.empty())
- return false;
-
- const auto &BC = getAnalysis<GenXBackendConfig>();
- const FunctionGroupAnalysis &FGA = getAnalysis<FunctionGroupAnalysis>();
-
- VISABuilder *VB = GM.GetCisaBuilder();
- if (GM.HasInlineAsm() || !BC.getVISALTOStrings().empty())
- VB = GM.GetVISAAsmReader();
- IGC_ASSERT(VB);
-
- const auto &CG = getAnalysis<CallGraphWrapperPass>().getCallGraph();
- ModuleToVisaTransformInfo MVTI(*VB, FGA, CG);
- if (!DbgOpt_VisaTransformInfoPath.empty()) {
- std::string SerializedMVTI;
- llvm::raw_string_ostream OS(SerializedMVTI);
- MVTI.print(OS);
- vc::produceAuxiliaryShaderDumpFile(BC, DbgOpt_VisaTransformInfoPath,
- OS.str());
- }
- LLVM_DEBUG(MVTI.print(dbgs()); dbgs() << "\n");
-
- if (!GM.emitDebugInformation())
- return false;
-
- IGC::DebugEmitterOpts DebugInfoOpts;
- fillDbgInfoOptions(BC, DebugInfoOpts);
-
- for (const Function *PF : MVTI.getPrimaryFunctions())
- processPrimaryFunction(DebugInfoOpts, MVTI, GM, *VB, *PF);
-
+ (void)M;
return false;
}
@@ -1607,13 +22,5 @@ ModulePass *createGenXDebugInfoPass() {
} // namespace llvm
-INITIALIZE_PASS_BEGIN(GenXDebugInfo, "GenXDebugInfo", "GenXDebugInfo", false,
- true /*analysis*/)
-INITIALIZE_PASS_DEPENDENCY(FunctionGroupAnalysis)
-INITIALIZE_PASS_DEPENDENCY(GenXBackendConfig)
-INITIALIZE_PASS_DEPENDENCY(GenXModule)
-INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
-INITIALIZE_PASS_DEPENDENCY(GenXVisaRegAllocWrapper)
-INITIALIZE_PASS_DEPENDENCY(CallGraphWrapperPass)
-INITIALIZE_PASS_END(GenXDebugInfo, "GenXDebugInfo", "GenXDebugInfo", false,
- true /*analysis*/)
+INITIALIZE_PASS_BEGIN(GenXDebugInfo, "GenXDebugInfo", "GenXDebugInfo", false, true /*analysis*/)
+INITIALIZE_PASS_END(GenXDebugInfo, "GenXDebugInfo", "GenXDebugInfo", false, true /*analysis*/)
diff --git a/IGC/VectorCompiler/lib/GenXCodeGen/GenXGASDynamicResolution.cpp b/IGC/VectorCompiler/lib/GenXCodeGen/GenXGASDynamicResolution.cpp
index 014612d..ddb0157 100644
--- a/IGC/VectorCompiler/lib/GenXCodeGen/GenXGASDynamicResolution.cpp
+++ b/IGC/VectorCompiler/lib/GenXCodeGen/GenXGASDynamicResolution.cpp
@@ -183,7 +183,7 @@ static void createScatterWithNewAS(IntrinsicInst &OldScatter,
Mask = IRB.CreateAnd(UpdateMask, Mask);
PtrOp = createASCast(IRB, PtrOp, NewAS);
- auto Func = Intrinsic::getDeclaration(OldScatter.getModule(),
+ auto Func = Intrinsic::getOrInsertDeclaration(OldScatter.getModule(),
Intrinsic::masked_scatter,
{Val->getType(), PtrOp->getType()});
IRB.CreateCall(Func, {Val, PtrOp, Align, Mask});
@@ -204,7 +204,7 @@ static IntrinsicInst *createGatherWithNewAS(IntrinsicInst &OldGather,
PtrOp = createASCast(IRB, PtrOp, NewAS);
auto Func =
- Intrinsic::getDeclaration(OldGather.getModule(), Intrinsic::masked_gather,
+ Intrinsic::getOrInsertDeclaration(OldGather.getModule(), Intrinsic::masked_gather,
{OldGather.getType(), PtrOp->getType()});
return cast<IntrinsicInst>(
IRB.CreateCall(Func, {PtrOp, Align, Mask, Passthru}, Name));
diff --git a/IGC/VectorCompiler/lib/GenXCodeGen/GenXGotoJoin.cpp b/IGC/VectorCompiler/lib/GenXCodeGen/GenXGotoJoin.cpp
index 9738ec9..43909f2 100644
--- a/IGC/VectorCompiler/lib/GenXCodeGen/GenXGotoJoin.cpp
+++ b/IGC/VectorCompiler/lib/GenXCodeGen/GenXGotoJoin.cpp
@@ -135,7 +135,7 @@ bool GotoJoin::isValidJoin(CallInst *Join) {
// were given.
if (!isJoinLabel(BB))
return true;
- auto Inst = BB->getFirstNonPHIOrDbg();
+ auto Inst = &*BB->getFirstNonPHIOrDbg();
while (isa<BitCastInst>(Inst))
Inst = Inst->getNextNode();
if (GenXIntrinsic::getGenXIntrinsicID(Inst) ==
@@ -154,7 +154,7 @@ bool GotoJoin::isValidJoin(CallInst *Join) {
*/
bool GotoJoin::isBranchingJoinLabelBlock(BasicBlock *BB) {
auto Join = isBranchingJoinBlock(BB);
- if (!Join || Join != BB->getFirstNonPHIOrDbg())
+ if (!Join || Join != &*BB->getFirstNonPHIOrDbg())
return false;
return isJoinLabel(BB);
}
@@ -185,7 +185,7 @@ BasicBlock *GotoJoin::getBranchingBlockForBB(BasicBlock *BB,
// critical edge splitter.
auto PredBB = PredBr->getParent();
if (SkipCriticalEdgeSplitter && PredBr->getNumSuccessors() == 1 &&
- PredBr == PredBB->getFirstNonPHIOrDbg() && PredBB->hasOneUse()) {
+ PredBr == &*PredBB->getFirstNonPHIOrDbg() && PredBB->hasOneUse()) {
auto ui2 = PredBB->use_begin();
PredBr = dyn_cast<BranchInst>(ui2->getUser());
if (!PredBr || ui2->getOperandNo() != PredBr->getNumOperands() - 1)
diff --git a/IGC/VectorCompiler/lib/GenXCodeGen/GenXLiveElements.cpp b/IGC/VectorCompiler/lib/GenXCodeGen/GenXLiveElements.cpp
index db38552..778df20 100644
--- a/IGC/VectorCompiler/lib/GenXCodeGen/GenXLiveElements.cpp
+++ b/IGC/VectorCompiler/lib/GenXCodeGen/GenXLiveElements.cpp
@@ -342,59 +342,10 @@ static bool isRootInst(const Instruction *I) {
}
void GenXLiveElements::processFunction(const Function &F) {
- // List of instructions that live elements were changed and requires
- // re-processing. SetVector is used to obtain deterministic order of work
- SmallSetVector<const Instruction *, 16> Worklist;
-
- for (auto &I : instructions(F))
- if (isRootInst(&I)) {
- LLVM_DEBUG(dbgs() << "Adding:\n" << I << "\n");
- LiveMap.insert({&I, LiveElements(I.getType(), true)});
- Worklist.insert(&I);
- }
-
- while (!Worklist.empty()) {
- auto Inst = Worklist.pop_back_val();
- IGC_ASSERT(LiveMap.count(Inst));
- const auto &InstLiveElems = LiveMap.lookup(Inst);
- LLVM_DEBUG(dbgs() << "Visiting:\n"
- << *Inst << " " << InstLiveElems << "\n");
- // Estimate each operand
- for (auto &Op : Inst->operands()) {
- if (!isa<Instruction>(Op) && !isa<Argument>(Op))
- continue;
- LiveElements OldLiveElems(Op->getType());
- auto It = LiveMap.find(Op);
- if (It != LiveMap.end())
- OldLiveElems = It->second;
- auto NewLiveElems =
- OldLiveElems |
- getOperandLiveElements(Inst, Op.getOperandNo(), InstLiveElems);
- // Skip adding not-changed and fully dead operands
- if (NewLiveElems == OldLiveElems || NewLiveElems.isAllDead())
- continue;
- LLVM_DEBUG(dbgs() << "Changing:\n"
- << *Op.get() << " " << NewLiveElems << "\n");
- LiveMap[Op] = std::move(NewLiveElems);
- if (auto OpInst = dyn_cast<Instruction>(Op))
- Worklist.insert(OpInst);
- }
- }
-
- if (PrintLiveElementsInfo) {
- outs() << "Live elements for " << F.getName() << ":\n";
- for (auto &I : instructions(F)) {
- outs() << I << " ";
- auto It = LiveMap.find(&I);
- if (It != LiveMap.end())
- outs() << It->second;
- else
- outs() << LiveElements(I.getType());
- outs() << "\n";
- }
- }
+ (void)F;
}
+
char GenXFuncLiveElements::ID = 0;
INITIALIZE_PASS_BEGIN(GenXFuncLiveElements, "GenXFuncLiveElements",
diff --git a/IGC/VectorCompiler/lib/GenXCodeGen/GenXLiveElements.h b/IGC/VectorCompiler/lib/GenXCodeGen/GenXLiveElements.h
index 843c992..625abf5 100644
--- a/IGC/VectorCompiler/lib/GenXCodeGen/GenXLiveElements.h
+++ b/IGC/VectorCompiler/lib/GenXCodeGen/GenXLiveElements.h
@@ -166,7 +166,7 @@ public:
bool runOnFunction(Function &F) override {
clear();
- processFunction(F);
+ (void)F;
return false;
}
};
@@ -188,8 +188,7 @@ public:
bool runOnFunctionGroup(FunctionGroup &FG) override {
clear();
- for (auto &F : FG)
- processFunction(*F);
+ (void)FG;
return false;
}
};
diff --git a/IGC/VectorCompiler/lib/GenXCodeGen/GenXLowerJmpTableSwitch.cpp b/IGC/VectorCompiler/lib/GenXCodeGen/GenXLowerJmpTableSwitch.cpp
index 2ecc0ad..e4878fd 100644
--- a/IGC/VectorCompiler/lib/GenXCodeGen/GenXLowerJmpTableSwitch.cpp
+++ b/IGC/VectorCompiler/lib/GenXCodeGen/GenXLowerJmpTableSwitch.cpp
@@ -200,7 +200,7 @@ bool GenXLowerJmpTableSwitch::processSwitchCandidates(
// NumCases times to create internal_jump_table decl.
std::vector<Type *> InTys(NumCases + 2, BAs[0]->getType());
// Return type
- InTys[0] = Builder.getInt8PtrTy();
+ InTys[0] = PointerType::get(Builder.getInt8Ty(), 0);
// Index in jump table. Only this arg will be really needed.
InTys[1] = JTIdx->getType();
Function *JTDecl = vc::InternalIntrinsic::getInternalDeclaration(
diff --git a/IGC/VectorCompiler/lib/GenXCodeGen/GenXLowering.cpp b/IGC/VectorCompiler/lib/GenXCodeGen/GenXLowering.cpp
index 4c962a5..cf8a64b 100644
--- a/IGC/VectorCompiler/lib/GenXCodeGen/GenXLowering.cpp
+++ b/IGC/VectorCompiler/lib/GenXCodeGen/GenXLowering.cpp
@@ -4710,7 +4710,7 @@ bool GenXLowering::lowerFunnelShift(CallInst *CI, unsigned IntrinsicID) {
bool GenXLowering::lowerFMulAdd(CallInst *CI) {
IGC_ASSERT(CI);
- auto *Decl = Intrinsic::getDeclaration(CI->getModule(), Intrinsic::fma,
+ auto *Decl = Intrinsic::getOrInsertDeclaration(CI->getModule(), Intrinsic::fma,
{CI->getType()});
SmallVector<Value *, 3> Args{CI->args()};
auto *FMA = CallInst::Create(Decl, Args, CI->getName(), CI);
@@ -4726,7 +4726,7 @@ bool GenXLowering::lowerPowI(CallInst *CI) {
IRBuilder<> IRB{CI};
auto *CITy = CI->getType();
auto *Decl =
- Intrinsic::getDeclaration(CI->getModule(), Intrinsic::pow, {CITy});
+ Intrinsic::getOrInsertDeclaration(CI->getModule(), Intrinsic::pow, {CITy});
auto *Operand = CI->getOperand(1);
// For pow @llvm.powi.v*.i*(< x > , i32 ) cases
if (auto *CIVTy = dyn_cast<IGCLLVM::FixedVectorType>(CITy);
diff --git a/IGC/VectorCompiler/lib/GenXCodeGen/GenXModule.cpp b/IGC/VectorCompiler/lib/GenXCodeGen/GenXModule.cpp
index c4e0347..5f4aab3 100644
--- a/IGC/VectorCompiler/lib/GenXCodeGen/GenXModule.cpp
+++ b/IGC/VectorCompiler/lib/GenXCodeGen/GenXModule.cpp
@@ -94,7 +94,7 @@ bool GenXModule::runOnModule(Module &M) {
InlineAsm = CheckForInlineAsm(M);
- DisableFinalizerOpts = TM.getOptLevel() == CodeGenOpt::Level::None;
+ DisableFinalizerOpts = TM.getOptLevel() == CodeGenOptLevel::None;
EmitDebugInformation =
BC->emitDWARFDebugInfo() && vc::DIBuilder::checkIfModuleHasDebugInfo(M);
ImplicitArgsBufferIsUsed = isImplicitArgsBufferUsed(M);
diff --git a/IGC/VectorCompiler/lib/GenXCodeGen/GenXPatternMatch.cpp b/IGC/VectorCompiler/lib/GenXCodeGen/GenXPatternMatch.cpp
index b0add63..cc5ab92 100644
--- a/IGC/VectorCompiler/lib/GenXCodeGen/GenXPatternMatch.cpp
+++ b/IGC/VectorCompiler/lib/GenXCodeGen/GenXPatternMatch.cpp
@@ -929,7 +929,8 @@ void GenXPatternMatch::visitICmpInst(ICmpInst &I) {
// Transform icmp (V0 & 65535), C2 ==> icmp (trunc V0 to i16), C2.
// TODO: Only consider unsigned comparisons so do not inspect the sign bit.
if (I.isUnsigned() &&
- match(&I, m_ICmp(Pred, m_OneUse(m_And(m_Value(V0), m_Constant(C1))),
+ (Pred = I.getPredicate(), true) &&
+ match(&I, m_ICmp(m_OneUse(m_And(m_Value(V0), m_Constant(C1))),
m_Constant(C2))) &&
C1->getType()->isVectorTy()) {
Type *Ty = V0->getType();
@@ -986,7 +987,8 @@ void GenXPatternMatch::visitICmpInst(ICmpInst &I) {
}
// Explore (icmp.ne V0, 0) where V0 is promoted from i1.
- if (match(&I, m_ICmp(Pred, m_Value(V0), m_Zero())) &&
+ if ((Pred = I.getPredicate(), true) &&
+ match(&I, m_ICmp(m_Value(V0), m_Zero())) &&
Pred == CmpInst::ICMP_NE) {
// V0 is calculated from AND, OR, NOT, and (select (cmp ...), 0, 1)
SmallVector<Value *, 8> WorkList;
@@ -1068,7 +1070,8 @@ void GenXPatternMatch::visitICmpInst(ICmpInst &I) {
// Transform the evaluation of flag == 0 into (~flag).all().
// TODO: Transform flag != 0 into flag.any().
- if (match(&I, m_ICmp(Pred, m_OneUse(m_BitCast(m_OneUse(m_Value(V0)))),
+ if ((Pred = I.getPredicate(), true) &&
+ match(&I, m_ICmp(m_OneUse(m_BitCast(m_OneUse(m_Value(V0)))),
m_Zero())) &&
Pred == CmpInst::ICMP_EQ && isa<CmpInst>(V0) &&
V0->getType()->isVectorTy() &&
@@ -1106,7 +1109,8 @@ CmpInst *GenXPatternMatch::reduceCmpWidth(CmpInst *Cmp) {
ICmpInst::Predicate Pred = CmpInst::BAD_ICMP_PREDICATE;
Value *V0 = nullptr;
if (!Cmp->hasOneUse() || !Cmp->getType()->isVectorTy() ||
- !match(Cmp, m_ICmp(Pred, m_And(m_Value(V0), m_One()), m_Zero())) ||
+ (Pred = Cmp->getPredicate(), true) == false ||
+ !match(Cmp, m_ICmp(m_And(m_Value(V0), m_One()), m_Zero())) ||
Pred != CmpInst::ICMP_EQ || !GenXIntrinsic::isWrRegion(V0))
return nullptr;
@@ -1144,12 +1148,14 @@ bool GenXPatternMatch::simplifyCmp(CmpInst *Cmp) {
ICmpInst::Predicate P1 = ICmpInst::BAD_ICMP_PREDICATE;
Value *LHS = nullptr;
Value *RHS = nullptr;
- if (!match(Cmp, m_ICmp(P0,
- m_And(m_Select(m_ICmp(P1, m_Value(LHS), m_Value(RHS)),
+ if (!match(Cmp, m_ICmp(m_And(m_Select(m_ICmp(m_Value(LHS), m_Value(RHS)),
m_One(), m_Zero()),
m_One()),
- m_Zero())))
+ m_Zero())))
return false;
+ P0 = Cmp->getPredicate();
+ auto *Sel = cast<SelectInst>(cast<BinaryOperator>(Cmp->getOperand(0))->getOperand(0));
+ P1 = cast<ICmpInst>(Sel->getCondition())->getPredicate();
if (P0 != ICmpInst::ICMP_EQ && P0 != ICmpInst::ICMP_NE)
return false;
if (P0 == ICmpInst::ICMP_EQ)
@@ -1579,7 +1585,7 @@ bool FmaMatcher::emit() {
if (NegSrcIndex >= 0)
Srcs[NegSrcIndex] = Builder.CreateFNeg(Srcs[NegSrcIndex]);
- auto *Func = Intrinsic::getDeclaration(AddSub->getModule(), Intrinsic::fma,
+ auto *Func = Intrinsic::getOrInsertDeclaration(AddSub->getModule(), Intrinsic::fma,
{AddSub->getType()});
auto *Fma = Builder.CreateCall(Func, Srcs);
AddSub->replaceAllUsesWith(Fma);
diff --git a/IGC/VectorCompiler/lib/GenXCodeGen/GenXPromoteArray.cpp b/IGC/VectorCompiler/lib/GenXCodeGen/GenXPromoteArray.cpp
index 28d50de..ee1680c 100644
--- a/IGC/VectorCompiler/lib/GenXCodeGen/GenXPromoteArray.cpp
+++ b/IGC/VectorCompiler/lib/GenXCodeGen/GenXPromoteArray.cpp
@@ -589,7 +589,7 @@ void TransposeHelper::handleStoreInst(StoreInst *Store,
ScalarizedIdx, Type::getInt16Ty(Store->getContext()));
}
if (auto *ConstIdx = dyn_cast<Constant>(ScalarizedIdx))
- R.Indirect = ConstantExpr::getMul(
+ R.Indirect = ConstantExpr::get(Instruction::Mul,
ConstIdx,
ConstantInt::get(
IRB.getInt16Ty(),
@@ -710,7 +710,7 @@ void TransposeHelper::handleLifetimeStart(IntrinsicInst *II,
auto *Ty = VectorAlloca->getAllocatedType();
auto *SizeC = IRB.getInt64(DL->getTypeSizeInBits(Ty) / ByteBits);
- IRB.CreateLifetimeStart(VectorAlloca, SizeC);
+ IRB.CreateLifetimeStart(VectorAlloca);
// The promotion pass generates load instruction even if the alloca memory is
// not initialized. So mem2reg transformation emits unnecessary PHI-nodes.
@@ -731,7 +731,7 @@ void TransposeHelper::handleLifetimeEnd(IntrinsicInst *II,
auto *Ty = VectorAlloca->getAllocatedType();
auto *SizeC = IRB.getInt64(DL->getTypeSizeInBits(Ty) / ByteBits);
- IRB.CreateLifetimeEnd(VectorAlloca, SizeC);
+ IRB.CreateLifetimeEnd(VectorAlloca);
II->eraseFromParent();
}
diff --git a/IGC/VectorCompiler/lib/GenXCodeGen/GenXPromotePredicate.cpp b/IGC/VectorCompiler/lib/GenXCodeGen/GenXPromotePredicate.cpp
index 2aacf74..f620b2d 100644
--- a/IGC/VectorCompiler/lib/GenXCodeGen/GenXPromotePredicate.cpp
+++ b/IGC/VectorCompiler/lib/GenXCodeGen/GenXPromotePredicate.cpp
@@ -299,7 +299,7 @@ bool GenXPromotePredicate::runOnFunction(Function &F) {
// Put every predicate instruction into its own equivalence class.
long Idx = 0;
- llvm::EquivalenceClasses<Instruction *, Comparator> PredicateWebs;
+ llvm::EquivalenceClasses<Instruction *> PredicateWebs;
for (auto &I : instructions(F)) {
if (!genx::isPredicate(&I))
continue;
@@ -312,8 +312,8 @@ bool GenXPromotePredicate::runOnFunction(Function &F) {
PredicateWebs.insert(&I);
}
// Connect data-flow related instructions together.
- for (auto &EC : PredicateWebs) {
- Instruction *Inst = EC.getData();
+ for (const auto *EC : PredicateWebs) {
+ Instruction *Inst = EC->getData();
for (auto &Op : Inst->operands()) {
Instruction *In = dyn_cast<Instruction>(Op);
@@ -325,9 +325,9 @@ bool GenXPromotePredicate::runOnFunction(Function &F) {
// Promote web if it is big enough (likely to cause flag spills).
bool Modified = false;
for (auto I = PredicateWebs.begin(), E = PredicateWebs.end(); I != E; ++I) {
- if (!I->isLeader())
+ if (!(*I)->isLeader())
continue;
- PredicateWeb Web(PredicateWebs.member_begin(I), PredicateWebs.member_end(),
+ PredicateWeb Web(PredicateWebs.member_begin(**I), PredicateWebs.member_end(),
AllowScalarAllAny);
LLVM_DEBUG(dbgs() << "Predicate web:\n"; Web.dump());
++NumCollectedPredicateWebs;
diff --git a/IGC/VectorCompiler/lib/GenXCodeGen/GenXPropagateSurfaceState.cpp b/IGC/VectorCompiler/lib/GenXCodeGen/GenXPropagateSurfaceState.cpp
index 7a5eca2..ad2b2c7 100644
--- a/IGC/VectorCompiler/lib/GenXCodeGen/GenXPropagateSurfaceState.cpp
+++ b/IGC/VectorCompiler/lib/GenXCodeGen/GenXPropagateSurfaceState.cpp
@@ -45,6 +45,7 @@ SPDX-License-Identifier: MIT
#include "Probe/Assertion.h"
+#include <llvm/ADT/SmallSet.h>
#include <llvm/ADT/SmallVector.h>
#include <llvm/ADT/StringRef.h>
#include <llvm/ADT/Twine.h>
diff --git a/IGC/VectorCompiler/lib/GenXCodeGen/GenXSimdCFConformance.cpp b/IGC/VectorCompiler/lib/GenXCodeGen/GenXSimdCFConformance.cpp
index fb455fc..b44a44c 100644
--- a/IGC/VectorCompiler/lib/GenXCodeGen/GenXSimdCFConformance.cpp
+++ b/IGC/VectorCompiler/lib/GenXCodeGen/GenXSimdCFConformance.cpp
@@ -1618,7 +1618,7 @@ void GenXSimdCFConformance::moveCodeInJoinBlocks() {
if (!Br || Br->isConditional())
continue;
auto BB = Br->getParent();
- if (BB->getFirstNonPHIOrDbg() != Br)
+ if (&*BB->getFirstNonPHIOrDbg() != Br)
continue;
if (GotoJoin::isJoinLabel(BB, /*SkipCriticalEdgeSplitter=*/true)) {
PredBlock = BB;
@@ -1731,7 +1731,7 @@ void GenXSimdCFConformance::emptyBranchingJoinBlocksInFunc(Function *F) {
void GenXSimdCFConformance::emptyBranchingJoinBlock(CallInst *Join) {
BasicBlock *BB = Join->getParent();
Instruction *InsertBefore = nullptr;
- for (Instruction *NextInst = BB->getFirstNonPHIOrDbg();;) {
+ for (Instruction *NextInst = &*BB->getFirstNonPHIOrDbg();;) {
auto Inst = NextInst;
if (Inst->isTerminator())
break;
@@ -1838,7 +1838,7 @@ bool GenXSimdCFConformance::hoistJoin(CallInst *Join) {
}
// Hoist the join.
auto BB = Join->getParent();
- auto InsertBefore = BB->getFirstNonPHIOrDbg();
+ auto InsertBefore = &*BB->getFirstNonPHIOrDbg();
if (InsertBefore == Join)
return true; // already at start
Join->removeFromParent();
@@ -2385,7 +2385,7 @@ bool GenXSimdCFConformance::checkGotoJoin(SimpleValue EMVal) {
// critical edge splitter block in between; this will get removed in
// setCategories in this pass.
BasicBlock *TrueSucc = Br->getSuccessor(0);
- Instruction *First = TrueSucc->getFirstNonPHIOrDbg();
+ Instruction *First = &*TrueSucc->getFirstNonPHIOrDbg();
auto IID = vc::getAnyIntrinsicID(First);
if (IID != GenXIntrinsic::genx_simdcf_join) {
// "True" successor is not a join label. Check for an empty critical edge
@@ -2397,7 +2397,7 @@ bool GenXSimdCFConformance::checkGotoJoin(SimpleValue EMVal) {
<< "checkGotoJoin: goto/join true successor not join label\n");
return false; // Not empty critical edge splitter
}
- if (vc::getAnyIntrinsicID(TrueSucc->getFirstNonPHIOrDbg()) !=
+ if (vc::getAnyIntrinsicID(&*TrueSucc->getFirstNonPHIOrDbg()) !=
GenXIntrinsic::genx_simdcf_join) {
LLVM_DEBUG(
dbgs()
diff --git a/IGC/VectorCompiler/lib/GenXCodeGen/GenXStructSplitter.cpp b/IGC/VectorCompiler/lib/GenXCodeGen/GenXStructSplitter.cpp
index c265d6e..0e35f5b 100644
--- a/IGC/VectorCompiler/lib/GenXCodeGen/GenXStructSplitter.cpp
+++ b/IGC/VectorCompiler/lib/GenXCodeGen/GenXStructSplitter.cpp
@@ -1137,34 +1137,8 @@ static void reportUnsupportedDbgIntrinsics(
// that Val points to. Can return only one dbg.declare.
// Returns nullptr it there is no any dbg.declare or more than one.
static DbgDeclareInst *getDbgDeclare(Value &Val) {
- // Gets the mix of dbg.declare and dbg.addr.
- SmallVector<DbgVariableIntrinsic *, 4> DbgIntrinsics;
- findDbgUsers(DbgIntrinsics, &Val);
-
- // If there is no DI at all, returns nullptr without warning.
- if (DbgIntrinsics.empty())
- return nullptr;
-
- SmallVector<DbgVariableIntrinsic *, 4> DbgDeclares;
- llvm::copy_if(
- DbgIntrinsics, std::back_inserter(DbgDeclares),
- [](DbgVariableIntrinsic *Intr) { return isa<DbgDeclareInst>(Intr); });
-
- // Returns nullptr if there is no dbg.declare at all.
- if (DbgDeclares.empty()) {
- LLVM_DEBUG(reportUnsupportedDbgIntrinsics(
- dbgs(), "No dbg.declare for value", DbgIntrinsics));
- return nullptr;
- }
-
- // Returns nullptr if there are more than one dbg.declares.
- if (DbgDeclares.size() > 1) {
- LLVM_DEBUG(reportUnsupportedDbgIntrinsics(
- dbgs(), "Too many dbg.declare for value", DbgDeclares));
- return nullptr;
- }
-
- return cast<DbgDeclareInst>(DbgDeclares.front());
+ (void)Val;
+ return nullptr;
}
//
@@ -1218,10 +1192,10 @@ void Substituter::createLifetime(Instruction *OldI, AllocaInst *NewAI) {
switch (II->getIntrinsicID()) {
case Intrinsic::lifetime_start:
- Builder.CreateLifetimeStart(NewAI, SizeC);
+ Builder.CreateLifetimeStart(NewAI);
break;
case Intrinsic::lifetime_end:
- Builder.CreateLifetimeEnd(NewAI, SizeC);
+ Builder.CreateLifetimeEnd(NewAI);
break;
default:
break;
@@ -2117,7 +2091,7 @@ const char *getTypePrefix(Type &Ty) {
return "l";
case Type::MetadataTyID:
return "m";
- case Type::X86_MMXTyID:
+ case Type::TargetExtTyID:
return "mmx";
case Type::TokenTyID:
return "t";
diff --git a/IGC/VectorCompiler/lib/GenXCodeGen/GenXTargetMachine.cpp b/IGC/VectorCompiler/lib/GenXCodeGen/GenXTargetMachine.cpp
index f556942..6b5410e 100644
--- a/IGC/VectorCompiler/lib/GenXCodeGen/GenXTargetMachine.cpp
+++ b/IGC/VectorCompiler/lib/GenXCodeGen/GenXTargetMachine.cpp
@@ -65,7 +65,6 @@ SPDX-License-Identifier: MIT
#include "llvm/Pass.h"
#include "llvm/PassRegistry.h"
#include "llvm/Passes/PassBuilder.h"
-#include "llvm/Passes/PassPlugin.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Transforms/IPO.h"
#include "llvm/Transforms/IPO/AlwaysInliner.h"
@@ -266,7 +265,7 @@ void initializeGenXPasses(PassRegistry &registry) {
TargetTransformInfo GenXTargetMachine::getTargetTransformInfo(const Function &F)
LLVM_GET_TTI_API_QUAL {
GenXTTIImpl GTTI(F.getParent()->getDataLayout(), *BC, Subtarget);
- return TargetTransformInfo(std::move(GTTI));
+ return TargetTransformInfo(std::make_unique<const GenXTTIImpl>(std::move(GTTI)));
}
void GenXTTIImpl::getUnrollingPreferences(
Loop *L, ScalarEvolution &SE, TargetTransformInfo::UnrollingPreferences &UP,
@@ -426,7 +425,7 @@ GenXTargetMachine::GenXTargetMachine(const Target &T, const Triple &TT,
const TargetOptions &Options,
IGCLLVM::optional<Reloc::Model> RM,
IGCLLVM::optional<CodeModel::Model> CM,
- CodeGenOpt::Level OL, bool Is64Bit,
+ CodeGenOptLevel OL, bool Is64Bit,
std::unique_ptr<GenXBackendConfig> BC)
: IGCLLVM::LLVMTargetMachine(
T, getDL(Is64Bit), TT, CPU, FS, Options,
@@ -451,7 +450,7 @@ GenXTargetMachine32::GenXTargetMachine32(const Target &T, const Triple &TT,
const TargetOptions &Options,
IGCLLVM::optional<Reloc::Model> RM,
IGCLLVM::optional<CodeModel::Model> CM,
- CodeGenOpt::Level OL, bool JIT,
+ CodeGenOptLevel OL, bool JIT,
std::unique_ptr<GenXBackendConfig> BC)
: GenXTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, false,
std::move(BC)) {}
@@ -461,7 +460,7 @@ GenXTargetMachine64::GenXTargetMachine64(const Target &T, const Triple &TT,
const TargetOptions &Options,
IGCLLVM::optional<Reloc::Model> RM,
IGCLLVM::optional<CodeModel::Model> CM,
- CodeGenOpt::Level OL, bool JIT,
+ CodeGenOptLevel OL, bool JIT,
std::unique_ptr<GenXBackendConfig> BC)
: GenXTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, true,
std::move(BC)) {}
@@ -470,7 +469,7 @@ namespace vc {
std::unique_ptr<llvm::TargetMachine> createGenXTargetMachine(
const Target &T, Triple TT, StringRef CPU, StringRef Features,
const TargetOptions &Options, IGCLLVM::optional<Reloc::Model> RM,
- IGCLLVM::optional<CodeModel::Model> CM, CodeGenOpt::Level OL,
+ IGCLLVM::optional<CodeModel::Model> CM, CodeGenOptLevel OL,
std::unique_ptr<GenXBackendConfig> BC) {
if (is32BitArch(TT))
return std::make_unique<GenXTargetMachine32>(T, TT, CPU, Features, Options,
@@ -505,8 +504,8 @@ bool GenXTargetMachine::addPassesToEmitFile(
// We can consider the .isa file to be an object file, or an assembly file
// which may later be converted to GenX code by the Finalizer. If we're
// asked to produce any other type of file return true to indicate an error.
- if ((FileType != IGCLLVM::TargetMachine::CodeGenFileType::CGFT_ObjectFile) &&
- (FileType != IGCLLVM::TargetMachine::CodeGenFileType::CGFT_AssemblyFile))
+ if ((FileType != IGCLLVM::TargetMachine::CodeGenFileType::ObjectFile) &&
+ (FileType != IGCLLVM::TargetMachine::CodeGenFileType::AssemblyFile))
return true;
GenXPassConfig *PassConfig = createGenXPassConfig(*this, PM);
@@ -707,7 +706,8 @@ bool GenXTargetMachine::addPassesToEmitFile(
}
/// .. include:: GenXRegionCollapsing.cpp
- vc::addPass(PM, createGenXRegionCollapsingPass());
+ if (!BackendConfig.isBiFCompilation())
+ vc::addPass(PM, createGenXRegionCollapsingPass());
/// EarlyCSE
/// --------
/// This is a standard LLVM pass, run at this point in the GenX backend.
@@ -995,7 +995,8 @@ void GenXTargetMachine::adjustPassManager(PassManagerBuilder &PMBuilder) {
PM.add(IGCLLVM::createLegacyWrappedSimpleLoopUnrollPass());
PM.add(createInstructionCombiningPass());
// Simplify region accesses.
- PM.add(createGenXRegionCollapsingPass());
+ if (!BackendConfig.isBiFCompilation())
+ PM.add(createGenXRegionCollapsingPass());
PM.add(createEarlyCSEPass());
PM.add(createDeadCodeEliminationPass());
}
@@ -1175,8 +1176,7 @@ void GenXTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) {
// TODO: Check LICM-options
PM.addPass(createModuleToFunctionPassAdaptor(
createFunctionToLoopPassAdaptor(LICMPass(100, 250, false),
- /*UseMemorySSA=*/true,
- /*UseBlockFrequencyInfo=*/true)));
+ /*UseMemorySSA=*/true)));
PM.addPass(createModuleToFunctionPassAdaptor(EarlyCSEPass(true)));
PM.addPass(createModuleToFunctionPassAdaptor(InstCombinePass()));
@@ -1194,8 +1194,9 @@ void GenXTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) {
PM.addPass(createModuleToFunctionPassAdaptor(LoopUnrollPass()));
PM.addPass(createModuleToFunctionPassAdaptor(InstCombinePass()));
// Simplify region accesses.
- PM.addPass(
- createModuleToFunctionPassAdaptor(GenXRegionCollapsingPass(this)));
+ if (!this->getBackendConfig()->isBiFCompilation())
+ PM.addPass(
+ createModuleToFunctionPassAdaptor(GenXRegionCollapsingPass(this)));
PM.addPass(createModuleToFunctionPassAdaptor(EarlyCSEPass(true)));
PM.addPass(createModuleToFunctionPassAdaptor(DCEPass()));
// }
diff --git a/IGC/VectorCompiler/lib/GenXCodeGen/GenXTargetMachine.h b/IGC/VectorCompiler/lib/GenXCodeGen/GenXTargetMachine.h
index f3c1311..6f98736 100644
--- a/IGC/VectorCompiler/lib/GenXCodeGen/GenXTargetMachine.h
+++ b/IGC/VectorCompiler/lib/GenXCodeGen/GenXTargetMachine.h
@@ -52,7 +52,7 @@ public:
StringRef FS, const TargetOptions &Options,
IGCLLVM::optional<Reloc::Model> RM,
IGCLLVM::optional<CodeModel::Model> CM,
- CodeGenOpt::Level OL, bool Is64Bit)
+ CodeGenOptLevel OL, bool Is64Bit)
: GenXTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, Is64Bit,
std::make_unique<GenXBackendConfig>()) {}
@@ -60,7 +60,7 @@ public:
StringRef FS, const TargetOptions &Options,
IGCLLVM::optional<Reloc::Model> RM,
IGCLLVM::optional<CodeModel::Model> CM,
- CodeGenOpt::Level OL, bool Is64Bit,
+ CodeGenOptLevel OL, bool Is64Bit,
std::unique_ptr<GenXBackendConfig> BC);
~GenXTargetMachine() override;
@@ -108,7 +108,7 @@ public:
StringRef FS, const TargetOptions &Options,
IGCLLVM::optional<Reloc::Model> RM,
IGCLLVM::optional<CodeModel::Model> CM,
- CodeGenOpt::Level OL, bool JIT)
+ CodeGenOptLevel OL, bool JIT)
: GenXTargetMachine32(T, TT, CPU, FS, Options, RM, CM, OL, JIT,
std::make_unique<GenXBackendConfig>()) {}
@@ -116,7 +116,7 @@ public:
StringRef FS, const TargetOptions &Options,
IGCLLVM::optional<Reloc::Model> RM,
IGCLLVM::optional<CodeModel::Model> CM,
- CodeGenOpt::Level OL, bool JIT,
+ CodeGenOptLevel OL, bool JIT,
std::unique_ptr<GenXBackendConfig> BC);
};
@@ -126,7 +126,7 @@ public:
StringRef FS, const TargetOptions &Options,
IGCLLVM::optional<Reloc::Model> RM,
IGCLLVM::optional<CodeModel::Model> CM,
- CodeGenOpt::Level OL, bool JIT)
+ CodeGenOptLevel OL, bool JIT)
: GenXTargetMachine64(T, TT, CPU, FS, Options, RM, CM, OL, JIT,
std::make_unique<GenXBackendConfig>()) {}
@@ -134,7 +134,7 @@ public:
StringRef FS, const TargetOptions &Options,
IGCLLVM::optional<Reloc::Model> RM,
IGCLLVM::optional<CodeModel::Model> CM,
- CodeGenOpt::Level OL, bool JIT,
+ CodeGenOptLevel OL, bool JIT,
std::unique_ptr<GenXBackendConfig> BC);
};
diff --git a/IGC/VectorCompiler/lib/GenXCodeGen/GenXUtil.cpp b/IGC/VectorCompiler/lib/GenXCodeGen/GenXUtil.cpp
index 9d81f08..5c70e4a 100644
--- a/IGC/VectorCompiler/lib/GenXCodeGen/GenXUtil.cpp
+++ b/IGC/VectorCompiler/lib/GenXCodeGen/GenXUtil.cpp
@@ -129,7 +129,7 @@ CallInst *genx::createAddAddr(Value *Lhs, Value *Rhs, const Twine &Name,
CallInst *genx::createUnifiedRet(Type *Ty, const Twine &Name, Module *M) {
IGC_ASSERT_MESSAGE(Ty, "wrong argument");
IGC_ASSERT_MESSAGE(M, "wrong argument");
- auto G = Intrinsic::getDeclaration(M, Intrinsic::ssa_copy, Ty);
+ auto G = Intrinsic::getOrInsertDeclaration(M, Intrinsic::ssa_copy, Ty);
return CallInst::Create(G, UndefValue::get(Ty), Name + ".unifiedret",
static_cast<Instruction *>(nullptr));
}
@@ -172,11 +172,23 @@ Constant *genx::getConstantSubvector(const Constant *V, unsigned StartIdx,
SubVec = UndefValue::get(RegionTy);
else if (isa<ConstantAggregateZero>(V))
SubVec = ConstantAggregateZero::get(RegionTy);
- else {
- SmallVector<Constant *, 32> Val;
- for (unsigned i = 0; i != Size; ++i)
- Val.push_back(V->getAggregateElement(i + StartIdx));
- SubVec = ConstantVector::get(Val);
+ else { SmallVector<Constant *, 32> Val;
+ bool HasNull = false;
+ for (unsigned i = 0; i != Size; ++i) {
+ Constant *Elt = V->getAggregateElement(i + StartIdx);
+ HasNull |= (Elt == nullptr);
+ Val.push_back(Elt);
+ }
+ if (!HasNull)
+ SubVec = ConstantVector::get(Val);
+ else {
+ SmallVector<int, 32> Mask;
+ for (unsigned i = 0; i != Size; ++i)
+ Mask.push_back(StartIdx + i);
+ SubVec = ConstantExpr::getShuffleVector(const_cast<Constant *>(V),
+ UndefValue::get(V->getType()),
+ Mask, RegionTy);
+ }
}
return SubVec;
}
@@ -1169,7 +1181,7 @@ static void convertI64ToI32(Constant &K, SmallVectorImpl<Constant *> &K32) {
if (isa<ConstantExpr>(K)) {
auto *Lo = ConstantExpr::getTrunc(&K, Ty32);
auto *Amount = ConstantInt::get(K.getType(), 32);
- auto *Shift = ConstantExpr::getLShr(&K, Amount);
+ auto *Shift = ConstantExpr::get(Instruction::LShr, &K, Amount);
auto *Hi = ConstantExpr::getTrunc(Shift, Ty32);
return std::make_pair(Lo, Hi);
}
@@ -2510,12 +2522,14 @@ inline llvm::SmallPtrSet<T *, 1> genx_getSrcVLoads__impl(T *I) {
I = dyn_cast<T>(genx::getBitCastedValue(I));
llvm::SmallPtrSet<T *, 1> Res;
if (!I)
- return Res;
- for (const auto &Opnd : I->operands())
- if (auto *OpndSrc =
- dyn_cast<Instruction>(genx::getBitCastedValue(Opnd.get())))
- if (genx::isAVLoad(OpndSrc))
- Res.insert(OpndSrc);
+ return Res; for (const auto &Opnd : I->operands()) {
+ auto *OpndVal = Opnd.get();
+ if (!OpndVal)
+ continue;
+ auto *OpndSrc = dyn_cast<Instruction>(genx::getBitCastedValue(OpndVal));
+ if (genx::isAVLoad(OpndSrc))
+ Res.insert(OpndSrc);
+ }
return Res;
};
}; // namespace
diff --git a/IGC/VectorCompiler/lib/GenXOpts/CMPacketize/GenXPacketize.cpp b/IGC/VectorCompiler/lib/GenXOpts/CMPacketize/GenXPacketize.cpp
index 5e674d6..e671f5a 100644
--- a/IGC/VectorCompiler/lib/GenXOpts/CMPacketize/GenXPacketize.cpp
+++ b/IGC/VectorCompiler/lib/GenXOpts/CMPacketize/GenXPacketize.cpp
@@ -253,10 +253,19 @@ bool GenXPacketize::runOnModule(Module &Module) {
delete B;
// perform reg-to-mem in order to generate simd-control-flow without phi
// we then perform mem-to-reg after generating simd-control-flow.
- std::unique_ptr<FunctionPass> DemotePass(createDemoteRegisterToMemoryPass());
for (auto *F : SIMTFuncs) {
GenXUnifyReturnBlocks(*F);
- DemotePass->runOnFunction(*F);
+ SmallVector<Instruction *, 16> ToDemote;
+ for (auto &BB : *F)
+ for (auto &I : BB)
+ if ((isa<PHINode>(I) || (!I.getType()->isVoidTy() && !isa<AllocaInst>(I) && !I.isTerminator())) &&
+ !isa<DbgInfoIntrinsic>(I))
+ ToDemote.push_back(&I);
+ for (auto *I : ToDemote)
+ if (auto *PN = dyn_cast<PHINode>(I))
+ DemotePHIToStack(PN);
+ else
+ DemoteRegToStack(*I);
}
// lower the SIMD control-flow
lowerControlFlowAfter(SIMTFuncs);
@@ -298,8 +307,8 @@ Function *GenXPacketize::vectorizeSIMTFunction(Function *F, unsigned Width) {
VecFName + Suffix[Width / 8], F->getParent());
ClonedFunc->setCallingConv(F->getCallingConv());
ClonedFunc->setAttributes(F->getAttributes());
- if (F->getAlignment() > 0)
- ClonedFunc->setAlignment(IGCLLVM::getAlign(*F));
+ if (auto Alignment = F->getFnAttribute(Attribute::Alignment).getAlignment())
+ ClonedFunc->setAlignment(*Alignment);
// then use CloneFunctionInto
ValueToValueMapTy ArgMap;
auto ArgI = ClonedFunc->arg_begin();
@@ -736,7 +745,7 @@ Function *GenXPacketize::getVectorIntrinsic(Module *M, unsigned ID,
if (GenXIntrinsic::isGenXIntrinsic(ID))
return GenXIntrinsic::getGenXDeclaration(
M, static_cast<GenXIntrinsic::ID>(ID), ArgTy);
- return Intrinsic::getDeclaration(M, static_cast<Intrinsic::ID>(ID),
+ return Intrinsic::getOrInsertDeclaration(M, static_cast<Intrinsic::ID>(ID),
{ArgTy[0]});
}
@@ -1673,10 +1682,6 @@ Value *GenXPacketize::packetizeInstruction(Instruction *Inst) {
// When the resulting instruction has the same type
// Debug values can be preserved
if (Result->getType() == Inst->getType()) {
- SmallVector<DbgVariableIntrinsic *, 1> DbgUsers;
- llvm::findDbgUsers(DbgUsers, Inst);
- for (auto *DII : DbgUsers)
- DII->replaceVariableLocationOp(Inst, Result);
}
// Copy any metadata to new instruction
if (Result != Inst && isa<Instruction>(Result)) {
@@ -1718,22 +1723,22 @@ void GenXPacketize::fixupLLVMIntrinsics(Function &F) {
auto *CI = cast<CallInst>(&I);
auto *F = CI->getCalledFunction();
if (F) {
- if (F->getName().startswith("sqrt")) {
+ if (F->getName().starts_with("sqrt")) {
B->IRB->SetInsertPoint(&I);
auto *pSqrt = B->VSQRTPS(CI->getOperand(0));
CI->replaceAllUsesWith(pSqrt);
RemoveSet.insert(CI);
- } else if (F->getName().startswith("fabs")) {
+ } else if (F->getName().starts_with("fabs")) {
B->IRB->SetInsertPoint(&I);
auto *pFabs = B->FABS(CI->getOperand(0));
CI->replaceAllUsesWith(pFabs);
RemoveSet.insert(CI);
- } else if (F->getName().startswith("exp2")) {
+ } else if (F->getName().starts_with("exp2")) {
B->IRB->SetInsertPoint(&I);
auto *pExp2 = B->EXP2(CI->getOperand(0));
CI->replaceAllUsesWith(pExp2);
RemoveSet.insert(CI);
- } else if (F->getName().equals("ldexpf")) {
+ } else if (F->getName() == "ldexpf") {
B->IRB->SetInsertPoint(&I);
auto *pArg = CI->getOperand(0);
auto *pExp = CI->getOperand(1);
diff --git a/IGC/VectorCompiler/lib/GenXOpts/CMPacketize/PacketBuilder_math.cpp b/IGC/VectorCompiler/lib/GenXOpts/CMPacketize/PacketBuilder_math.cpp
index d4fcb0d..82d1688 100644
--- a/IGC/VectorCompiler/lib/GenXOpts/CMPacketize/PacketBuilder_math.cpp
+++ b/IGC/VectorCompiler/lib/GenXOpts/CMPacketize/PacketBuilder_math.cpp
@@ -115,14 +115,14 @@ Value *PacketBuilder::ASHR(Value *LHS, uint64_t RHS, const Twine &Name,
Value *PacketBuilder::EXP2(Value *A, const llvm::Twine &Name) {
SmallVector<Type *, 1> Args;
Args.push_back(A->getType());
- auto *Decl = Intrinsic::getDeclaration(M, Intrinsic::exp2, Args);
+ auto *Decl = Intrinsic::getOrInsertDeclaration(M, Intrinsic::exp2, Args);
return CALL(Decl, std::initializer_list<Value *>{A}, Name);
}
Value *PacketBuilder::FABS(Value *A, const llvm::Twine &Name) {
SmallVector<Type *, 1> Args;
Args.push_back(A->getType());
- auto *Decl = Intrinsic::getDeclaration(M, Intrinsic::fabs, Args);
+ auto *Decl = Intrinsic::getOrInsertDeclaration(M, Intrinsic::fabs, Args);
return CALL(Decl, std::initializer_list<Value *>{A}, Name);
}
@@ -203,21 +203,21 @@ Value *PacketBuilder::TRUNC(Value *V, Type *DestTy, const Twine &Name) {
Value *PacketBuilder::VMINPS(Value *A, Value *B, const llvm::Twine &Name) {
SmallVector<Type *, 1> Args;
Args.push_back(A->getType());
- auto *Decl = Intrinsic::getDeclaration(M, Intrinsic::minnum, Args);
+ auto *Decl = Intrinsic::getOrInsertDeclaration(M, Intrinsic::minnum, Args);
return CALL(Decl, std::initializer_list<Value *>{A, B}, Name);
}
Value *PacketBuilder::VMAXPS(Value *A, Value *B, const llvm::Twine &Name) {
SmallVector<Type *, 1> Args;
Args.push_back(A->getType());
- auto *Decl = Intrinsic::getDeclaration(M, Intrinsic::maxnum, Args);
+ auto *Decl = Intrinsic::getOrInsertDeclaration(M, Intrinsic::maxnum, Args);
return CALL(Decl, std::initializer_list<Value *>{A, B}, Name);
}
Value *PacketBuilder::VSQRTPS(Value *A, const llvm::Twine &Name) {
SmallVector<Type *, 1> Args;
Args.push_back(A->getType());
- auto *Decl = Intrinsic::getDeclaration(M, Intrinsic::sqrt, Args);
+ auto *Decl = Intrinsic::getOrInsertDeclaration(M, Intrinsic::sqrt, Args);
return CALL(Decl, std::initializer_list<Value *>{A}, Name);
}
diff --git a/IGC/VectorCompiler/lib/GenXOpts/CMTrans/CMABI.cpp b/IGC/VectorCompiler/lib/GenXOpts/CMTrans/CMABI.cpp
index c03ebf3..833bf38 100644
--- a/IGC/VectorCompiler/lib/GenXOpts/CMTrans/CMABI.cpp
+++ b/IGC/VectorCompiler/lib/GenXOpts/CMTrans/CMABI.cpp
@@ -549,7 +549,7 @@ bool CMABIBase<CallGraphImpl>::runOnCallGraphImpl(CallGraphImpl &SCC) {
Arg.replaceAllUsesWith(Alloca);
auto *DstTy = PointerType::get(Int8Ty, vc::AddrSpace::Private);
auto *SrcTy = PointerType::get(Int8Ty, PtrTy->getPointerAddressSpace());
- auto *Decl = Intrinsic::getDeclaration(M, Intrinsic::memcpy,
+ auto *Decl = Intrinsic::getOrInsertDeclaration(M, Intrinsic::memcpy,
{DstTy, SrcTy, Int64Ty});
auto *Dst = new BitCastInst(Alloca, DstTy, "", InsertBefore);
auto *Src = new BitCastInst(&Arg, SrcTy, "", InsertBefore);
diff --git a/IGC/VectorCompiler/lib/GenXOpts/CMTrans/CMKernelArgOffset.cpp b/IGC/VectorCompiler/lib/GenXOpts/CMTrans/CMKernelArgOffset.cpp
index 2d62112..5f3f665 100644
--- a/IGC/VectorCompiler/lib/GenXOpts/CMTrans/CMKernelArgOffset.cpp
+++ b/IGC/VectorCompiler/lib/GenXOpts/CMTrans/CMKernelArgOffset.cpp
@@ -261,7 +261,7 @@ void CMKernelArgOffset::resolveByValArgs(Function *F) const {
Builder.CreateAlloca(F->getParamByValType(Arg.getArgNo()), nullptr,
Arg.getName() + ".linearization");
- Value *BaseAsI8Ptr = Builder.CreateBitCast(Base, Builder.getInt8PtrTy(),
+ Value *BaseAsI8Ptr = Builder.CreateBitCast(Base, PointerType::get(Builder.getInt8Ty(), 0),
Base->getName() + ".i8");
for (const auto &Info : KM->arg_lin(&Arg)) {
Value *StoreAddrUntyped =
diff --git a/IGC/VectorCompiler/lib/GenXOpts/CMTrans/GenXImportOCLBiF.cpp b/IGC/VectorCompiler/lib/GenXOpts/CMTrans/GenXImportOCLBiF.cpp
index a017f9b..4e9dccd 100644
--- a/IGC/VectorCompiler/lib/GenXOpts/CMTrans/GenXImportOCLBiF.cpp
+++ b/IGC/VectorCompiler/lib/GenXOpts/CMTrans/GenXImportOCLBiF.cpp
@@ -185,7 +185,7 @@ static Function *getOneMapIntrinsicDeclaration(CallInst &CI, const unsigned IID,
return vc::getGenXDeclarationForIdFromArgs(
CI.getType(), CI.args(), static_cast<GenXIntrinsic::ID>(IID), M);
- return Intrinsic::getDeclaration(&M, static_cast<Intrinsic::ID>(IID),
+ return Intrinsic::getOrInsertDeclaration(&M, static_cast<Intrinsic::ID>(IID),
{CI.getType()});
}
@@ -265,21 +265,21 @@ void BIConvert::runOnModule(Module &M) {
ListDelete.push_back(InstCall);
}
// other cases
- else if (CalleeName.startswith("__builtin_IB_itof")) {
+ else if (CalleeName.starts_with("__builtin_IB_itof")) {
Instruction *Replace = SIToFPInst::Create(
Instruction::SIToFP, InstCall->getArgOperand(0),
callee->getReturnType(), InstCall->getName(), InstCall);
Replace->setDebugLoc(InstCall->getDebugLoc());
InstCall->replaceAllUsesWith(Replace);
ListDelete.push_back(InstCall);
- } else if (CalleeName.startswith("__builtin_IB_uitof")) {
+ } else if (CalleeName.starts_with("__builtin_IB_uitof")) {
Instruction *Replace = UIToFPInst::Create(
Instruction::UIToFP, InstCall->getArgOperand(0),
callee->getReturnType(), InstCall->getName(), InstCall);
Replace->setDebugLoc(InstCall->getDebugLoc());
InstCall->replaceAllUsesWith(Replace);
ListDelete.push_back(InstCall);
- } else if (CalleeName.startswith("__builtin_IB_mul_rtz")) {
+ } else if (CalleeName.starts_with("__builtin_IB_mul_rtz")) {
Instruction *Mul = BinaryOperator::Create(
Instruction::FMul, InstCall->getArgOperand(0),
InstCall->getArgOperand(1), InstCall->getName(), InstCall);
@@ -297,7 +297,7 @@ void BIConvert::runOnModule(Module &M) {
IntrinCall->setDebugLoc(InstCall->getDebugLoc());
InstCall->replaceAllUsesWith(IntrinCall);
ListDelete.push_back(InstCall);
- } else if (CalleeName.startswith("__builtin_IB_add_rtz")) {
+ } else if (CalleeName.starts_with("__builtin_IB_add_rtz")) {
Instruction *Add = BinaryOperator::Create(
Instruction::FAdd, InstCall->getArgOperand(0),
InstCall->getArgOperand(1), InstCall->getName(), InstCall);
@@ -518,7 +518,7 @@ bool GenXImportOCLBiF::runOnModule(Module &M) {
{
IGC::BiFManager::BiFManagerHandler bifLinker(M.getContext());
- bifLinker.SetTargetTriple(M.getTargetTriple());
+ bifLinker.SetTargetTriple(M.getTargetTriple().str());
bifLinker.SetDataLayout(M.getDataLayout());
bifLinker.SetCallbackLinker([](Module &M, const StringSet<> &GVS) {
internalizeModule(M, [&GVS](const GlobalValue &GV) {
diff --git a/IGC/VectorCompiler/lib/GenXOpts/CMTrans/GenXPrintfResolution.cpp b/IGC/VectorCompiler/lib/GenXOpts/CMTrans/GenXPrintfResolution.cpp
index 60292f4..c157e61 100644
--- a/IGC/VectorCompiler/lib/GenXOpts/CMTrans/GenXPrintfResolution.cpp
+++ b/IGC/VectorCompiler/lib/GenXOpts/CMTrans/GenXPrintfResolution.cpp
@@ -98,7 +98,7 @@ class GenXPrintfResolution final : public ModulePass {
std::array<FunctionCallee, PrintfImplFunc::Size> PrintfImplDecl;
#if LLVM_VERSION_MAJOR >= 16
- GenXBackendConfig *BC;
+ GenXBackendConfigResult *BC;
#endif
public:
@@ -106,7 +106,7 @@ public:
#if LLVM_VERSION_MAJOR < 16
GenXPrintfResolution() : ModulePass(ID) {}
#else
- GenXPrintfResolution(GenXBackendConfig *BC) : BC(BC), ModulePass(ID) {}
+ GenXPrintfResolution(GenXBackendConfigResult *BC) : BC(BC), ModulePass(ID) {}
#endif
StringRef getPassName() const override { return "GenX printf resolution"; }
void getAnalysisUsage(AnalysisUsage &AU) const override;
@@ -155,9 +155,8 @@ ModulePass *createGenXPrintfResolutionPass() {
PreservedAnalyses
GenXPrintfResolutionPass::run(llvm::Module &M,
llvm::AnalysisManager<llvm::Module> &AM) {
- const GenXTargetMachine *GXTM = static_cast<const GenXTargetMachine *>(TM);
- IGC_ASSERT(GXTM);
- GenXPrintfResolution GenXPrint(GXTM->getBackendConfig());
+ auto &BC = AM.getResult<GenXBackendConfigPass>(M);
+ GenXPrintfResolution GenXPrint(&BC);
if (GenXPrint.runOnModule(M))
return PreservedAnalyses::none();
return PreservedAnalyses::all();
diff --git a/IGC/VectorCompiler/lib/GenXOpts/CMTrans/GenXTranslateSPIRVBuiltins.cpp b/IGC/VectorCompiler/lib/GenXOpts/CMTrans/GenXTranslateSPIRVBuiltins.cpp
index 17247ed..5bacfab 100644
--- a/IGC/VectorCompiler/lib/GenXOpts/CMTrans/GenXTranslateSPIRVBuiltins.cpp
+++ b/IGC/VectorCompiler/lib/GenXOpts/CMTrans/GenXTranslateSPIRVBuiltins.cpp
@@ -219,25 +219,25 @@ Value *SPIRVExpander::visitCallInst(CallInst &CI) {
}
// Addrspace-related builtins.
- if (CalleeName.startswith("GenericCastToPtrExplicit"))
+ if (CalleeName.starts_with("GenericCastToPtrExplicit"))
return emitIntrinsic(Builder, vc::InternalIntrinsic::cast_to_ptr_explicit,
Ty, {CI.getArgOperand(0)});
// SPV_INTEL_bfloat16_conversion extension.
- if (CalleeName.startswith("ConvertFToBF16INTEL")) {
+ if (CalleeName.starts_with("ConvertFToBF16INTEL")) {
auto *Arg = CI.getArgOperand(0);
auto *ArgTy = Arg->getType();
return emitIntrinsic(Builder, vc::InternalIntrinsic::cast_to_bf16,
{Ty, ArgTy}, {Arg});
}
- if (CalleeName.startswith("ConvertBF16ToFINTEL")) {
+ if (CalleeName.starts_with("ConvertBF16ToFINTEL")) {
auto *Arg = CI.getArgOperand(0);
auto *ArgTy = Arg->getType();
return emitIntrinsic(Builder, vc::InternalIntrinsic::cast_from_bf16,
{Ty, ArgTy}, {Arg});
}
// SPV_INTEL_tensor_float32_rounding extension.
- if (CalleeName.startswith("RoundFToTF32INTEL") ||
- CalleeName.startswith("ConvertFToTF32INTEL")) {
+ if (CalleeName.starts_with("RoundFToTF32INTEL") ||
+ CalleeName.starts_with("ConvertFToTF32INTEL")) {
auto *Arg = CI.getArgOperand(0);
auto *ArgTy = Arg->getType();
Type *ResTy = Builder.getInt32Ty();
@@ -249,14 +249,14 @@ Value *SPIRVExpander::visitCallInst(CallInst &CI) {
return Builder.CreateBitCast(Intr, Ty);
}
// SPV_KHR_shader_clock extension.
- if (CalleeName.startswith("ReadClockKHR")) {
+ if (CalleeName.starts_with("ReadClockKHR")) {
auto *Intr = emitIntrinsic(Builder, Intrinsic::readcyclecounter,
llvm::ArrayRef<llvm::Type *>(), {});
return Builder.CreateBitCast(Intr, CI.getType());
}
// SPV_EXT_shader_atomic_float_min_max extension
- if (CalleeName.startswith("AtomicFMin") ||
- CalleeName.startswith("AtomicFMax")) {
+ if (CalleeName.starts_with("AtomicFMin") ||
+ CalleeName.starts_with("AtomicFMax")) {
auto *Ptr = CI.getArgOperand(0);
auto *Scope = CI.getArgOperand(1);
auto *Semantic = CI.getArgOperand(2);
@@ -290,7 +290,7 @@ Value *SPIRVExpander::visitCallInst(CallInst &CI) {
if (IID != Intrinsic::not_intrinsic)
return emitMulExtended(Builder, IID, CI);
- if (CalleeName.startswith("Dot")) {
+ if (CalleeName.starts_with("Dot")) {
return emitDot(Builder, IID, CI);
}
@@ -350,45 +350,45 @@ Value *SPIRVExpander::visitCallInst(CallInst &CI) {
return emitMathIntrinsic(Builder, IID, Ty, Args, true);
}
- if (CalleeName.startswith("divide"))
+ if (CalleeName.starts_with("divide"))
return emitFDiv(Builder, CI.getArgOperand(0), CI.getArgOperand(1), true);
- if (CalleeName.startswith("exp10")) {
+ if (CalleeName.starts_with("exp10")) {
// exp10(x) == exp2(x * log2(10))
auto *C = ConstantFP::get(Ty, Log2_10);
auto *ArgV = Builder.CreateFMul(CI.getArgOperand(0), C);
return emitMathIntrinsic(Builder, Intrinsic::exp2, Ty, {ArgV}, true);
}
- if (CalleeName.startswith("exp")) {
+ if (CalleeName.starts_with("exp")) {
// exp(x) == exp2(x * log2(e))
auto *C = ConstantFP::get(Ty, Log2E);
auto *ArgV = Builder.CreateFMul(CI.getArgOperand(0), C);
return emitMathIntrinsic(Builder, Intrinsic::exp2, Ty, {ArgV}, true);
}
- if (CalleeName.startswith("log10")) {
+ if (CalleeName.starts_with("log10")) {
// log10(x) == log2(x) * log10(2)
auto *LogV = emitMathIntrinsic(Builder, Intrinsic::log2, Ty,
{CI.getArgOperand(0)}, true);
auto *C = ConstantFP::get(Ty, Log10_2);
return Builder.CreateFMul(LogV, C);
}
- if (CalleeName.startswith("log")) {
+ if (CalleeName.starts_with("log")) {
// ln(x) == log2(x) * ln(2)
auto *LogV = emitMathIntrinsic(Builder, Intrinsic::log2, Ty,
{CI.getArgOperand(0)}, true);
auto *C = ConstantFP::get(Ty, Ln2);
return Builder.CreateFMul(LogV, C);
}
- if (CalleeName.startswith("recip")) {
+ if (CalleeName.starts_with("recip")) {
auto *OneC = ConstantFP::get(Ty, 1.0);
return emitFDiv(Builder, OneC, CI.getArgOperand(0), true);
}
- if (CalleeName.startswith("rsqrt")) {
+ if (CalleeName.starts_with("rsqrt")) {
auto *OneC = ConstantFP::get(Ty, 1.0);
auto *SqrtV = emitMathIntrinsic(Builder, Intrinsic::sqrt, Ty,
{CI.getArgOperand(0)}, true);
return emitFDiv(Builder, OneC, SqrtV, true);
}
- if (CalleeName.startswith("tan")) {
+ if (CalleeName.starts_with("tan")) {
// tan(x) == sin(x) / cos(x)
auto *ArgV = CI.getArgOperand(0);
auto *SinV = emitMathIntrinsic(Builder, Intrinsic::sin, Ty, {ArgV}, true);
@@ -462,7 +462,7 @@ void GenXTranslateSPIRVBuiltins::getAnalysisUsage(AnalysisUsage &AU) const {
static bool isSPIRVBuiltinDecl(const Function &F) {
auto Name = F.getName();
// __devicelib_* functions may have implementations which VC should replace
- if (Name.startswith("__devicelib") || Name == "__assert_fail")
+ if (Name.starts_with("__devicelib") || Name == "__assert_fail")
return true;
if (!F.isDeclaration())
return false;
diff --git a/IGC/VectorCompiler/lib/GenXOpts/CMTrans/GenXTypeLegalization.cpp b/IGC/VectorCompiler/lib/GenXOpts/CMTrans/GenXTypeLegalization.cpp
index a3cbc90..7c9a759 100644
--- a/IGC/VectorCompiler/lib/GenXOpts/CMTrans/GenXTypeLegalization.cpp
+++ b/IGC/VectorCompiler/lib/GenXOpts/CMTrans/GenXTypeLegalization.cpp
@@ -130,7 +130,7 @@ Value *GenXTypeLegalization::getLegalizedValue(Value *OldV) {
if (auto *C = dyn_cast<Constant>(OldV)) {
auto *NewCType = getLegalizedType(C->getType());
// TODO: consider signess here.
- return ConstantExpr::getZExt(C, NewCType);
+ return ConstantExpr::getCast(Instruction::ZExt, C, NewCType);
}
auto *NewV = ValueMap[OldV];
// Instructions are visited in topological order so a record should exist.
diff --git a/IGC/VectorCompiler/lib/InternalIntrinsics/InternalIntrinsics.cpp b/IGC/VectorCompiler/lib/InternalIntrinsics/InternalIntrinsics.cpp
index eaf3a52..fb1c91c 100644
--- a/IGC/VectorCompiler/lib/InternalIntrinsics/InternalIntrinsics.cpp
+++ b/IGC/VectorCompiler/lib/InternalIntrinsics/InternalIntrinsics.cpp
@@ -244,7 +244,7 @@ DecodeIITType(unsigned &NextElt, ArrayRef<unsigned char> Infos,
case IIT_HALF_VEC_ARG: {
unsigned ArgInfo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]);
OutputTable.push_back(
- IITDescriptor::get(IITDescriptor::HalfVecArgument, ArgInfo));
+ IITDescriptor::get(IITDescriptor::OneNthEltsVecArgument, 2, ArgInfo));
return;
}
case IIT_SAME_VEC_WIDTH_ARG: {
@@ -319,7 +319,7 @@ static Type *DecodeFixedType(ArrayRef<Intrinsic::IITDescriptor> &Infos,
case IITDescriptor::VarArg:
return Type::getVoidTy(Context);
case IITDescriptor::MMX:
- return Type::getX86_MMXTy(Context);
+ return TargetExtType::get(Context, "x86_mmx");
case IITDescriptor::Token:
return Type::getTokenTy(Context);
case IITDescriptor::Metadata:
@@ -365,9 +365,9 @@ static Type *DecodeFixedType(ArrayRef<Intrinsic::IITDescriptor> &Infos,
IGC_ASSERT(ITy->getBitWidth() % 2 == 0);
return IntegerType::get(Context, ITy->getBitWidth() / 2);
}
- case IITDescriptor::HalfVecArgument:
- return VectorType::getHalfElementsVectorType(
- cast<VectorType>(Tys[D.getArgumentNumber()]));
+ case IITDescriptor::OneNthEltsVecArgument:
+ return VectorType::get(cast<VectorType>(Tys[D.getRefArgNumber()])->getElementType(),
+ ElementCount::get(cast<VectorType>(Tys[D.getRefArgNumber()])->getElementCount().getKnownMinValue() / D.getVectorDivisor(), cast<VectorType>(Tys[D.getRefArgNumber()])->getElementCount().isScalable()));
case IITDescriptor::SameVecWidthArgument: {
Type *EltTy = DecodeFixedType(Infos, Tys, Context);
Type *Ty = Tys[D.getArgumentNumber()];
@@ -538,7 +538,7 @@ bool InternalIntrinsic::isOverloadedRet(unsigned IntrinID) {
/// Returns the relevant slice of \c IntrinsicNameTable
static ArrayRef<const char *> findTargetSubtable(StringRef Name) {
- IGC_ASSERT(Name.startswith("llvm.vc.internal."));
+ IGC_ASSERT(Name.starts_with("llvm.vc.internal."));
ArrayRef<IntrinsicTargetInfo> Targets(TargetInfos);
StringRef Target = "vc.internal";
@@ -553,11 +553,18 @@ static ArrayRef<const char *> findTargetSubtable(StringRef Name) {
static InternalIntrinsic::ID lookupInternalIntrinsicID(StringRef Name) {
ArrayRef<const char *> NameTable = findTargetSubtable(Name);
- int Idx = Intrinsic::lookupLLVMIntrinsicByName(NameTable, Name);
- if (Idx == -1) {
+ auto It2 = llvm::find_if(NameTable, [Name](const char *Entry) {
+ if (!Entry)
+ return false;
+ StringRef EntryRef(Entry);
+ return Name == EntryRef ||
+ (Name.starts_with(EntryRef) && Name.size() > EntryRef.size() &&
+ static_cast<unsigned char>(Name[EntryRef.size()]) == 46);
+ });
+ if (It2 == NameTable.end()) {
return InternalIntrinsic::not_internal_intrinsic;
}
- IGC_ASSERT_EXIT(Idx >= 0);
+ int Idx = static_cast<int>(std::distance(NameTable.begin(), It2));
// Intrinsic IDs correspond to the location in IntrinsicNameTable, but we have
// an index into a sub-table.
@@ -655,7 +662,7 @@ InternalIntrinsic::ID
InternalIntrinsic::getInternalIntrinsicID(const Function *F) {
IGC_ASSERT_EXIT(F);
llvm::StringRef Name = F->getName();
- if (!Name.startswith(getInternalIntrinsicPrefix())) {
+ if (!Name.starts_with(getInternalIntrinsicPrefix())) {
return InternalIntrinsic::not_internal_intrinsic;
}
@@ -671,7 +678,7 @@ InternalIntrinsic::getInternalIntrinsicID(const Function *F) {
const char *NamePrefix =
InternalIntrinsicNameTable[Id -
InternalIntrinsic::not_internal_intrinsic];
- if (Name.startswith(NamePrefix))
+ if (Name.starts_with(NamePrefix))
return Id;
}
}
diff --git a/IGC/VectorCompiler/lib/Support/PassManager.cpp b/IGC/VectorCompiler/lib/Support/PassManager.cpp
index a9ac314..3577798 100644
--- a/IGC/VectorCompiler/lib/Support/PassManager.cpp
+++ b/IGC/VectorCompiler/lib/Support/PassManager.cpp
@@ -20,6 +20,7 @@ SPDX-License-Identifier: MIT
#include <llvm/IR/Verifier.h>
#include <llvm/Support/CommandLine.h>
#include <llvm/Support/Mutex.h>
+#include <llvm/Support/ManagedStatic.h>
#include <llvm/Support/Regex.h>
#include <llvm/Support/raw_ostream.h>
@@ -145,8 +146,8 @@ static OutputStreamHandle createOutputStream(const llvm::Twine &Name) {
// global (!!!) variable storing output stream handles for IR printer,
// guarded by mutex
-static ManagedStatic<std::vector<OutputStreamHandle>> IRDumpStreams;
-static ManagedStatic<sys::SmartMutex<true>> IRDumpsLock;
+static llvm::ManagedStatic<std::vector<OutputStreamHandle>> IRDumpStreams;
+static llvm::ManagedStatic<sys::SmartMutex<true>> IRDumpsLock;
llvm::raw_fd_ostream &getFileStreamForIRDump(const Twine &Name) {
sys::SmartScopedLock<true> Writer(*IRDumpsLock);
diff --git a/IGC/VectorCompiler/lib/Utils/GenX/IntrinsicsWrapper.cpp b/IGC/VectorCompiler/lib/Utils/GenX/IntrinsicsWrapper.cpp
index e97ac05..9fb19b9 100644
--- a/IGC/VectorCompiler/lib/Utils/GenX/IntrinsicsWrapper.cpp
+++ b/IGC/VectorCompiler/lib/Utils/GenX/IntrinsicsWrapper.cpp
@@ -91,7 +91,7 @@ Function *vc::getAnyDeclaration(Module *M, unsigned ID, ArrayRef<Type *> Tys) {
if (InternalIntrinsic::isInternalNonTrivialIntrinsic(ID))
return InternalIntrinsic::getInternalDeclaration(
M, static_cast<vc::InternalIntrinsic::ID>(ID), Tys);
- return Intrinsic::getDeclaration(M, static_cast<Intrinsic::ID>(ID), Tys);
+ return Intrinsic::getOrInsertDeclaration(M, static_cast<Intrinsic::ID>(ID), Tys);
}
std::string vc::getAnyName(unsigned Id, ArrayRef<Type *> Tys) {
diff --git a/IGC/VectorCompiler/lib/Utils/GenX/Printf.cpp b/IGC/VectorCompiler/lib/Utils/GenX/Printf.cpp
index 2accb79..f9d6ef6 100644
--- a/IGC/VectorCompiler/lib/Utils/GenX/Printf.cpp
+++ b/IGC/VectorCompiler/lib/Utils/GenX/Printf.cpp
@@ -140,14 +140,14 @@ StringRef vc::getConstStringFromOperand(const Value &Op) {
// \p IsSigned, defines which particular integer type is provided.
static PrintfArgInfo parseIntLengthModifier(StringRef ArgDesc, bool IsSigned) {
std::string Suffix{1u, ArgDesc.back()};
- if (ArgDesc.endswith("hh" + Suffix))
+ if (ArgDesc.ends_with("hh" + Suffix))
return {PrintfArgInfo::Char, IsSigned};
- if (ArgDesc.endswith("h" + Suffix))
+ if (ArgDesc.ends_with("h" + Suffix))
return {PrintfArgInfo::Short, IsSigned};
- if (ArgDesc.endswith("ll" + Suffix))
+ if (ArgDesc.ends_with("ll" + Suffix))
// TOTHINK: maybe we need a separate type ID for long long.
return {PrintfArgInfo::Long, IsSigned};
- if (ArgDesc.endswith("l" + Suffix))
+ if (ArgDesc.ends_with("l" + Suffix))
return {PrintfArgInfo::Long, IsSigned};
return {PrintfArgInfo::Int, IsSigned};
}
@@ -155,15 +155,15 @@ static PrintfArgInfo parseIntLengthModifier(StringRef ArgDesc, bool IsSigned) {
// \p ArgDesc is a format string conversion specifier matched by a regex
// (some string that starts with % and ends with d,i,f,...).
static PrintfArgInfo parseArgDesc(StringRef ArgDesc) {
- if (ArgDesc.endswith("c"))
+ if (ArgDesc.ends_with("c"))
// FIXME: support %lc
return {PrintfArgInfo::Int, /* IsSigned */ true};
- if (ArgDesc.endswith("s"))
+ if (ArgDesc.ends_with("s"))
// FIXME: support %ls
return {PrintfArgInfo::String, /* IsSigned */ false};
- if (ArgDesc.endswith("d") || ArgDesc.endswith("i"))
+ if (ArgDesc.ends_with("d") || ArgDesc.ends_with("i"))
return parseIntLengthModifier(ArgDesc, /* IsSigned */ true);
- if (ArgDesc.endswith("o") || ArgDesc.endswith("u") ||
+ if (ArgDesc.ends_with("o") || ArgDesc.ends_with("u") ||
IGCLLVM::ends_with_insensitive(ArgDesc, "x"))
return parseIntLengthModifier(ArgDesc, /* IsSigned */ false);
if (IGCLLVM::ends_with_insensitive(ArgDesc, "f") ||
@@ -171,7 +171,7 @@ static PrintfArgInfo parseArgDesc(StringRef ArgDesc) {
IGCLLVM::ends_with_insensitive(ArgDesc, "a") ||
IGCLLVM::ends_with_insensitive(ArgDesc, "g"))
return {PrintfArgInfo::Double, /* IsSigned */ true};
- IGC_ASSERT_MESSAGE(ArgDesc.endswith("p"), "unexpected conversion specifier");
+ IGC_ASSERT_MESSAGE(ArgDesc.ends_with("p"), "unexpected conversion specifier");
return {PrintfArgInfo::Pointer, /* IsSigned */ false};
}
diff --git a/IGC/VectorCompiler/lib/Utils/General/DebugInfo.cpp b/IGC/VectorCompiler/lib/Utils/General/DebugInfo.cpp
index 4d3f64d..bf81a70 100644
--- a/IGC/VectorCompiler/lib/Utils/General/DebugInfo.cpp
+++ b/IGC/VectorCompiler/lib/Utils/General/DebugInfo.cpp
@@ -142,7 +142,7 @@ DIType *vc::DIBuilder::translateTypeToDIType(Type &Ty) const {
auto *CompositeTypeDI = DICompositeType::get(
Ctx, dwarf::DW_TAG_array_type, "" /*Name*/, nullptr /*File*/, 0 /*Line*/,
nullptr /*Scope*/, ScalarDI, SizeInBits, 0 /*AlignInBits*/,
- 0 /*OfffsetInBits*/, DINode::FlagVector, Subscripts, 0, nullptr);
+ 0 /*OfffsetInBits*/, DINode::FlagVector, Subscripts, 0, std::nullopt, nullptr);
return CompositeTypeDI;
}
@@ -176,7 +176,7 @@ vc::DIBuilder::createDbgDeclare(Value &Address, DILocalVariable &LocalVar,
MetadataAsValue::get(Ctx, ValueAsMetadata::get(&Address)),
MetadataAsValue::get(Ctx, &LocalVar), MetadataAsValue::get(Ctx, &Expr)};
- auto *DbgDeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
+ auto *DbgDeclareFn = Intrinsic::getOrInsertDeclaration(&M, Intrinsic::dbg_declare);
IRBuilder<> Builder(&InsertPt);
Builder.SetCurrentDebugLocation(&Loc);
auto *DeclareInst = Builder.CreateCall(DbgDeclareFn, DeclareArgs);
diff --git a/IGC/VectorCompiler/lib/Utils/General/InstRebuilder.cpp b/IGC/VectorCompiler/lib/Utils/General/InstRebuilder.cpp
index 041c0e1..7f60f9c 100644
--- a/IGC/VectorCompiler/lib/Utils/General/InstRebuilder.cpp
+++ b/IGC/VectorCompiler/lib/Utils/General/InstRebuilder.cpp
@@ -148,7 +148,7 @@ public:
auto *RetTy =
getIntrinsicRetTypeBasedOnArgs(IID, ArgTys, OrigIntrinsic.getContext());
auto OverloadedTys = getIntrinsicOverloadedTypes(IID, RetTy, ArgTys);
- auto *Decl = Intrinsic::getDeclaration(OrigIntrinsic.getModule(), IID,
+ auto *Decl = Intrinsic::getOrInsertDeclaration(OrigIntrinsic.getModule(), IID,
OverloadedTys);
return cast<IntrinsicInst>(CallInst::Create(Decl, NewOperands));
}
diff --git a/IGC/VectorCompiler/utils/vcb/UniqueCompilation.cpp b/IGC/VectorCompiler/utils/vcb/UniqueCompilation.cpp
index 32d3171..f0c1306 100644
--- a/IGC/VectorCompiler/utils/vcb/UniqueCompilation.cpp
+++ b/IGC/VectorCompiler/utils/vcb/UniqueCompilation.cpp
@@ -17,6 +17,7 @@ SPDX-License-Identifier: MIT
#include <llvm/Support/FileSystem.h>
#include <llvm/Support/MD5.h>
#include <llvm/Support/MemoryBuffer.h>
+#include <llvm/Support/Path.h>
#include <llvm/Support/ToolOutputFile.h>
#include <llvmWrapper/Support/TargetRegistry.h>
#include <llvmWrapper/Target/TargetMachine.h>
@@ -94,53 +95,76 @@ void generateBifSelectionProcedure(
raw_fd_ostream OS{FD, /*shouldClose=*/true};
OS << "// This file is auto generated by vcb tool, DO NOT EDIT\n\n";
-
OS << "#include \"IGC/common/StringMacros.hpp\"\n";
- OS << "#include \"llvm/ADT/StringRef.h\"\n";
+ OS << "#include \"llvm/ADT/StringRef.h\"\n\n";
+
+ SmallString<256> Stem(Output);
+ sys::path::replace_extension(Stem, "");
+ constexpr unsigned MaxShards = 32;
+
+ for (const auto &[ByteCode, UniPltf] : HashedUniquePltfs)
+ OS << "llvm::StringRef get" << SymbolPrefix << "PLTF" << UniPltf.Num << "();\n";
OS << "\n";
- // For each unique bitcode generate a C array that contains binary data
- // representing the bitcode
- for (const auto &[ByteCode, UniPltf] : HashedUniquePltfs) {
- std::string Pltf = SymbolPrefix + "PLTF" + std::to_string(UniPltf.Num);
- OS << "static unsigned char " << Pltf << "[] = {";
- bool FirstIn = true;
- for (size_t i = 0; i < ByteCode.size(); i++) {
- if (!FirstIn)
- OS << ",";
- FirstIn = false;
- uint8_t Num = ByteCode[i];
- OS << " 0x" << utohexstr(Num);
+ for (unsigned I = 0; I != MaxShards; ++I) {
+ auto It = llvm::find_if(HashedUniquePltfs, [I](const auto &Entry) {
+ return Entry.second.Num == I;
+ });
+
+ SmallString<256> ShardPath(Stem);
+ ShardPath += ".PLTF";
+ ShardPath += std::to_string(I);
+ ShardPath += ".cpp";
+
+ int ShardFD;
+ EC = llvm::sys::fs::openFileForWrite(ShardPath, ShardFD);
+ if (EC)
+ report_fatal_error(llvm::StringRef("vcb : can't open output file " +
+ ShardPath.str().str()));
+ raw_fd_ostream ShardOS{ShardFD, /*shouldClose=*/true};
+ ShardOS << "// This file is auto generated by vcb tool, DO NOT EDIT\n\n";
+ ShardOS << "#include \"llvm/ADT/StringRef.h\"\n\n";
+
+ if (It == HashedUniquePltfs.end()) {
+ ShardOS << "llvm::StringRef get" << SymbolPrefix << "PLTF" << I
+ << "() { return \"\"; }\n";
+ continue;
}
- OS << "\n };\n\n"
- << "unsigned int " << Pltf << "_size = " << ByteCode.size() << ";\n\n";
+ const std::string &ByteCode = It->first;
+ ShardOS << "static const char " << SymbolPrefix << "PLTF" << I << "[] =\n";
+ const unsigned BytesPerLine = 32;
+ for (size_t Pos = 0; Pos < ByteCode.size(); Pos += BytesPerLine) {
+ ShardOS << " \"";
+ size_t End = std::min(Pos + BytesPerLine, ByteCode.size());
+ for (size_t J = Pos; J != End; ++J)
+ ShardOS << "\\x" << utohexstr(static_cast<unsigned char>(ByteCode[J]), true);
+ ShardOS << "\"\n";
+ }
+ ShardOS << ";\n\n";
+ ShardOS << "llvm::StringRef get" << SymbolPrefix << "PLTF" << I
+ << "() { return llvm::StringRef(" << SymbolPrefix << "PLTF" << I
+ << ", " << ByteCode.size() << "); }\n";
}
+
OS << "llvm::StringRef get" << SymbolPrefix
<< "Impl(llvm::StringRef CPUStr) {\n";
-
- // Generate a selection procedure that for each supported platform
- // (taken from configuration file) selects a BLOB that represents a
- // platform-specific emulation BiF corresponding to that platform.
for (const auto &[ByteCode, UniPltf] : HashedUniquePltfs) {
const auto &PltfList = UniPltf.Platforms;
std::vector<std::string> PlatformCompareExpressions;
llvm::transform(PltfList, std::back_inserter(PlatformCompareExpressions),
[](const auto &Pltf) {
- return (Twine("CPUStr.equals(") +
- renderPlatformLiteral(Pltf) + ")")
+ return (Twine("CPUStr == ") +
+ renderPlatformLiteral(Pltf))
.str();
});
OS << " if (" << llvm::join(PlatformCompareExpressions, "\n || ")
<< ")\n"
- << " return {reinterpret_cast<const char*>(" << SymbolPrefix
- << "PLTF" << UniPltf.Num << "),\n"
- << " " << SymbolPrefix << "PLTF" << UniPltf.Num
- << "_size};\n";
+ << " return get" << SymbolPrefix << "PLTF" << UniPltf.Num
+ << "();\n";
}
OS << "return \"\";\n";
OS << "};\n\n";
- OS.close();
}
// Parses input configuration file (see \fn vcbCompileUnique for the format)
diff --git a/IGC/VectorCompiler/utils/vcb/vcb.cpp b/IGC/VectorCompiler/utils/vcb/vcb.cpp
index 2b5d400..ddbd16e 100644
--- a/IGC/VectorCompiler/utils/vcb/vcb.cpp
+++ b/IGC/VectorCompiler/utils/vcb/vcb.cpp
@@ -26,6 +26,7 @@ SPDX-License-Identifier: MIT
#include <llvm/IRReader/IRReader.h>
#include <llvm/Support/CommandLine.h>
#include <llvm/Support/FileSystem.h>
+#include <llvm/Support/Path.h>
#include <llvm/Support/InitLLVM.h>
#include <llvm/Support/ToolOutputFile.h>
@@ -79,10 +80,10 @@ createTargetMachine(Triple &TheTriple, std::string CPUStr) {
IGC_ASSERT_MESSAGE(TheTarget, "vc target was not registered");
const TargetOptions Options;
- CodeGenOpt::Level OptLevel = CodeGenOpt::Default;
+ CodeGenOptLevel OptLevel = CodeGenOptLevel::Default;
std::unique_ptr<TargetMachine> TM{TheTarget->createTargetMachine(
- TheTriple.getTriple(), CPUStr, FeaturesStr, Options, /*RelocModel=*/{},
+ TheTriple, CPUStr, FeaturesStr, Options, /*RelocModel=*/{},
/*CodeModel=*/{}, OptLevel)};
if (!TM)
return make_error<vc::TargetMachineError>();
@@ -99,7 +100,7 @@ void vcbCompileModule(std::unique_ptr<Module> &M, std::string Platform) {
// Target configuration.
Triple TheTriple{Is32Bit ? "genx32-unknown-unknown"
: "genx64-unknown-unknown"};
- M->setTargetTriple(TheTriple.getTriple());
+ M->setTargetTriple(TheTriple);
auto ExpTargetMachine = createTargetMachine(TheTriple, std::move(Platform));
if (!ExpTargetMachine) {
errs() << ExpTargetMachine.takeError();
@@ -111,7 +112,7 @@ void vcbCompileModule(std::unique_ptr<Module> &M, std::string Platform) {
// Fill/initialize VC Codegen pipeline.
legacy::PassManager PM;
llvm::raw_null_ostream NOS;
- auto FileType = IGCLLVM::TargetMachine::CodeGenFileType::CGFT_AssemblyFile;
+ auto FileType = IGCLLVM::TargetMachine::CodeGenFileType::AssemblyFile;
bool DisableIrVerifier = true;
PM.add(new GenXBackendConfig{std::move(Options), GenXBackendData()});
[[maybe_unused]] bool AddPasses =
@@ -120,18 +121,28 @@ void vcbCompileModule(std::unique_ptr<Module> &M, std::string Platform) {
// Output configuration.
std::error_code EC;
+ SmallString<256> OutputPath(OutputFilename);
+ SmallString<256> CWD;
+ sys::fs::current_path(CWD);
+ if (sys::path::is_absolute(OutputPath) &&
+ sys::path::parent_path(OutputPath) == StringRef(CWD))
+ OutputPath = sys::path::filename(OutputPath);
+ else
+ sys::fs::create_directories(sys::path::parent_path(OutputPath));
sys::fs::OpenFlags Flags = TextOutput ? sys::fs::OF_Text : sys::fs::OF_None;
- ToolOutputFile Output{OutputFilename, EC, Flags};
- if (EC)
- report_fatal_error(llvm::StringRef("Can't open file : " + OutputFilename));
+ raw_fd_ostream Output(OutputPath, EC, Flags);
+ if (EC) {
+ std::string Msg = "Cannot open file : " + OutputPath.str().str() + ": " +
+ EC.message();
+ report_fatal_error(StringRef(Msg));
+ }
if (TextOutput)
- PM.add(createPrintModulePass(Output.os()));
+ PM.add(createPrintModulePass(Output));
else
- PM.add(createBitcodeWriterPass(Output.os()));
+ PM.add(createBitcodeWriterPass(Output));
// Run codegen.
PM.run(*M);
- Output.keep();
}
std::unique_ptr<Module> safeParseIRFile(StringRef Filename, SMDiagnostic &Err,
diff --git a/IGC/WrapperLLVM/include/llvmWrapper/Analysis/TargetTransformInfo.h b/IGC/WrapperLLVM/include/llvmWrapper/Analysis/TargetTransformInfo.h
index 4ab8c9d..9438db2 100644
--- a/IGC/WrapperLLVM/include/llvmWrapper/Analysis/TargetTransformInfo.h
+++ b/IGC/WrapperLLVM/include/llvmWrapper/Analysis/TargetTransformInfo.h
@@ -26,7 +26,7 @@ private:
public:
TTIImplCRTPBase(const llvm::DataLayout &DL) : CRTPBaseT(DL) {}
llvm::InstructionCost getInstructionCost(const llvm::User *U, llvm::ArrayRef<const llvm::Value *> Operands,
- llvm::TargetTransformInfo::TargetCostKind CostKind) {
+ llvm::TargetTransformInfo::TargetCostKind CostKind) const {
#if LLVM_VERSION_MAJOR >= 16
return CRTPBaseT::getInstructionCost(U, Operands, CostKind);
#else // LLVM_VERSION_MAJOR
diff --git a/IGC/WrapperLLVM/include/llvmWrapper/IR/ConstantFolder.h b/IGC/WrapperLLVM/include/llvmWrapper/IR/ConstantFolder.h
index 8e6489a..175c218 100644
--- a/IGC/WrapperLLVM/include/llvmWrapper/IR/ConstantFolder.h
+++ b/IGC/WrapperLLVM/include/llvmWrapper/IR/ConstantFolder.h
@@ -12,17 +12,14 @@ SPDX-License-Identifier: MIT
#include "IGC/common/LLVMWarningsPush.hpp"
#include "llvm/Config/llvm-config.h"
#include "llvm/IR/ConstantFolder.h"
+#include <llvm/IR/Constants.h>
+#include <llvm/IR/InstrTypes.h>
+#include <llvm/IR/Instructions.h>
#include <llvm/Support/Casting.h>
#include "IGC/common/LLVMWarningsPop.hpp"
namespace IGCLLVM {
-// The main methods of the class now get proxied to an llvm::ConstantFolder
-// instance so as to avoid letting `ConstantFolderBase` class become a
-// pure-virtual class. Meanwhile, IGCConstantFolder itself is switched to
-// inheriting from llvm::IRBuilderFolder to make it an acceptable template
-// argument for the llvm::IRBuilder hierarchy.
-// This was done because of a change in llvm::ConstantFolder class,
-// which made it final, i.e. impossible to inherit from.
+
class ConstantFolderBase : public llvm::IRBuilderFolder {
private:
llvm::ConstantFolder m_baseConstantFolder;
@@ -30,304 +27,95 @@ private:
public:
ConstantFolderBase() : m_baseConstantFolder(llvm::ConstantFolder()) {}
- /// -------------------------------------------------------------------
- /// This block defines virtual methods that are present in all versions
- /// of the base llvm::IRBuilderFolder class prior to LLVM 14, and
- /// wrapper methods that are needed for build compability accross all
- /// versions prior to LLVM 15.
- /// -------------------------------------------------------------------
-
- /// -------------------------------------------------------------------
- /// This block defines virtual methods that are present in all versions
- /// of the base llvm::IRBuilderFolder class up to LLVM 14, and wrapper
- /// methods that are needed for build compability accross all versions
- /// up to LLVM 14.
- /// -------------------------------------------------------------------
-
-#if (LLVM_VERSION_MAJOR < 15)
-
- // Note: for direct usage in code, prefer `CreateBinOp` wrapper for all
- // LLVM versions up to 15.
- inline llvm::Value *FoldAdd(llvm::Value *LHS, llvm::Value *RHS, bool HasNUW = false,
- bool HasNSW = false) const override {
- return m_baseConstantFolder.FoldAdd(LHS, RHS, HasNUW, HasNSW);
- }
-
- // Note: for direct usage in code, prefer `CreateBinOp` wrapper for all
- // LLVM versions up to 15.
- inline llvm::Value *FoldAnd(llvm::Value *LHS, llvm::Value *RHS) const override {
- return m_baseConstantFolder.FoldAnd(LHS, RHS);
- }
-
- // Note: for direct usage in code, prefer `CreateBinOp` wrapper for all
- // LLVM versions up to 15.
- inline llvm::Value *FoldOr(llvm::Value *LHS, llvm::Value *RHS) const override {
- return m_baseConstantFolder.FoldOr(LHS, RHS);
- }
-
- // Note: for direct usage in code, prefer `CreateBinOp` wrapper for all
- // LLVM versions up to 15.
- inline llvm::Constant *CreateFAdd(llvm::Constant *LHS, llvm::Constant *RHS) const override {
- return m_baseConstantFolder.CreateFAdd(LHS, RHS);
- }
-
- // Note: for direct usage in code, prefer `CreateBinOp` wrapper for all
- // LLVM versions up to 15.
- inline llvm::Constant *CreateSub(llvm::Constant *LHS, llvm::Constant *RHS, bool HasNUW = false,
- bool HasNSW = false) const override {
- return m_baseConstantFolder.CreateSub(LHS, RHS, HasNUW, HasNSW);
- }
-
- // Note: for direct usage in code, prefer `CreateBinOp` wrapper for all
- // LLVM versions up to 15.
- inline llvm::Constant *CreateFSub(llvm::Constant *LHS, llvm::Constant *RHS) const override {
- return m_baseConstantFolder.CreateFSub(LHS, RHS);
- }
-
- // Note: for direct usage in code, prefer `CreateBinOp` wrapper for all
- // LLVM versions up to 15.
- inline llvm::Constant *CreateMul(llvm::Constant *LHS, llvm::Constant *RHS, bool HasNUW = false,
- bool HasNSW = false) const override {
- return m_baseConstantFolder.CreateMul(LHS, RHS, HasNUW, HasNSW);
- }
-
- // Note: for direct usage in code, prefer `CreateBinOp` wrapper for all
- // LLVM versions up to 15.
- inline llvm::Constant *CreateFMul(llvm::Constant *LHS, llvm::Constant *RHS) const override {
- return m_baseConstantFolder.CreateFMul(LHS, RHS);
- }
-
- // Note: for direct usage in code, prefer `CreateBinOp` wrapper for all
- // LLVM versions up to 15.
- inline llvm::Constant *CreateUDiv(llvm::Constant *LHS, llvm::Constant *RHS, bool isExact = false) const override {
- return m_baseConstantFolder.CreateUDiv(LHS, RHS, isExact);
- }
-
- // Note: for direct usage in code, prefer `CreateBinOp` wrapper for all
- // LLVM versions up to 15.
- inline llvm::Constant *CreateSDiv(llvm::Constant *LHS, llvm::Constant *RHS, bool isExact = false) const override {
- return m_baseConstantFolder.CreateSDiv(LHS, RHS, isExact);
- }
-
- // Note: for direct usage in code, prefer `CreateBinOp` wrapper for all
- // LLVM versions up to 15.
- inline llvm::Constant *CreateFDiv(llvm::Constant *LHS, llvm::Constant *RHS) const override {
- return m_baseConstantFolder.CreateFDiv(LHS, RHS);
- }
-
- // Note: for direct usage in code, prefer `CreateBinOp` wrapper for all
- // LLVM versions up to 15.
- inline llvm::Constant *CreateURem(llvm::Constant *LHS, llvm::Constant *RHS) const override {
- return m_baseConstantFolder.CreateURem(LHS, RHS);
- }
-
- // Note: for direct usage in code, prefer `CreateBinOp` wrapper for all
- // LLVM versions up to 15.
- inline llvm::Constant *CreateSRem(llvm::Constant *LHS, llvm::Constant *RHS) const override {
- return m_baseConstantFolder.CreateSRem(LHS, RHS);
- }
-
- // Note: for direct usage in code, prefer `CreateBinOp` wrapper for all
- // LLVM versions up to 15.
- inline llvm::Constant *CreateFRem(llvm::Constant *LHS, llvm::Constant *RHS) const override {
- return m_baseConstantFolder.CreateFRem(LHS, RHS);
- }
-
- // Note: for direct usage in code, prefer `CreateBinOp` wrapper for all
- // LLVM versions up to 15.
- inline llvm::Constant *CreateShl(llvm::Constant *LHS, llvm::Constant *RHS, bool HasNUW = false,
- bool HasNSW = false) const override {
- return m_baseConstantFolder.CreateShl(LHS, RHS, HasNUW, HasNSW);
- }
-
- // Note: for direct usage in code, prefer `CreateBinOp` wrapper for all
- // LLVM versions up to 15.
- inline llvm::Constant *CreateLShr(llvm::Constant *LHS, llvm::Constant *RHS, bool isExact = false) const override {
- return m_baseConstantFolder.CreateLShr(LHS, RHS, isExact);
- }
-
- // Note: for direct usage in code, prefer `CreateBinOp` wrapper for all
- // LLVM versions up to 15.
- inline llvm::Constant *CreateAShr(llvm::Constant *LHS, llvm::Constant *RHS, bool isExact = false) const override {
- return m_baseConstantFolder.CreateAShr(LHS, RHS, isExact);
- }
-
- // Note: for direct usage in code, prefer `CreateBinOp` wrapper for all
- // LLVM versions up to 15.
- inline llvm::Constant *CreateXor(llvm::Constant *LHS, llvm::Constant *RHS) const override {
- return m_baseConstantFolder.CreateXor(LHS, RHS);
- }
-
- inline llvm::Constant *CreateNeg(llvm::Constant *C, bool HasNUW = false, bool HasNSW = false) const override {
- return m_baseConstantFolder.CreateNeg(C, HasNUW, HasNSW);
- }
-
- inline llvm::Constant *CreateFNeg(llvm::Constant *C) const override { return m_baseConstantFolder.CreateFNeg(C); }
-
- inline llvm::Constant *CreateNot(llvm::Constant *C) const override { return m_baseConstantFolder.CreateNot(C); }
-
- inline llvm::Constant *CreateUnOp(llvm::Instruction::UnaryOps Opc, llvm::Constant *C) const override {
- return m_baseConstantFolder.CreateUnOp(Opc, C);
- }
-
- inline llvm::Constant *CreateExtractElement(llvm::Constant *Vec, llvm::Constant *Idx) const override {
- return m_baseConstantFolder.CreateExtractElement(Vec, Idx);
- }
-
- inline llvm::Constant *CreateInsertElement(llvm::Constant *Vec, llvm::Constant *NewElt,
- llvm::Constant *Idx) const override {
- return m_baseConstantFolder.CreateInsertElement(Vec, NewElt, Idx);
- }
-
- inline llvm::Constant *CreateShuffleVector(llvm::Constant *V1, llvm::Constant *V2,
- llvm::ArrayRef<int> Mask) const override {
- return m_baseConstantFolder.CreateShuffleVector(V1, V2, Mask);
- }
-
- inline llvm::Constant *CreateExtractValue(llvm::Constant *Agg, llvm::ArrayRef<unsigned> IdxList) const override {
- return m_baseConstantFolder.CreateExtractValue(Agg, IdxList);
- }
-
- inline llvm::Constant *CreateInsertValue(llvm::Constant *Agg, llvm::Constant *Val,
- llvm::ArrayRef<unsigned> IdxList) const override {
- return m_baseConstantFolder.CreateInsertValue(Agg, Val, IdxList);
- }
-#endif // (LLVM_VERSION_MAJOR < 15)
-
- /// -------------------------------------------------------------------
- /// This block defines virtual methods that are present in the base
- /// llvm::IRBuilderFolder class starting from LLVM 15.
- /// -------------------------------------------------------------------
-
-#if (LLVM_VERSION_MAJOR >= 15)
- inline llvm::Value *FoldBinOp(llvm::Instruction::BinaryOps Opc, llvm::Value *LHS, llvm::Value *RHS) const override {
+ llvm::Value *FoldBinOp(llvm::Instruction::BinaryOps Opc, llvm::Value *LHS, llvm::Value *RHS) const override {
return m_baseConstantFolder.FoldBinOp(Opc, LHS, RHS);
}
- inline llvm::Value *FoldExactBinOp(llvm::Instruction::BinaryOps Opc, llvm::Value *LHS, llvm::Value *RHS,
- bool IsExact) const override {
+ llvm::Value *FoldExactBinOp(llvm::Instruction::BinaryOps Opc, llvm::Value *LHS, llvm::Value *RHS, bool IsExact) const override {
return m_baseConstantFolder.FoldExactBinOp(Opc, LHS, RHS, IsExact);
}
- inline llvm::Value *FoldNoWrapBinOp(llvm::Instruction::BinaryOps Opc, llvm::Value *LHS, llvm::Value *RHS, bool HasNUW,
- bool HasNSW) const override {
+ llvm::Value *FoldNoWrapBinOp(llvm::Instruction::BinaryOps Opc, llvm::Value *LHS, llvm::Value *RHS, bool HasNUW, bool HasNSW) const override {
return m_baseConstantFolder.FoldNoWrapBinOp(Opc, LHS, RHS, HasNUW, HasNSW);
}
- inline llvm::Value *FoldBinOpFMF(llvm::Instruction::BinaryOps Opc, llvm::Value *LHS, llvm::Value *RHS,
- llvm::FastMathFlags FMF) const override {
+ llvm::Value *FoldBinOpFMF(llvm::Instruction::BinaryOps Opc, llvm::Value *LHS, llvm::Value *RHS, llvm::FastMathFlags FMF) const override {
return m_baseConstantFolder.FoldBinOpFMF(Opc, LHS, RHS, FMF);
}
- inline llvm::Value *FoldUnOpFMF(llvm::Instruction::UnaryOps Opc, llvm::Value *V,
- llvm::FastMathFlags FMF) const override {
+ llvm::Value *FoldUnOpFMF(llvm::Instruction::UnaryOps Opc, llvm::Value *V, llvm::FastMathFlags FMF) const override {
return m_baseConstantFolder.FoldUnOpFMF(Opc, V, FMF);
}
- inline llvm::Value *FoldExtractValue(llvm::Value *Agg, llvm::ArrayRef<unsigned> IdxList) const override {
- return m_baseConstantFolder.FoldExtractValue(Agg, IdxList);
+ llvm::Value *FoldCmp(llvm::CmpInst::Predicate P, llvm::Value *LHS, llvm::Value *RHS) const override {
+ return m_baseConstantFolder.FoldCmp(P, LHS, RHS);
}
- inline llvm::Value *FoldInsertValue(llvm::Value *Agg, llvm::Value *Val,
- llvm::ArrayRef<unsigned> IdxList) const override {
- return m_baseConstantFolder.FoldInsertValue(Agg, Val, IdxList);
+ llvm::Value *FoldGEP(llvm::Type *Ty, llvm::Value *Ptr, llvm::ArrayRef<llvm::Value *> IdxList, llvm::GEPNoWrapFlags NW) const override {
+ return m_baseConstantFolder.FoldGEP(Ty, Ptr, IdxList, NW);
}
- inline llvm::Value *FoldExtractElement(llvm::Value *Vec, llvm::Value *Idx) const override {
- return m_baseConstantFolder.FoldExtractElement(Vec, Idx);
+ llvm::Value *FoldSelect(llvm::Value *C, llvm::Value *True, llvm::Value *False) const override {
+ return m_baseConstantFolder.FoldSelect(C, True, False);
}
- inline llvm::Value *FoldInsertElement(llvm::Value *Vec, llvm::Value *NewElt, llvm::Value *Idx) const override {
- return m_baseConstantFolder.FoldInsertElement(Vec, NewElt, Idx);
+ llvm::Value *FoldExtractValue(llvm::Value *Agg, llvm::ArrayRef<unsigned> IdxList) const override {
+ return m_baseConstantFolder.FoldExtractValue(Agg, IdxList);
}
- inline llvm::Value *FoldShuffleVector(llvm::Value *V1, llvm::Value *V2, llvm::ArrayRef<int> Mask) const override {
- return m_baseConstantFolder.FoldShuffleVector(V1, V2, Mask);
+ llvm::Value *FoldInsertValue(llvm::Value *Agg, llvm::Value *Val, llvm::ArrayRef<unsigned> IdxList) const override {
+ return m_baseConstantFolder.FoldInsertValue(Agg, Val, IdxList);
}
-#endif // LLVM_VERSION_MAJOR >= 15
- /// -------------------------------------------------------------------
- /// This block defines virtual methods that are present in all versions
- /// of the base llvm::IRBuilderFolder class up to LLVM 15, and wrapper
- /// methods that are needed for build compability accross all versions
- /// up to LLVM 15.
- /// -------------------------------------------------------------------
-
- inline llvm::Constant *CreateBinOp(llvm::Instruction::BinaryOps Opc, llvm::Constant *LHS, llvm::Constant *RHS) const
-#if (LLVM_VERSION_MAJOR < 15)
- override {
- return m_baseConstantFolder.CreateBinOp(Opc, LHS, RHS);
- }
-#else
- {
- return llvm::cast_or_null<llvm::Constant>(m_baseConstantFolder.FoldBinOp(Opc, llvm::cast_or_null<llvm::Value>(LHS),
- llvm::cast_or_null<llvm::Value>(RHS)));
+ llvm::Value *FoldExtractElement(llvm::Value *Vec, llvm::Value *Idx) const override {
+ return m_baseConstantFolder.FoldExtractElement(Vec, Idx);
}
-#endif
- inline llvm::Value *FoldICmp(llvm::CmpInst::Predicate P, llvm::Value *LHS, llvm::Value *RHS) const override {
- return m_baseConstantFolder.FoldICmp(P, LHS, RHS);
+ llvm::Value *FoldInsertElement(llvm::Value *Vec, llvm::Value *NewElt, llvm::Value *Idx) const override {
+ return m_baseConstantFolder.FoldInsertElement(Vec, NewElt, Idx);
}
- inline llvm::Value *FoldSelect(llvm::Value *C, llvm::Value *True, llvm::Value *False) const override {
- return m_baseConstantFolder.FoldSelect(C, True, False);
+ llvm::Value *FoldShuffleVector(llvm::Value *V1, llvm::Value *V2, llvm::ArrayRef<int> Mask) const override {
+ return m_baseConstantFolder.FoldShuffleVector(V1, V2, Mask);
}
- inline llvm::Value *FoldGEP(llvm::Type *Ty, llvm::Value *Ptr, llvm::ArrayRef<llvm::Value *> IdxList,
- bool IsInBounds = false) const override {
- return m_baseConstantFolder.FoldGEP(Ty, Ptr, IdxList, IsInBounds);
+ llvm::Value *FoldCast(llvm::Instruction::CastOps Op, llvm::Value *V, llvm::Type *DestTy) const override {
+ return m_baseConstantFolder.FoldCast(Op, V, DestTy);
}
- inline llvm::Constant *CreateCast(llvm::Instruction::CastOps Op, llvm::Constant *C,
- llvm::Type *DestTy) const override {
- return m_baseConstantFolder.CreateCast(Op, C, DestTy);
+ llvm::Value *FoldBinaryIntrinsic(llvm::Intrinsic::ID ID, llvm::Value *LHS, llvm::Value *RHS, llvm::Type *Ty, llvm::Instruction *FMFSource = nullptr) const override {
+ return m_baseConstantFolder.FoldBinaryIntrinsic(ID, LHS, RHS, Ty, FMFSource);
}
- inline llvm::Constant *CreatePointerCast(llvm::Constant *C, llvm::Type *DestTy) const override {
+ llvm::Value *CreatePointerCast(llvm::Constant *C, llvm::Type *DestTy) const override {
return m_baseConstantFolder.CreatePointerCast(C, DestTy);
}
- inline llvm::Constant *CreatePointerBitCastOrAddrSpaceCast(llvm::Constant *C, llvm::Type *DestTy) const override {
+ llvm::Value *CreatePointerBitCastOrAddrSpaceCast(llvm::Constant *C, llvm::Type *DestTy) const override {
return m_baseConstantFolder.CreatePointerBitCastOrAddrSpaceCast(C, DestTy);
}
- inline llvm::Constant *CreateIntCast(llvm::Constant *C, llvm::Type *DestTy, bool isSigned) const override {
- return m_baseConstantFolder.CreateIntCast(C, DestTy, isSigned);
- }
-
- inline llvm::Constant *CreateFPCast(llvm::Constant *C, llvm::Type *DestTy) const override {
- return m_baseConstantFolder.CreateFPCast(C, DestTy);
- }
-
- inline llvm::Constant *CreateBitCast(llvm::Constant *C, llvm::Type *DestTy) const override {
- return m_baseConstantFolder.CreateCast(llvm::Instruction::BitCast, C, DestTy);
- }
-
- inline llvm::Constant *CreateIntToPtr(llvm::Constant *C, llvm::Type *DestTy) const override {
- return m_baseConstantFolder.CreateCast(llvm::Instruction::IntToPtr, C, DestTy);
+ llvm::Constant *CreateBinOp(llvm::Instruction::BinaryOps Opc, llvm::Constant *LHS, llvm::Constant *RHS) const {
+ return llvm::cast_or_null<llvm::Constant>(m_baseConstantFolder.FoldBinOp(Opc, LHS, RHS));
}
- inline llvm::Constant *CreatePtrToInt(llvm::Constant *C, llvm::Type *DestTy) const override {
- return m_baseConstantFolder.CreateCast(llvm::Instruction::PtrToInt, C, DestTy);
+ llvm::Constant *CreateFPCast(llvm::Constant *C, llvm::Type *DestTy) const {
+ auto Op = llvm::CastInst::getCastOpcode(C, false, DestTy, false);
+ return llvm::cast_or_null<llvm::Constant>(m_baseConstantFolder.FoldCast(Op, C, DestTy));
}
- inline llvm::Constant *CreateZExtOrBitCast(llvm::Constant *C, llvm::Type *DestTy) const override {
- return m_baseConstantFolder.CreateZExtOrBitCast(C, DestTy);
+ llvm::Constant *CreateBitCast(llvm::Constant *C, llvm::Type *DestTy) const {
+ return llvm::cast_or_null<llvm::Constant>(m_baseConstantFolder.FoldCast(llvm::Instruction::BitCast, C, DestTy));
}
- inline llvm::Constant *CreateSExtOrBitCast(llvm::Constant *C, llvm::Type *DestTy) const override {
- return m_baseConstantFolder.CreateSExtOrBitCast(C, DestTy);
- }
-
- inline llvm::Constant *CreateTruncOrBitCast(llvm::Constant *C, llvm::Type *DestTy) const override {
- return m_baseConstantFolder.CreateTruncOrBitCast(C, DestTy);
- }
-
- inline llvm::Constant *CreateFCmp(llvm::CmpInst::Predicate P, llvm::Constant *LHS,
- llvm::Constant *RHS) const override {
- return m_baseConstantFolder.CreateFCmp(P, LHS, RHS);
+ llvm::Constant *CreateZExtOrBitCast(llvm::Constant *C, llvm::Type *DestTy) const {
+ auto *Folded = m_baseConstantFolder.FoldCast(llvm::Instruction::ZExt, C, DestTy);
+ if (!Folded)
+ Folded = m_baseConstantFolder.FoldCast(llvm::Instruction::BitCast, C, DestTy);
+ return llvm::cast_or_null<llvm::Constant>(Folded);
}
};
+
} // namespace IGCLLVM
#endif // IGCLLVM_IR_CONSTANTFOLDER_H
diff --git a/IGC/WrapperLLVM/include/llvmWrapper/IR/DIBuilder.h b/IGC/WrapperLLVM/include/llvmWrapper/IR/DIBuilder.h
index 8b0437d..5444faa 100644
--- a/IGC/WrapperLLVM/include/llvmWrapper/IR/DIBuilder.h
+++ b/IGC/WrapperLLVM/include/llvmWrapper/IR/DIBuilder.h
@@ -28,17 +28,17 @@ public:
inline llvm::Instruction *insertDbgValueIntrinsic(llvm::Value *V, uint64_t Offset, llvm::DILocalVariable *VarInfo,
llvm::DIExpression *Expr, const llvm::DILocation *DL,
llvm::BasicBlock *InsertAtEnd) {
- return llvm::DIBuilder::insertDbgValueIntrinsic(V, VarInfo, Expr, DL, InsertAtEnd);
+ return llvm::DIBuilder::insertDbgValueIntrinsic(V, VarInfo, Expr, DL, InsertAtEnd).template dyn_cast<llvm::Instruction *>();
}
inline llvm::Instruction *insertDbgValueIntrinsic(llvm::Value *V, uint64_t Offset, llvm::DILocalVariable *VarInfo,
llvm::DIExpression *Expr, const llvm::DILocation *DL,
llvm::Instruction *InsertBefore) {
- return llvm::DIBuilder::insertDbgValueIntrinsic(V, VarInfo, Expr, DL, InsertBefore);
+ return llvm::DIBuilder::insertDbgValueIntrinsic(V, VarInfo, Expr, DL, InsertBefore).template dyn_cast<llvm::Instruction *>();
}
inline llvm::Instruction *insertDbgValueIntrinsic(llvm::Value *V, llvm::DILocalVariable *VarInfo,
llvm::DIExpression *Expr, const llvm::DILocation *DL,
llvm::Instruction *InsertBefore) {
- return llvm::DIBuilder::insertDbgValueIntrinsic(V, VarInfo, Expr, DL, InsertBefore);
+ return llvm::DIBuilder::insertDbgValueIntrinsic(V, VarInfo, Expr, DL, InsertBefore).template dyn_cast<llvm::Instruction *>();
}
inline llvm::DINamespace *createNameSpace(llvm::DIScope *Scope, llvm::StringRef Name, llvm::DIFile *File,
unsigned LineNo, bool ExportSymbols) {
diff --git a/IGC/WrapperLLVM/include/llvmWrapper/IR/IRBuilder.h b/IGC/WrapperLLVM/include/llvmWrapper/IR/IRBuilder.h
index 104da3c..9412e64 100644
--- a/IGC/WrapperLLVM/include/llvmWrapper/IR/IRBuilder.h
+++ b/IGC/WrapperLLVM/include/llvmWrapper/IR/IRBuilder.h
@@ -73,7 +73,7 @@ public:
llvm::MDNode *TBAAStructTag = nullptr, llvm::MDNode *ScopeTag = nullptr,
llvm::MDNode *NoAliasTag = nullptr) {
return llvm::IRBuilder<T, InserterTy>::CreateMemCpy(Dst, getCorrectAlign(Align), Src, getCorrectAlign(Align), Size,
- isVolatile, TBAATag, TBAAStructTag, ScopeTag, NoAliasTag);
+ isVolatile, llvm::AAMDNodes(TBAATag, TBAAStructTag, ScopeTag, NoAliasTag, nullptr));
}
inline llvm::CallInst *CreateMemCpy(llvm::Value *Dst, llvm::Value *Src, llvm::Value *Size, alignment_t Align,
@@ -81,7 +81,7 @@ public:
llvm::MDNode *TBAAStructTag = nullptr, llvm::MDNode *ScopeTag = nullptr,
llvm::MDNode *NoAliasTag = nullptr) {
return llvm::IRBuilder<T, InserterTy>::CreateMemCpy(Dst, getCorrectAlign(Align), Src, getCorrectAlign(Align), Size,
- isVolatile, TBAATag, TBAAStructTag, ScopeTag, NoAliasTag);
+ isVolatile, llvm::AAMDNodes(TBAATag, TBAAStructTag, ScopeTag, NoAliasTag, nullptr));
}
inline llvm::CallInst *CreateMemCpy(llvm::Value *Dst, alignment_t DstAlign, llvm::Value *Src, alignment_t SrcAlign,
@@ -89,7 +89,7 @@ public:
llvm::MDNode *TBAAStructTag = nullptr, llvm::MDNode *ScopeTag = nullptr,
llvm::MDNode *NoAliasTag = nullptr) {
return llvm::IRBuilder<T, InserterTy>::CreateMemCpy(Dst, getCorrectAlign(DstAlign), Src, getCorrectAlign(SrcAlign),
- Size, isVolatile, TBAATag, TBAAStructTag, ScopeTag, NoAliasTag);
+ Size, isVolatile, llvm::AAMDNodes(TBAATag, TBAAStructTag, ScopeTag, NoAliasTag, nullptr));
}
inline llvm::CallInst *CreateMemCpy(llvm::Value *Dst, alignment_t DstAlign, llvm::Value *Src, alignment_t SrcAlign,
@@ -97,7 +97,7 @@ public:
llvm::MDNode *TBAAStructTag = nullptr, llvm::MDNode *ScopeTag = nullptr,
llvm::MDNode *NoAliasTag = nullptr) {
return llvm::IRBuilder<T, InserterTy>::CreateMemCpy(Dst, getCorrectAlign(DstAlign), Src, getCorrectAlign(SrcAlign),
- Size, isVolatile, TBAATag, TBAAStructTag, ScopeTag, NoAliasTag);
+ Size, isVolatile, llvm::AAMDNodes(TBAATag, TBAAStructTag, ScopeTag, NoAliasTag, nullptr));
}
using llvm::IRBuilder<T, InserterTy>::CreateMemSet;
@@ -122,14 +122,14 @@ public:
uint64_t Size, bool isVolatile = false, llvm::MDNode *TBAATag = nullptr,
llvm::MDNode *ScopeTag = nullptr, llvm::MDNode *NoAliasTag = nullptr) {
return llvm::IRBuilder<T, InserterTy>::CreateMemMove(Dst, getCorrectAlign(DstAlign), Src, getCorrectAlign(SrcAlign),
- Size, isVolatile, TBAATag, ScopeTag, NoAliasTag);
+ Size, isVolatile, llvm::AAMDNodes(TBAATag, nullptr, ScopeTag, NoAliasTag, nullptr));
}
inline llvm::CallInst *CreateMemMove(llvm::Value *Dst, unsigned DstAlign, llvm::Value *Src, unsigned SrcAlign,
llvm::Value *Size, bool isVolatile = false, llvm::MDNode *TBAATag = nullptr,
llvm::MDNode *ScopeTag = nullptr, llvm::MDNode *NoAliasTag = nullptr) {
return llvm::IRBuilder<T, InserterTy>::CreateMemMove(Dst, getCorrectAlign(DstAlign), Src, getCorrectAlign(SrcAlign),
- Size, isVolatile, TBAATag, ScopeTag, NoAliasTag);
+ Size, isVolatile, llvm::AAMDNodes(TBAATag, nullptr, ScopeTag, NoAliasTag, nullptr));
}
inline llvm::AllocaInst *CreateAlloca(llvm::Type *Ty, llvm::Value *ArraySize = nullptr, const llvm::Twine &Name = "",
diff --git a/IGC/WrapperLLVM/include/llvmWrapper/IR/IntrinsicInst.h b/IGC/WrapperLLVM/include/llvmWrapper/IR/IntrinsicInst.h
index d281cde..cce0dd1 100644
--- a/IGC/WrapperLLVM/include/llvmWrapper/IR/IntrinsicInst.h
+++ b/IGC/WrapperLLVM/include/llvmWrapper/IR/IntrinsicInst.h
@@ -12,6 +12,7 @@ SPDX-License-Identifier: MIT
#include "IGC/common/LLVMWarningsPush.hpp"
#include <llvm/Config/llvm-config.h>
#include <llvm/IR/Constants.h>
+#include <llvm/IR/DebugProgramInstruction.h>
#include <llvm/IR/IntrinsicInst.h>
#include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/Support/Casting.h"
@@ -50,6 +51,10 @@ inline void setExpression(llvm::DbgVariableIntrinsic *DbgInst, llvm::DIExpressio
IGC_ASSERT(DbgInst);
DbgInst->setExpression(NewExpr);
}
+inline void setExpression(llvm::DbgVariableRecord *DbgInst, llvm::DIExpression *NewExpr) {
+ IGC_ASSERT(DbgInst);
+ DbgInst->setExpression(NewExpr);
+}
} // namespace IGCLLVM
#endif
diff --git a/IGC/WrapperLLVM/include/llvmWrapper/Support/Alignment.h b/IGC/WrapperLLVM/include/llvmWrapper/Support/Alignment.h
index c003bd2..dfcc3cf 100644
--- a/IGC/WrapperLLVM/include/llvmWrapper/Support/Alignment.h
+++ b/IGC/WrapperLLVM/include/llvmWrapper/Support/Alignment.h
@@ -13,6 +13,7 @@ SPDX-License-Identifier: MIT
#include "llvm/Support/Alignment.h"
#include "llvm/Config/llvm-config.h"
#include "llvm/IR/DataLayout.h"
+#include "llvm/IR/Attributes.h"
#include "llvm/IR/GlobalObject.h"
#include "llvm/IR/Instruction.h"
#include "IGC/common/LLVMWarningsPop.hpp"
@@ -47,7 +48,10 @@ inline llvm::Align getCorrectAlign(alignment_t Val) {
// interface.
template <typename TValue, std::enable_if_t<std::is_base_of_v<llvm::GlobalObject, TValue>, int> = 0>
llvm::Align getAlign(const TValue &Val) {
- return llvm::Align(Val.getAlignment());
+ if constexpr (std::is_base_of_v<llvm::Function, TValue>)
+ return Val.getFnAttribute(llvm::Attribute::AttrKind::Alignment).getAlignment().valueOrOne();
+ else
+ return llvm::Align(Val.getAlignment());
}
template <typename TValue, std::enable_if_t<std::is_base_of_v<llvm::Instruction, TValue>, int> = 0>
diff --git a/IGC/WrapperLLVM/include/llvmWrapper/Target/TargetMachine.h b/IGC/WrapperLLVM/include/llvmWrapper/Target/TargetMachine.h
index eec95a3..22abd13 100644
--- a/IGC/WrapperLLVM/include/llvmWrapper/Target/TargetMachine.h
+++ b/IGC/WrapperLLVM/include/llvmWrapper/Target/TargetMachine.h
@@ -13,6 +13,7 @@ SPDX-License-Identifier: MIT
#include "llvm/Config/llvm-config.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/Support/CodeGen.h"
+#include "llvm/CodeGen/CodeGenTargetMachineImpl.h"
#include "llvm/Target/TargetMachine.h"
#include "IGC/common/LLVMWarningsPop.hpp"
@@ -49,15 +50,15 @@ public:
}
};
-class LLVMTargetMachine : public llvm::LLVMTargetMachine {
+class LLVMTargetMachine : public llvm::CodeGenTargetMachineImpl {
public:
using CodeGenFileType = llvm::CodeGenFileType;
protected:
LLVMTargetMachine(const llvm::Target &T, llvm::StringRef DataLayoutString, const llvm::Triple &TargetTriple,
llvm::StringRef CPU, llvm::StringRef FS, const llvm::TargetOptions &Options, llvm::Reloc::Model RM,
- llvm::CodeModel::Model CM, llvm::CodeGenOpt::Level OL)
- : llvm::LLVMTargetMachine(T, DataLayoutString, TargetTriple, CPU, FS, Options, RM, CM, OL) {}
+ llvm::CodeModel::Model CM, llvm::CodeGenOptLevel OL)
+ : llvm::CodeGenTargetMachineImpl(T, DataLayoutString, TargetTriple, CPU, FS, Options, RM, CM, OL) {}
private:
bool addPassesToEmitFile(llvm::PassManagerBase &PM, llvm::raw_pwrite_stream &o, llvm::raw_pwrite_stream *pi,
diff --git a/IGC/WrapperLLVM/lib/llvmWrapper/Transforms/IPO/InlineHelper.cpp b/IGC/WrapperLLVM/lib/llvmWrapper/Transforms/IPO/InlineHelper.cpp
index 5c3b176..501a29b 100644
--- a/IGC/WrapperLLVM/lib/llvmWrapper/Transforms/IPO/InlineHelper.cpp
+++ b/IGC/WrapperLLVM/lib/llvmWrapper/Transforms/IPO/InlineHelper.cpp
@@ -39,7 +39,8 @@ bool removeDeadFunctions(CallGraph &CG, bool AlwaysInlineOnly) {
// Remove any edges from the external node to the function's call graph
// node. These edges might have been made irrelegant due to
// optimization of the program.
- CG.getExternalCallingNode()->removeAnyCallEdgeTo(CGN);
+ CG.getExternalCallingNode()->removeAllCalledFunctions();
+ CG.populateCallGraphNode(CG.getExternalCallingNode());
// Removing the node for callee from the call graph and delete it.
FunctionsToRemove.push_back(CGN);
@@ -357,7 +358,7 @@ bool inlineCallsImpl(CallGraphSCC &SCC, CallGraph &CG, std::function<AssumptionC
// just become a regular analysis dependency.
llvm::OptimizationRemarkEmitter ORE(Caller);
- auto OIC = shouldInline(CB, GetInlineCost, ORE);
+ auto OIC = GetInlineCost(CB);
// If the policy determines that we should inline this function,
// delete the call instead.
if (!OIC)
@@ -371,7 +372,8 @@ bool inlineCallsImpl(CallGraphSCC &SCC, CallGraph &CG, std::function<AssumptionC
LLVM_DEBUG(dbgs() << " -> Deleting dead call: " << CB << "\n");
// Update the call graph by deleting the edge from Callee to Caller.
setInlineRemark(CB, "trivially dead");
- CG[Caller]->removeCallEdgeFor(CB);
+ CG[Caller]->removeAllCalledFunctions();
+ CG.populateCallGraphNode(CG[Caller]);
CB.eraseFromParent();
} else {
// Get DebugLoc to report. CB will be invalid after Inliner.
@@ -384,7 +386,7 @@ bool inlineCallsImpl(CallGraphSCC &SCC, CallGraph &CG, std::function<AssumptionC
InlineResult IR = inlineCallIfPossible(CB, InlineInfo, InlinedArrayAllocas, InlineHistoryID, InsertLifetime,
AARGetter, ImportedFunctionsStats);
if (!IR.isSuccess()) {
- setInlineRemark(CB, std::string(IR.getFailureReason()) + "; " + inlineCostStr(*OIC));
+ setInlineRemark(CB, std::string(IR.getFailureReason()) + "; " + inlineCostStr(OIC));
ORE.emit([&]() {
return llvm::OptimizationRemarkMissed(DEBUG_TYPE, "NotInlined", DLoc, Block)
<< NV("Callee", Callee) << " will not be inlined into " << NV("Caller", Caller) << ": "
@@ -393,7 +395,7 @@ bool inlineCallsImpl(CallGraphSCC &SCC, CallGraph &CG, std::function<AssumptionC
continue;
}
- emitInlinedIntoBasedOnCost(ORE, DLoc, Block, *Callee, *Caller, *OIC);
+ emitInlinedIntoBasedOnCost(ORE, DLoc, Block, *Callee, *Caller, OIC);
// If inlining this function gave us any new call sites, throw them
// onto our worklist to process. They are useful inline candidates.
diff --git a/IGC/WrapperLLVM/lib/llvmWrapper/Transforms/IPO/InlineSimple.cpp b/IGC/WrapperLLVM/lib/llvmWrapper/Transforms/IPO/InlineSimple.cpp
index a76d398..21c0601 100644
--- a/IGC/WrapperLLVM/lib/llvmWrapper/Transforms/IPO/InlineSimple.cpp
+++ b/IGC/WrapperLLVM/lib/llvmWrapper/Transforms/IPO/InlineSimple.cpp
@@ -52,8 +52,6 @@ SimpleInlinerLegacyPassWrapper::SimpleInlinerLegacyPassWrapper(InlineParams Para
bool SimpleInlinerLegacyPassWrapper::runOnSCC(CallGraphSCC &SCC) {
TTIWP = &getAnalysis<TargetTransformInfoWrapperPass>();
- if (skipSCC(SCC))
- return false;
bool changed = inlineCalls(SCC);
return changed;
}
diff --git a/IGC/WrapperLLVM/lib/llvmWrapper/Transforms/IPO/LegacyPassManagerBuilder.cpp b/IGC/WrapperLLVM/lib/llvmWrapper/Transforms/IPO/LegacyPassManagerBuilder.cpp
index 1fb1738..b7b5047 100644
--- a/IGC/WrapperLLVM/lib/llvmWrapper/Transforms/IPO/LegacyPassManagerBuilder.cpp
+++ b/IGC/WrapperLLVM/lib/llvmWrapper/Transforms/IPO/LegacyPassManagerBuilder.cpp
@@ -59,6 +59,7 @@ SPDX-License-Identifier: MIT
#include "llvmWrapper/Transforms/Scalar/LoopDistribute.h"
#include "llvmWrapper/Transforms/IPO/PostOrderFunctionAttrs.h"
#include "llvmWrapper/Transforms/Scalar/MemCpyOptimizer.h"
+#include "llvmWrapper/Transforms/Scalar/LowerExpectIntrinsic.h"
#include "llvmWrapper/Transforms/Scalar/LoopUnrollPass.h"
#include "llvmWrapper/Transforms/Scalar/IndVarSimplify.h"
#include "Compiler/IGCPassSupport.h"
@@ -96,7 +97,7 @@ void PassManagerBuilder::populateFunctionPassManager(legacy::FunctionPassManager
// Lower llvm.expect to metadata before attempting transforms.
// Compare/branch metadata may alter the behavior of passes like SimplifyCFG.
- FPM.add(createLowerExpectIntrinsicPass());
+ FPM.add(IGCLLVM::createLegacyWrappedLowerExpectIntrinsicPass());
FPM.add(createCFGSimplificationPass());
FPM.add(createSROAPass());
FPM.add(createEarlyCSEPass());
@@ -134,9 +135,6 @@ void PassManagerBuilder::addFunctionSimplificationPasses(legacy::PassManagerBase
// The simple loop unswitch pass relies on separate cleanup passes. Schedule
// them first so when we re-process a loop they run before other loop
// passes.
- MPM.add(createLoopInstSimplifyPass());
- MPM.add(createLoopSimplifyCFGPass());
-
// Try to remove as much code from the loop header as possible,
// to reduce amount of IR that will have to be duplicated. However,
// do not perform speculative hoisting the first time as LICM
@@ -145,13 +143,9 @@ void PassManagerBuilder::addFunctionSimplificationPasses(legacy::PassManagerBase
// TODO: Investigate promotion cap for O1.
MPM.add(IGCLLVM::createLegacyWrappedLICMPass(LicmMssaOptCap, LicmMssaNoAccForPromotionCap,
/*AllowSpeculation=*/false));
- // Rotate Loop - disable header duplication at -Oz
- MPM.add(createLoopRotatePass(SizeLevel == 2 ? 0 : -1, false));
- // TODO: Investigate promotion cap for O1.
+ // Rotate Loop - disable header duplication at -Oz // TODO: Investigate promotion cap for O1.
MPM.add(IGCLLVM::createLegacyWrappedLICMPass(LicmMssaOptCap, LicmMssaNoAccForPromotionCap,
- /*AllowSpeculation=*/true));
- MPM.add(createSimpleLoopUnswitchLegacyPass(OptLevel == 3));
- // FIXME: We break the loop pass pipeline here in order to do full
+ /*AllowSpeculation=*/true)); // FIXME: We break the loop pass pipeline here in order to do full
// simplifycfg. Eventually loop-simplifycfg should be enhanced to replace the
// need for this.
MPM.add(createCFGSimplificationPass(SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
@@ -168,9 +162,7 @@ void PassManagerBuilder::addFunctionSimplificationPasses(legacy::PassManagerBase
// Break up allocas that may now be splittable after loop unrolling.
MPM.add(createSROAPass());
- if (OptLevel > 1) {
- MPM.add(createMergedLoadStoreMotionPass()); // Merge ld/st in diamonds
- MPM.add(createGVNPass(false)); // Remove redundancies
+ if (OptLevel > 1) { MPM.add(createGVNPass()); // Remove redundancies
}
MPM.add(IGCLLVM::createLegacyWrappedSCCPPass()); // Constant prop with SCCP
@@ -383,13 +375,9 @@ void PassManagerBuilder::populateModulePassManager(legacy::PassManagerBase &MPM)
MPM.add(createGlobalsAAWrapperPass());
MPM.add(IGCLLVM::createLegacyWrappedFloat2IntPass());
- MPM.add(createLowerConstantIntrinsicsPass());
-
// Re-rotate loops in all our loop nests. These may have fallout out of
// rotated form due to GVN or other transformations, and the vectorizer relies
// on the rotated form. Disable header duplication at -Oz.
- MPM.add(createLoopRotatePass(SizeLevel == 2 ? 0 : -1, false));
-
// Distribute loops to allow partial vectorization. I.e. isolate dependences
// into separate loop that would otherwise inhibit vectorization. This is
// currently only performed for loops marked with the metadata
@@ -411,9 +399,7 @@ void PassManagerBuilder::populateModulePassManager(legacy::PassManagerBase &MPM)
// LoopSink pass sinks instructions hoisted by LICM, which serves as a
// canonicalization pass that enables other optimizations. As a result,
// LoopSink pass needs to be a very late IR pass to avoid undoing LICM
- // result too early.
- MPM.add(createLoopSinkPass());
- // Get rid of LCSSA nodes.
+ // result too early. // Get rid of LCSSA nodes.
MPM.add(createInstSimplifyLegacyPass());
// This hoists/decomposes div/rem ops. It should run after other sink/hoist
diff --git a/IGC/WrapperLLVM/lib/llvmWrapper/Transforms/Scalar/MemCpyOptimizer.cpp b/IGC/WrapperLLVM/lib/llvmWrapper/Transforms/Scalar/MemCpyOptimizer.cpp
index f323e5d..52be99d 100644
--- a/IGC/WrapperLLVM/lib/llvmWrapper/Transforms/Scalar/MemCpyOptimizer.cpp
+++ b/IGC/WrapperLLVM/lib/llvmWrapper/Transforms/Scalar/MemCpyOptimizer.cpp
@@ -17,6 +17,7 @@ SPDX-License-Identifier: MIT
#include "llvm/Analysis/AssumptionCache.h"
#include "llvm/Analysis/GlobalsModRef.h"
#include "llvm/Analysis/MemorySSAUpdater.h"
+#include "llvm/TargetParser/Host.h"
#include "llvm/Support/Alignment.h"
#include "llvm/Transforms/Scalar.h"
@@ -36,9 +37,17 @@ MemCpyOptLegacyPassWrapper::MemCpyOptLegacyPassWrapper() : FunctionPass(ID) {
}
void MemCpyOptLegacyPassWrapper::initializeAnalysisManagers() {
+#if LLVM_VERSION_MAJOR >= 22
+ FAM.registerPass([]() {
+ auto TLII = TargetLibraryInfoImpl(Triple(sys::getProcessTriple()));
+ TLII.disableAllFunctions();
+ return TargetLibraryAnalysis(std::move(TLII));
+ });
+#else
TargetLibraryInfoImpl TLII;
TLII.disableAllFunctions();
FAM.registerPass([TLII = std::move(TLII)]() mutable { return TargetLibraryAnalysis(std::move(TLII)); });
+#endif
PB.registerLoopAnalyses(LAM);
PB.registerFunctionAnalyses(FAM);
diff --git a/IGC/ZEBinWriter/zebin/source/ZEELFObjectBuilder.cpp b/IGC/ZEBinWriter/zebin/source/ZEELFObjectBuilder.cpp
index 563e000..9ae1954 100644
--- a/IGC/ZEBinWriter/zebin/source/ZEELFObjectBuilder.cpp
+++ b/IGC/ZEBinWriter/zebin/source/ZEELFObjectBuilder.cpp
@@ -816,7 +816,7 @@ uint16_t ELFWriter::numOfSections() {
}
ELFWriter::ELFWriter(llvm::raw_pwrite_stream &OS, ZEELFObjectBuilder &objBuilder)
- : m_W(OS, llvm::support::little), m_ObjBuilder(objBuilder) {}
+ : m_W(OS, llvm::endianness::little), m_ObjBuilder(objBuilder) {}
uint64_t ELFWriter::write() {
uint64_t start = m_W.OS.tell();
diff --git a/IGC/cmake/IRBuilderGeneratorCodeGen.cmake b/IGC/cmake/IRBuilderGeneratorCodeGen.cmake
index 98b81c8..654bea9 100644
--- a/IGC/cmake/IRBuilderGeneratorCodeGen.cmake
+++ b/IGC/cmake/IRBuilderGeneratorCodeGen.cmake
@@ -85,8 +85,10 @@ function(generate_irbuilder_headers)
endforeach()
set(WARNING_SETTINGS "")
+ set(TARGET_OPTIONS -target x86_64-pc-windows -isystem /usr/include/c++/v1)
if (WIN32)
set(WARNING_SETTINGS -pedantic -Wall -Werror)
+ set(TARGET_OPTIONS -target x86_64-pc-windows)
endif()
set(CLANG_HEADERS ${IGC_BUILD__GFX_DEV_SRC_DIR}/external/llvm/releases/${IGC_BUILD__CLANG_VERSION}/clang/lib/Headers)
@@ -110,8 +112,8 @@ function(generate_irbuilder_headers)
# Common clang options
set(CLANG_OPTIONS
- -target x86_64-pc-windows
- ${WARNING_SETTINGS}
+
+
-Wno-return-type-c-linkage
-std=c++17
-emit-llvm
diff --git a/IGC/cmake/igc_find_opencl_clang.cmake b/IGC/cmake/igc_find_opencl_clang.cmake
index e87aea1..eac6930 100644
--- a/IGC/cmake/igc_find_opencl_clang.cmake
+++ b/IGC/cmake/igc_find_opencl_clang.cmake
@@ -122,7 +122,11 @@ if(CCLANG_FROM_SYSTEM)
else()
set_property(TARGET opencl-clang-lib PROPERTY "IMPORTED_LOCATION" "${SYSTEM_COMMON_CLANG}")
endif()
- find_program(CLANG_EXE clang-${IGC_BUILD__CLANG_VERSION_MAJOR})
+ find_program(CLANG_EXE clang-${IGC_BUILD__CLANG_VERSION_MAJOR}
+ PATHS ENV PATH NO_DEFAULT_PATH)
+ if(NOT CLANG_EXE)
+ find_program(CLANG_EXE clang-${IGC_BUILD__CLANG_VERSION_MAJOR})
+ endif()
if(CLANG_EXE)
message(STATUS "[IGC] Found clang-${IGC_BUILD__CLANG_VERSION_MAJOR} executable: ${CLANG_EXE}")
diff --git a/IGC/common/BuiltinTypes.cpp b/IGC/common/BuiltinTypes.cpp
index 7deecfe..c4475fe 100644
--- a/IGC/common/BuiltinTypes.cpp
+++ b/IGC/common/BuiltinTypes.cpp
@@ -46,9 +46,9 @@ bool isImageBuiltinType(const Type *BuiltinTy) {
BuiltinName.split(Buffer, ".");
if (Buffer.size() < 2)
return false;
- bool IsOpenCLImage = Buffer[0].equals("opencl") && Buffer[1].startswith("image") && Buffer[1].endswith("_t");
+ bool IsOpenCLImage = Buffer[0] == "opencl" && Buffer[1].starts_with("image") && Buffer[1].ends_with("_t");
bool IsSPIRVImage =
- Buffer[0].equals("spirv") && (Buffer[1].startswith("Image") || Buffer[1].startswith("SampledImage"));
+ Buffer[0] == "spirv" && (Buffer[1].starts_with("Image") || Buffer[1].starts_with("SampledImage"));
if (IsOpenCLImage || IsSPIRVImage)
return true;
@@ -171,9 +171,9 @@ private:
StringRef TyName = TET->getName();
unsigned AS = ADDRESS_SPACE_PRIVATE;
- if (TyName.startswith("spirv.Image") || TyName.startswith("spirv.SampledImage"))
+ if (TyName.starts_with("spirv.Image") || TyName.starts_with("spirv.SampledImage"))
AS = ADDRESS_SPACE_GLOBAL;
- else if (TyName.startswith("spirv.Sampler"))
+ else if (TyName.starts_with("spirv.Sampler"))
AS = ADDRESS_SPACE_CONSTANT;
return PointerType::get(Ctx, AS);
diff --git a/IGC/common/IGCConstantFolder.cpp b/IGC/common/IGCConstantFolder.cpp
index 0908e4a..6ef559e 100644
--- a/IGC/common/IGCConstantFolder.cpp
+++ b/IGC/common/IGCConstantFolder.cpp
@@ -340,7 +340,7 @@ llvm::Constant *IGCConstantFolder::CreateUbfe(llvm::Constant *C0, llvm::Constant
llvm::ConstantInt *CI2 = llvm::cast<llvm::ConstantInt>(C2); // the number to shift
uint32_t width = int_cast<uint32_t>(CI0->getZExtValue());
uint32_t offset = int_cast<uint32_t>(CI1->getZExtValue());
- uint32_t bitwidth = CI2->getType()->getBitWidth();
+ uint32_t bitwidth = CI2->getType()->getIntegerBitWidth();
llvm::APInt result = CI2->getValue();
if ((width + offset) < bitwidth) {
@@ -363,7 +363,7 @@ llvm::Constant *IGCConstantFolder::CreateIbfe(llvm::Constant *C0, llvm::Constant
llvm::ConstantInt *CI2 = llvm::cast<llvm::ConstantInt>(C2); // the number to shift
uint32_t width = int_cast<uint32_t>(CI0->getZExtValue());
uint32_t offset = int_cast<uint32_t>(CI1->getZExtValue());
- uint32_t bitwidth = CI2->getType()->getBitWidth();
+ uint32_t bitwidth = CI2->getType()->getIntegerBitWidth();
llvm::APInt result = CI2->getValue();
if ((width + offset) < bitwidth) {
@@ -409,7 +409,7 @@ llvm::Constant *IGCConstantFolder::CreateFirstBitHi(llvm::Constant *C0) const {
}
llvm::ConstantInt *CI0 = llvm::cast<llvm::ConstantInt>(C0);
const unsigned fbh = CI0->getValue().countLeadingZeros();
- if (fbh == CI0->getType()->getBitWidth()) {
+ if (fbh == CI0->getType()->getIntegerBitWidth()) {
return llvm::ConstantInt::get(C0->getType(), -1);
}
return llvm::ConstantInt::get(C0->getType(), fbh);
@@ -422,7 +422,7 @@ llvm::Constant *IGCConstantFolder::CreateFirstBitShi(llvm::Constant *C0) const {
IGC_ASSERT(llvm::isa<llvm::ConstantInt>(C0));
llvm::ConstantInt *CI0 = llvm::cast<llvm::ConstantInt>(C0);
const uint32_t fbs = CI0->isNegative() ? CI0->getValue().countLeadingOnes() : CI0->getValue().countLeadingZeros();
- if (fbs == CI0->getType()->getBitWidth()) {
+ if (fbs == CI0->getType()->getIntegerBitWidth()) {
return llvm::ConstantInt::get(C0->getType(), -1);
}
return llvm::ConstantInt::get(C0->getType(), fbs);
@@ -435,7 +435,7 @@ llvm::Constant *IGCConstantFolder::CreateFirstBitLo(llvm::Constant *C0) const {
IGC_ASSERT(llvm::isa<llvm::ConstantInt>(C0));
llvm::ConstantInt *CI0 = llvm::cast<llvm::ConstantInt>(C0);
const unsigned fbl = CI0->getValue().countTrailingZeros();
- if (fbl == CI0->getType()->getBitWidth()) {
+ if (fbl == CI0->getType()->getIntegerBitWidth()) {
return llvm::ConstantInt::get(C0->getType(), -1);
}
return llvm::ConstantInt::get(C0->getType(), fbl);
@@ -452,7 +452,7 @@ llvm::Constant *IGCConstantFolder::CreateBfi(llvm::Constant *C0, llvm::Constant
llvm::ConstantInt *CI3 = llvm::cast<llvm::ConstantInt>(C3); // the number with bits to be replaced.
uint32_t width = int_cast<uint32_t>(CI0->getZExtValue());
uint32_t offset = int_cast<uint32_t>(CI1->getZExtValue());
- uint32_t bitwidth = CI2->getType()->getBitWidth();
+ uint32_t bitwidth = CI2->getType()->getIntegerBitWidth();
llvm::APInt bitmask = llvm::APInt::getBitsSet(bitwidth, offset, offset + width);
llvm::APInt result = CI2->getValue();
result = result.shl(offset);
diff --git a/IGC/common/LLVMUtils.cpp b/IGC/common/LLVMUtils.cpp
index a7eb6ad..93298f7 100644
--- a/IGC/common/LLVMUtils.cpp
+++ b/IGC/common/LLVMUtils.cpp
@@ -702,7 +702,7 @@ bool IGCPassManager::isPrintAfter(Pass *P) {
void IGCPassManager::addPrintPass(Pass *P, bool isBefore) {
auto passName = P->getPassName();
std::string fullPassName = m_name + (isBefore ? "_before_" : "_after_") +
- (passName.startswith("Unnamed pass") ? "UnnamedPass" : cleanPassName(passName.str()));
+ (passName.starts_with("Unnamed pass") ? "UnnamedPass" : cleanPassName(passName.str()));
auto name = IGC::Debug::DumpName(IGC::Debug::GetShaderOutputName())
.ShaderName(m_pContext->shaderName)
@@ -757,10 +757,10 @@ void DumpLLVMIR(IGC::CodeGenContext *pContext, const char *dumpName) {
for (auto &F : module->getFunctionList())
for (BasicBlock &BB : F) {
for (Instruction &I : BB)
- if (I.getName().startswith("x"))
+ if (I.getName().starts_with("x"))
I.setName("_x");
- if (BB.getName().startswith("bb"))
+ if (BB.getName().starts_with("bb"))
BB.setName("_bb");
}
// Now we rewrite the variables using a counter
@@ -769,12 +769,12 @@ void DumpLLVMIR(IGC::CodeGenContext *pContext, const char *dumpName) {
for (auto &F : module->getFunctionList())
for (BasicBlock &BB : F) {
for (Instruction &I : BB) {
- if ((!I.hasName() && !I.getType()->isVoidTy()) || I.getName().startswith("_x")) {
+ if ((!I.hasName() && !I.getType()->isVoidTy()) || I.getName().starts_with("_x")) {
I.setName("x" + std::to_string(counter++));
}
}
- if (!BB.hasName() || BB.getName().startswith("_bb"))
+ if (!BB.hasName() || BB.getName().starts_with("_bb"))
BB.setName("bb" + std::to_string(bb_counter++));
}
}
diff --git a/IGC/common/LLVMUtils.h b/IGC/common/LLVMUtils.h
index 88b8a4d..998b8c4 100644
--- a/IGC/common/LLVMUtils.h
+++ b/IGC/common/LLVMUtils.h
@@ -14,6 +14,7 @@ SPDX-License-Identifier: MIT
#include "common/LLVMWarningsPop.hpp"
#include <list>
#include "Stats.hpp"
+#include "common/debug/Dump.hpp"
#include <string.h>
namespace IGC {
@@ -40,6 +41,36 @@ private:
// Return true if N is in the list.
bool isInList(const llvm::StringRef &N, const llvm::StringRef &List) const;
};
+inline llvm::Instruction *getFirstNonPHIOrDbgInst(llvm::BasicBlock *BB) {
+ auto It = BB->getFirstNonPHIOrDbg();
+ return It == BB->end() ? nullptr : &*It;
+}
+
+inline llvm::Instruction *getNextNonDbgInstruction(llvm::Instruction *I) {
+ if (!I)
+ return nullptr;
+ auto It = std::next(I->getIterator());
+ auto E = I->getParent()->end();
+ for (; It != E; ++It) {
+ if (!It->isDebugOrPseudoInst())
+ return &*It;
+ }
+ return nullptr;
+}
+
+inline llvm::Instruction *getPrevNonDbgInstruction(llvm::Instruction *I) {
+ if (!I)
+ return nullptr;
+ auto It = I->getIterator();
+ auto B = I->getParent()->begin();
+ while (It != B) {
+ --It;
+ if (!It->isDebugOrPseudoInst())
+ return &*It;
+ }
+ return nullptr;
+}
+
} // namespace IGC
void DumpLLVMIR(IGC::CodeGenContext *pContext, const char *dumpName);
diff --git a/IGC/common/MDFrameWork.cpp b/IGC/common/MDFrameWork.cpp
index fcdd2e0..8de63bd 100644
--- a/IGC/common/MDFrameWork.cpp
+++ b/IGC/common/MDFrameWork.cpp
@@ -194,7 +194,7 @@ template <typename val> MDNode *CreateNode(const std::optional<val> &option, Mod
if (option.has_value())
nodes.push_back(CreateNode(*option, module, name.str() + "Option"));
else
- nodes.push_back(ValueAsMetadata::get(ConstantPointerNull::get(Type::getInt1PtrTy(module->getContext()))));
+ nodes.push_back(ValueAsMetadata::get(ConstantPointerNull::get(PointerType::get(module->getContext(), 0))));
MDNode *node = MDNode::get(module->getContext(), nodes);
return node;
diff --git a/IGC/common/SerializePrintMetaDataPass.cpp b/IGC/common/SerializePrintMetaDataPass.cpp
index b94095c..4a5f07f 100644
--- a/IGC/common/SerializePrintMetaDataPass.cpp
+++ b/IGC/common/SerializePrintMetaDataPass.cpp
@@ -115,7 +115,7 @@ void SerializePrintMetaDataPass::CollectValueMD(llvm::Value *Val) {
if (auto callInstr = llvm::dyn_cast<llvm::CallInst>(instr)) {
if (auto callFunc = callInstr->getCalledFunction()) {
- if (callFunc->getName().startswith("llvm.")) {
+ if (callFunc->getName().starts_with("llvm.")) {
for (unsigned i = 0; i < instr->getNumOperands(); ++i) {
if (auto valAsMD = llvm::dyn_cast<llvm::MetadataAsValue>(instr->getOperand(i))) {
CollectInsideMD(valAsMD->getMetadata());
diff --git a/IGC/common/debug/Debug.cpp b/IGC/common/debug/Debug.cpp
index f38b41f..e2451a7 100644
--- a/IGC/common/debug/Debug.cpp
+++ b/IGC/common/debug/Debug.cpp
@@ -217,7 +217,7 @@ void RegisterErrHandlers() {
}
}
-void RegisterComputeErrHandlers(LLVMContext &C) { C.setDiagnosticHandlerCallBack(ComputeFatalErrorHandler); }
+void RegisterComputeErrHandlers(LLVMContext &C) { C.setDiagnosticHandlerCallBack([](const llvm::DiagnosticInfo *DI, void *Ctx) { ComputeFatalErrorHandler(*DI, Ctx); }); }
void ReleaseErrHandlers() {
// do nothing
diff --git a/IGC/common/igc_regkeys.cpp b/IGC/common/igc_regkeys.cpp
index efeb94f..65787f9 100644
--- a/IGC/common/igc_regkeys.cpp
+++ b/IGC/common/igc_regkeys.cpp
@@ -628,7 +628,7 @@ static void ParseHashRange(llvm::StringRef line, std::vector<HashRange> &ranges)
if (!Result)
return;
auto parseAsInt = [](StringRef S) {
- unsigned Radix = S.startswith("0x") ? 0 : 16;
+ unsigned Radix = S.starts_with("0x") ? 0 : 16;
uint64_t Result;
[[maybe_unused]] bool Err = S.getAsInteger(Radix, Result);
IGC_ASSERT(!Err);
diff --git a/IGC/igc_create_linker_script.sh b/IGC/igc_create_linker_script.sh
new file mode 100755
index 0000000..8d6effa
--- /dev/null
+++ b/IGC/igc_create_linker_script.sh
@@ -0,0 +1,61 @@
+#!/bin/bash
+
+#Uses objdump to obtain global functions from object files - 2nd script argument
+#Creates a linker script in script's directory, with 1st argument as a name, sets every symbol as local, as the ones obtained as global
+
+readonly SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
+readonly NEWLINE=$'\n'
+
+readonly LINKER_SCRIPT=$1
+readonly BIF_LIBRARY=$2
+readonly DX10_LIBRARY=$3
+readonly DXIL_LIBRARY=$4
+readonly VULKAN_FE_LIBRARY=$5
+
+shift
+
+formatAndWriteSymbols() {
+ if [[ -n "${1}" ]]; then
+ formattedSymbols=$(echo "${1}" | awk '{print $NF}')
+ formattedSymbols=$(echo -e "${formattedSymbols}" | sed ':a;N;$!ba;s/\n/\n\t\t/g')
+ formattedSymbols="${formattedSymbols//${NEWLINE}/;${NEWLINE}}"
+
+ echo -e "\t\t$formattedSymbols;" >> ${SCRIPT_DIR}/${LINKER_SCRIPT}
+ fi
+}
+
+#-----------------------------------------------------------------------------------------
+
+echo -e "{\n\t global:" > ${SCRIPT_DIR}/${LINKER_SCRIPT}
+
+if [[ "$BIF_LIBRARY" != "null" ]]; then
+ symbolsBIF=$(objdump -t $BIF_LIBRARY | grep " O " | grep " g " | grep -v hidden)
+ formatAndWriteSymbols "$symbolsBIF"
+fi
+
+if [[ "$VULKAN_FE_LIBRARY" != "null" ]]; then
+ symbolsVFE=$(objdump -t $VULKAN_FE_LIBRARY | grep " F " | grep " g " | grep -v hidden)
+ formatAndWriteSymbols "$symbolsVFE"
+
+ symbolsVFE=$(objdump -t $VULKAN_FE_LIBRARY | grep " w " | grep -v hidden)
+ formatAndWriteSymbols "$symbolsVFE"
+
+ symbolsVFE=$(objdump -t $VULKAN_FE_LIBRARY | grep " W " | grep -v hidden)
+ formatAndWriteSymbols "$symbolsVFE"
+fi
+
+for obj_file in "$@"; do
+ if [[ $obj_file == *.o ]]; then
+ symbols=$(objdump -t $obj_file | grep " F " | grep " g " | grep -v hidden)
+ formatAndWriteSymbols "$symbols"
+
+ symbols=$(objdump -t $obj_file | grep " w " | grep -v hidden)
+ formatAndWriteSymbols "$symbols"
+
+ symbols=$(objdump -t $obj_file | grep " W " | grep -v hidden)
+ formatAndWriteSymbols "$symbols"
+ fi
+done
+
+echo -e "\tlocal: *;" >> ${SCRIPT_DIR}/${LINKER_SCRIPT}
+echo -e "};" >> ${SCRIPT_DIR}/${LINKER_SCRIPT}
diff --git a/visa/iga/IGALibrary/CMakeLists.txt b/visa/iga/IGALibrary/CMakeLists.txt
index b037644..5cf59fe 100644
--- a/visa/iga/IGALibrary/CMakeLists.txt
+++ b/visa/iga/IGALibrary/CMakeLists.txt
@@ -15,17 +15,6 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
##############################################
# compute the version string from the git repo
-execute_process(
- COMMAND git rev-parse --short HEAD
- OUTPUT_VARIABLE GIT_COMMIT
- OUTPUT_STRIP_TRAILING_WHITESPACE
- WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
-#
-execute_process(
- COMMAND git diff-index --quiet HEAD --
- RESULT_VARIABLE GIT_DIRTY
- WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
-
set(IGA_VERSION_SUFFIX "")
if(GIT_COMMIT)
set(IGA_VERSION_DIRTY_TAG "")