diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp index 6f63e6470270e..fe700607cc2d7 100644 --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -19,6 +19,7 @@ #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/Analysis/GlobalsModRef.h" +#include "llvm/Analysis/RuntimeLibcallInfo.h" #include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/Analysis/TargetTransformInfo.h" #include "llvm/Bitcode/BitcodeReader.h" @@ -667,6 +668,11 @@ bool EmitAssemblyHelper::AddEmitPasses(legacy::PassManager &CodeGenPasses, llvm::driver::createTLII(TargetTriple, CodeGenOpts.getVecLib())); CodeGenPasses.add(new TargetLibraryInfoWrapperPass(*TLII)); + const llvm::TargetOptions &Options = TM->Options; + CodeGenPasses.add(new RuntimeLibraryInfoWrapper( + TargetTriple, Options.ExceptionModel, Options.FloatABIType, + Options.EABIVersion, Options.MCOptions.ABIName, Options.VecLib)); + // Normal mode, emit a .s or .o file by running the code generator. Note, // this also adds codegenerator level optimization passes. CodeGenFileType CGFT = getCodeGenFileType(Action); diff --git a/llvm/include/llvm/Analysis/RuntimeLibcallInfo.h b/llvm/include/llvm/Analysis/RuntimeLibcallInfo.h index 28a2ec47f81ad..38fa83b58cbef 100644 --- a/llvm/include/llvm/Analysis/RuntimeLibcallInfo.h +++ b/llvm/include/llvm/Analysis/RuntimeLibcallInfo.h @@ -22,7 +22,12 @@ class LLVM_ABI RuntimeLibraryAnalysis RuntimeLibraryAnalysis() = default; RuntimeLibraryAnalysis(RTLIB::RuntimeLibcallsInfo &&BaselineInfoImpl) : LibcallsInfo(std::move(BaselineInfoImpl)) {} - explicit RuntimeLibraryAnalysis(const Triple &T) : LibcallsInfo(T) {} + RuntimeLibraryAnalysis( + const Triple &TT, + ExceptionHandling ExceptionModel = ExceptionHandling::None, + FloatABI::ABIType FloatABI = FloatABI::Default, + EABI EABIVersion = EABI::Default, StringRef ABIName = "", + VectorLibrary VecLib = VectorLibrary::NoLibrary); LLVM_ABI RTLIB::RuntimeLibcallsInfo run(const Module &M, ModuleAnalysisManager &); @@ -41,8 +46,12 @@ class LLVM_ABI RuntimeLibraryInfoWrapper : public ImmutablePass { public: static char ID; RuntimeLibraryInfoWrapper(); - explicit RuntimeLibraryInfoWrapper(const Triple &T); - explicit RuntimeLibraryInfoWrapper(const RTLIB::RuntimeLibcallsInfo &RTLCI); + RuntimeLibraryInfoWrapper( + const Triple &TT, + ExceptionHandling ExceptionModel = ExceptionHandling::None, + FloatABI::ABIType FloatABI = FloatABI::Default, + EABI EABIVersion = EABI::Default, StringRef ABIName = "", + VectorLibrary VecLib = VectorLibrary::NoLibrary); const RTLIB::RuntimeLibcallsInfo &getRTLCI(const Module &M) { ModuleAnalysisManager DummyMAM; diff --git a/llvm/include/llvm/CodeGen/LibcallLoweringInfo.h b/llvm/include/llvm/CodeGen/LibcallLoweringInfo.h index 8624fd2403a12..13225c072cf78 100644 --- a/llvm/include/llvm/CodeGen/LibcallLoweringInfo.h +++ b/llvm/include/llvm/CodeGen/LibcallLoweringInfo.h @@ -9,12 +9,16 @@ #ifndef LLVM_CODEGEN_LIBCALLLOWERINGINFO_H #define LLVM_CODEGEN_LIBCALLLOWERINGINFO_H +#include "llvm/ADT/DenseMap.h" #include "llvm/IR/RuntimeLibcalls.h" +#include "llvm/Pass.h" namespace llvm { class TargetSubtargetInfo; +class TargetMachine; +/// Tracks which library functions to use for a particular subtarget. class LibcallLoweringInfo { private: const RTLIB::RuntimeLibcallsInfo &RTLCI; @@ -73,6 +77,70 @@ class LibcallLoweringInfo { } }; +/// Record a mapping from subtarget to LibcallLoweringInfo. +class LibcallLoweringModuleAnalysisResult { +private: + using LibcallLoweringMap = + DenseMap; + mutable LibcallLoweringMap LoweringMap; + const RTLIB::RuntimeLibcallsInfo *RTLCI = nullptr; + +public: + LibcallLoweringModuleAnalysisResult() = default; + LibcallLoweringModuleAnalysisResult(RTLIB::RuntimeLibcallsInfo &RTLCI) + : RTLCI(&RTLCI) {} + + void init(const RTLIB::RuntimeLibcallsInfo *RT) { RTLCI = RT; } + + void clear() { + RTLCI = nullptr; + LoweringMap.clear(); + } + + LLVM_ABI bool invalidate(Module &, const PreservedAnalyses &, + ModuleAnalysisManager::Invalidator &); + + const LibcallLoweringInfo & + getLibcallLowering(const TargetSubtargetInfo &Subtarget) const { + return LoweringMap.try_emplace(&Subtarget, *RTLCI, Subtarget).first->second; + } +}; + +class LibcallLoweringModuleAnalysis + : public AnalysisInfoMixin { +private: + friend AnalysisInfoMixin; + LLVM_ABI static AnalysisKey Key; + + LibcallLoweringModuleAnalysisResult LibcallLoweringMap; + +public: + using Result = LibcallLoweringModuleAnalysisResult; + + LLVM_ABI Result run(Module &M, ModuleAnalysisManager &); +}; + +class LLVM_ABI LibcallLoweringInfoWrapper : public ImmutablePass { + LibcallLoweringModuleAnalysisResult Result; + +public: + static char ID; + LibcallLoweringInfoWrapper(); + + const LibcallLoweringInfo & + getLibcallLowering(const TargetSubtargetInfo &Subtarget) const { + return Result.getLibcallLowering(Subtarget); + } + + const LibcallLoweringModuleAnalysisResult &getResult() const { + return Result; + } + + bool doInitialization(Module &M) override; + void getAnalysisUsage(AnalysisUsage &AU) const override; + void releaseMemory() override; +}; + } // end namespace llvm #endif // LLVM_CODEGEN_LIBCALLLOWERINGINFO_H diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h index 10a4d8525a9e8..c718e29b99ff4 100644 --- a/llvm/include/llvm/InitializePasses.h +++ b/llvm/include/llvm/InitializePasses.h @@ -133,6 +133,7 @@ LLVM_ABI void initializeGlobalMergeFuncPassWrapperPass(PassRegistry &); LLVM_ABI void initializeGlobalMergePass(PassRegistry &); LLVM_ABI void initializeGlobalsAAWrapperPassPass(PassRegistry &); LLVM_ABI void initializeHardwareLoopsLegacyPass(PassRegistry &); +LLVM_ABI void initializeLibcallLoweringInfoWrapperPass(PassRegistry &); LLVM_ABI void initializeMIRProfileLoaderPassPass(PassRegistry &); LLVM_ABI void initializeIRSimilarityIdentifierWrapperPassPass(PassRegistry &); LLVM_ABI void initializeIRTranslatorPass(PassRegistry &); diff --git a/llvm/lib/Analysis/RuntimeLibcallInfo.cpp b/llvm/lib/Analysis/RuntimeLibcallInfo.cpp index 9ea789a4ee45a..1c5a1cc75b7bd 100644 --- a/llvm/lib/Analysis/RuntimeLibcallInfo.cpp +++ b/llvm/lib/Analysis/RuntimeLibcallInfo.cpp @@ -13,6 +13,15 @@ using namespace llvm; AnalysisKey RuntimeLibraryAnalysis::Key; +RuntimeLibraryAnalysis::RuntimeLibraryAnalysis(const Triple &TT, + ExceptionHandling ExceptionModel, + FloatABI::ABIType FloatABI, + EABI EABIVersion, + StringRef ABIName, + VectorLibrary VecLib) + : LibcallsInfo(std::in_place, TT, ExceptionModel, FloatABI, EABIVersion, + ABIName, VecLib) {} + RTLIB::RuntimeLibcallsInfo RuntimeLibraryAnalysis::run(const Module &M, ModuleAnalysisManager &) { if (!LibcallsInfo) @@ -26,6 +35,13 @@ INITIALIZE_PASS(RuntimeLibraryInfoWrapper, "runtime-library-info", RuntimeLibraryInfoWrapper::RuntimeLibraryInfoWrapper() : ImmutablePass(ID), RTLA(RTLIB::RuntimeLibcallsInfo(Triple())) {} +RuntimeLibraryInfoWrapper::RuntimeLibraryInfoWrapper( + const Triple &TT, ExceptionHandling ExceptionModel, + FloatABI::ABIType FloatABI, EABI EABIVersion, StringRef ABIName, + VectorLibrary VecLib) + : ImmutablePass(ID), RTLCI(std::in_place, TT, ExceptionModel, FloatABI, + EABIVersion, ABIName, VecLib) {} + char RuntimeLibraryInfoWrapper::ID = 0; ModulePass *llvm::createRuntimeLibraryInfoWrapperPass() { diff --git a/llvm/lib/CodeGen/CodeGen.cpp b/llvm/lib/CodeGen/CodeGen.cpp index 9795a0b707fd3..fe293c63fa762 100644 --- a/llvm/lib/CodeGen/CodeGen.cpp +++ b/llvm/lib/CodeGen/CodeGen.cpp @@ -57,6 +57,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) { initializeInterleavedLoadCombinePass(Registry); initializeInterleavedAccessPass(Registry); initializeJMCInstrumenterPass(Registry); + initializeLibcallLoweringInfoWrapperPass(Registry); initializeLiveDebugValuesLegacyPass(Registry); initializeLiveDebugVariablesWrapperLegacyPass(Registry); initializeLiveIntervalsWrapperPassPass(Registry); diff --git a/llvm/lib/CodeGen/ExpandFp.cpp b/llvm/lib/CodeGen/ExpandFp.cpp index f44eb227133ae..8ef926c2d2a34 100644 --- a/llvm/lib/CodeGen/ExpandFp.cpp +++ b/llvm/lib/CodeGen/ExpandFp.cpp @@ -991,7 +991,7 @@ static void addToWorklist(Instruction &I, } static bool runImpl(Function &F, const TargetLowering &TLI, - AssumptionCache *AC) { + const LibcallLoweringInfo &Libcalls, AssumptionCache *AC) { SmallVector Worklist; unsigned MaxLegalFpConvertBitWidth = @@ -1090,12 +1090,17 @@ class ExpandFpLegacyPass : public FunctionPass { bool runOnFunction(Function &F) override { auto *TM = &getAnalysis().getTM(); - auto *TLI = TM->getSubtargetImpl(F)->getTargetLowering(); + const TargetSubtargetInfo *Subtarget = TM->getSubtargetImpl(F); + auto *TLI = Subtarget->getTargetLowering(); AssumptionCache *AC = nullptr; + const LibcallLoweringInfo &Libcalls = + getAnalysis().getLibcallLowering( + *Subtarget); + if (OptLevel != CodeGenOptLevel::None && !F.hasOptNone()) AC = &getAnalysis().getAssumptionCache(F); - return runImpl(F, *TLI, AC); + return runImpl(F, *TLI, Libcalls, AC); } void getAnalysisUsage(AnalysisUsage &AU) const override { @@ -1104,6 +1109,7 @@ class ExpandFpLegacyPass : public FunctionPass { AU.addRequired(); AU.addPreserved(); AU.addPreserved(); + AU.addRequired(); } }; } // namespace @@ -1126,8 +1132,23 @@ PreservedAnalyses ExpandFpPass::run(Function &F, FunctionAnalysisManager &FAM) { AssumptionCache *AC = nullptr; if (OptLevel != CodeGenOptLevel::None) AC = &FAM.getResult(F); - return runImpl(F, TLI, AC) ? PreservedAnalyses::none() - : PreservedAnalyses::all(); + + auto &MAMProxy = FAM.getResult(F); + + const LibcallLoweringModuleAnalysisResult *LibcallLowering = + MAMProxy.getCachedResult(*F.getParent()); + + if (!LibcallLowering) { + F.getContext().emitError("'" + LibcallLoweringModuleAnalysis::name() + + "' analysis required"); + return PreservedAnalyses::all(); + } + + const LibcallLoweringInfo &Libcalls = + LibcallLowering->getLibcallLowering(*STI); + + return runImpl(F, TLI, Libcalls, AC) ? PreservedAnalyses::none() + : PreservedAnalyses::all(); } char ExpandFpLegacyPass::ID = 0; diff --git a/llvm/lib/CodeGen/LibcallLoweringInfo.cpp b/llvm/lib/CodeGen/LibcallLoweringInfo.cpp index 6f3607e8db824..0d54fac2422e2 100644 --- a/llvm/lib/CodeGen/LibcallLoweringInfo.cpp +++ b/llvm/lib/CodeGen/LibcallLoweringInfo.cpp @@ -7,7 +7,10 @@ //===----------------------------------------------------------------------===// #include "llvm/CodeGen/LibcallLoweringInfo.h" +#include "llvm/Analysis/RuntimeLibcallInfo.h" #include "llvm/CodeGen/TargetSubtargetInfo.h" +#include "llvm/InitializePasses.h" +#include "llvm/Target/TargetMachine.h" using namespace llvm; @@ -28,3 +31,42 @@ LibcallLoweringInfo::LibcallLoweringInfo( Subtarget.initLibcallLoweringInfo(*this); } + +AnalysisKey LibcallLoweringModuleAnalysis::Key; + +bool LibcallLoweringModuleAnalysisResult::invalidate( + Module &, const PreservedAnalyses &PA, + ModuleAnalysisManager::Invalidator &) { + // Passes that change the runtime libcall set must explicitly invalidate this + // pass. + auto PAC = PA.getChecker(); + return !PAC.preservedWhenStateless(); +} + +LibcallLoweringModuleAnalysisResult +LibcallLoweringModuleAnalysis::run(Module &M, ModuleAnalysisManager &MAM) { + LibcallLoweringMap.init(&MAM.getResult(M)); + return LibcallLoweringMap; +} + +INITIALIZE_PASS_BEGIN(LibcallLoweringInfoWrapper, "libcall-lowering-info", + "Library Function Lowering Analysis", false, true) +INITIALIZE_PASS_DEPENDENCY(RuntimeLibraryInfoWrapper) +INITIALIZE_PASS_END(LibcallLoweringInfoWrapper, "libcall-lowering-info", + "Library Function Lowering Analysis", false, true) + +char LibcallLoweringInfoWrapper::ID = 0; + +LibcallLoweringInfoWrapper::LibcallLoweringInfoWrapper() : ImmutablePass(ID) {} + +bool LibcallLoweringInfoWrapper::doInitialization(Module &M) { + Result.init(&getAnalysis().getRTLCI(M)); + return false; +} + +void LibcallLoweringInfoWrapper::getAnalysisUsage(AnalysisUsage &AU) const { + AU.addRequired(); + AU.setPreservesAll(); +} + +void LibcallLoweringInfoWrapper::releaseMemory() { Result.clear(); } diff --git a/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp b/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp index d738dc4eea36d..72c3c566163e2 100644 --- a/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp +++ b/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp @@ -17,6 +17,7 @@ #include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/Analysis/TargetTransformInfo.h" #include "llvm/CodeGen/ExpandVectorPredication.h" +#include "llvm/CodeGen/LibcallLoweringInfo.h" #include "llvm/CodeGen/Passes.h" #include "llvm/CodeGen/TargetLowering.h" #include "llvm/CodeGen/TargetPassConfig.h" @@ -51,6 +52,7 @@ namespace { struct PreISelIntrinsicLowering { const TargetMachine *TM; + const LibcallLoweringModuleAnalysisResult &ModuleLibcalls; const function_ref LookupTTI; const function_ref LookupTLI; @@ -61,11 +63,13 @@ struct PreISelIntrinsicLowering { explicit PreISelIntrinsicLowering( const TargetMachine *TM_, + const LibcallLoweringModuleAnalysisResult &ModuleLibcalls_, function_ref LookupTTI_, function_ref LookupTLI_, bool UseMemIntrinsicLibFunc_ = true) - : TM(TM_), LookupTTI(LookupTTI_), LookupTLI(LookupTLI_), - UseMemIntrinsicLibFunc(UseMemIntrinsicLibFunc_) {} + : TM(TM_), ModuleLibcalls(ModuleLibcalls_), LookupTTI(LookupTTI_), + LookupTLI(LookupTLI_), UseMemIntrinsicLibFunc(UseMemIntrinsicLibFunc_) { + } static bool shouldExpandMemIntrinsicWithSize(Value *Size, const TargetTransformInfo &TTI); @@ -230,21 +234,26 @@ bool PreISelIntrinsicLowering::shouldExpandMemIntrinsicWithSize( return SizeVal > Threshold || Threshold == 0; } -static bool canEmitLibcall(const TargetMachine *TM, Function *F, - RTLIB::Libcall LC) { +static bool +canEmitLibcall(const LibcallLoweringModuleAnalysisResult &ModuleLowering, + const TargetMachine *TM, Function *F, RTLIB::Libcall LC) { // TODO: Should this consider the address space of the memcpy? if (!TM) return true; - const TargetLowering *TLI = TM->getSubtargetImpl(*F)->getTargetLowering(); - return TLI->getLibcallName(LC) != nullptr; + const LibcallLoweringInfo &Lowering = + ModuleLowering.getLibcallLowering(*TM->getSubtargetImpl(*F)); + return Lowering.getLibcallImpl(LC) != RTLIB::Unsupported; } -static bool canEmitMemcpy(const TargetMachine *TM, Function *F) { +static bool +canEmitMemcpy(const LibcallLoweringModuleAnalysisResult &ModuleLowering, + const TargetMachine *TM, Function *F) { // TODO: Should this consider the address space of the memcpy? if (!TM) return true; - const TargetLowering *TLI = TM->getSubtargetImpl(*F)->getTargetLowering(); - return TLI->getMemcpyImpl() != RTLIB::Unsupported; + const LibcallLoweringInfo &Lowering = + ModuleLowering.getLibcallLowering(*TM->getSubtargetImpl(*F)); + return Lowering.getMemcpyImpl() != RTLIB::Unsupported; } // Return a value appropriate for use with the memset_pattern16 libcall, if @@ -317,7 +326,8 @@ bool PreISelIntrinsicLowering::expandMemIntrinsicUses( Function *ParentFunc = Memcpy->getFunction(); const TargetTransformInfo &TTI = LookupTTI(*ParentFunc); if (shouldExpandMemIntrinsicWithSize(Memcpy->getLength(), TTI)) { - if (UseMemIntrinsicLibFunc && canEmitMemcpy(TM, ParentFunc)) + if (UseMemIntrinsicLibFunc && + canEmitMemcpy(ModuleLibcalls, TM, ParentFunc)) break; // TODO: For optsize, emit the loop into a separate function @@ -349,7 +359,7 @@ bool PreISelIntrinsicLowering::expandMemIntrinsicUses( const TargetTransformInfo &TTI = LookupTTI(*ParentFunc); if (shouldExpandMemIntrinsicWithSize(Memmove->getLength(), TTI)) { if (UseMemIntrinsicLibFunc && - canEmitLibcall(TM, ParentFunc, RTLIB::MEMMOVE)) + canEmitLibcall(ModuleLibcalls, TM, ParentFunc, RTLIB::MEMMOVE)) break; if (expandMemMoveAsLoop(Memmove, TTI)) { @@ -366,7 +376,7 @@ bool PreISelIntrinsicLowering::expandMemIntrinsicUses( const TargetTransformInfo &TTI = LookupTTI(*ParentFunc); if (shouldExpandMemIntrinsicWithSize(Memset->getLength(), TTI)) { if (UseMemIntrinsicLibFunc && - canEmitLibcall(TM, ParentFunc, RTLIB::MEMSET)) + canEmitLibcall(ModuleLibcalls, TM, ParentFunc, RTLIB::MEMSET)) break; expandMemSetAsLoop(Memset); @@ -619,10 +629,14 @@ class PreISelIntrinsicLoweringLegacyPass : public ModulePass { void getAnalysisUsage(AnalysisUsage &AU) const override { AU.addRequired(); AU.addRequired(); + AU.addRequired(); AU.addRequired(); } bool runOnModule(Module &M) override { + const LibcallLoweringModuleAnalysisResult &ModuleLibcalls = + getAnalysis().getResult(); + auto LookupTTI = [this](Function &F) -> TargetTransformInfo & { return this->getAnalysis().getTTI(F); }; @@ -631,7 +645,7 @@ class PreISelIntrinsicLoweringLegacyPass : public ModulePass { }; const auto *TM = &getAnalysis().getTM(); - PreISelIntrinsicLowering Lowering(TM, LookupTTI, LookupTLI); + PreISelIntrinsicLowering Lowering(TM, ModuleLibcalls, LookupTTI, LookupTLI); return Lowering.lowerIntrinsics(M); } }; @@ -643,6 +657,8 @@ char PreISelIntrinsicLoweringLegacyPass::ID; INITIALIZE_PASS_BEGIN(PreISelIntrinsicLoweringLegacyPass, "pre-isel-intrinsic-lowering", "Pre-ISel Intrinsic Lowering", false, false) +INITIALIZE_PASS_DEPENDENCY(LibcallLoweringInfoWrapper) +INITIALIZE_PASS_DEPENDENCY(RuntimeLibraryInfoWrapper) INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass) INITIALIZE_PASS_DEPENDENCY(TargetPassConfig) INITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass) @@ -654,9 +670,12 @@ ModulePass *llvm::createPreISelIntrinsicLoweringPass() { return new PreISelIntrinsicLoweringLegacyPass(); } -PreservedAnalyses PreISelIntrinsicLoweringPass::run(Module &M, - ModuleAnalysisManager &AM) { - auto &FAM = AM.getResult(M).getManager(); +PreservedAnalyses +PreISelIntrinsicLoweringPass::run(Module &M, ModuleAnalysisManager &MAM) { + const LibcallLoweringModuleAnalysisResult &LibcallLowering = + MAM.getResult(M); + + auto &FAM = MAM.getResult(M).getManager(); auto LookupTTI = [&FAM](Function &F) -> TargetTransformInfo & { return FAM.getResult(F); @@ -665,7 +684,7 @@ PreservedAnalyses PreISelIntrinsicLoweringPass::run(Module &M, return FAM.getResult(F); }; - PreISelIntrinsicLowering Lowering(TM, LookupTTI, LookupTLI); + PreISelIntrinsicLowering Lowering(TM, LibcallLowering, LookupTTI, LookupTLI); if (!Lowering.lowerIntrinsics(M)) return PreservedAnalyses::all(); else diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def index 074c328ef0931..e9874ecd553ee 100644 --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -30,6 +30,7 @@ MODULE_ANALYSIS("ir2vec-vocab", IR2VecVocabAnalysis()) MODULE_ANALYSIS("ir-similarity", IRSimilarityAnalysis()) MODULE_ANALYSIS("last-run-tracking", LastRunTrackingAnalysis()) MODULE_ANALYSIS("lcg", LazyCallGraphAnalysis()) +MODULE_ANALYSIS("libcall-lowering-info", LibcallLoweringModuleAnalysis()) MODULE_ANALYSIS("module-summary", ModuleSummaryIndexAnalysis()) MODULE_ANALYSIS("no-op-module", NoOpModuleAnalysis()) MODULE_ANALYSIS("pass-instrumentation", PassInstrumentationAnalysis(PIC)) diff --git a/llvm/test/CodeGen/AArch64/O0-pipeline.ll b/llvm/test/CodeGen/AArch64/O0-pipeline.ll index abc67eec32391..96f5e5a4afb3e 100644 --- a/llvm/test/CodeGen/AArch64/O0-pipeline.ll +++ b/llvm/test/CodeGen/AArch64/O0-pipeline.ll @@ -5,9 +5,11 @@ ; CHECK-LABEL: Pass Arguments: ; CHECK-NEXT: Target Library Information +; CHECK-NEXT: Runtime Library Function Analysis ; CHECK-NEXT: Target Pass Configuration ; CHECK-NEXT: Machine Module Information ; CHECK-NEXT: Target Transform Information +; CHECK-NEXT: Library Function Lowering Analysis ; CHECK-NEXT: Create Garbage Collector Module Metadata ; CHECK-NEXT: Profile summary info ; CHECK-NEXT: Assumption Cache Tracker diff --git a/llvm/test/CodeGen/AArch64/O3-pipeline.ll b/llvm/test/CodeGen/AArch64/O3-pipeline.ll index e1481667a4ab7..2102029e608ab 100644 --- a/llvm/test/CodeGen/AArch64/O3-pipeline.ll +++ b/llvm/test/CodeGen/AArch64/O3-pipeline.ll @@ -5,9 +5,11 @@ ; CHECK-LABEL: Pass Arguments: ; CHECK-NEXT: Target Library Information +; CHECK-NEXT: Runtime Library Function Analysis ; CHECK-NEXT: Target Pass Configuration ; CHECK-NEXT: Machine Module Information ; CHECK-NEXT: Target Transform Information +; CHECK-NEXT: Library Function Lowering Analysis ; CHECK-NEXT: Assumption Cache Tracker ; CHECK-NEXT: Profile summary info ; CHECK-NEXT: Type-Based Alias Analysis diff --git a/llvm/test/CodeGen/AMDGPU/llc-pipeline.ll b/llvm/test/CodeGen/AMDGPU/llc-pipeline.ll index fe75b2b5bfcf5..02371abd5a570 100644 --- a/llvm/test/CodeGen/AMDGPU/llc-pipeline.ll +++ b/llvm/test/CodeGen/AMDGPU/llc-pipeline.ll @@ -14,9 +14,11 @@ ; REQUIRES: asserts ; GCN-O0:Target Library Information +; GCN-O0-NEXT:Runtime Library Function Analysis ; GCN-O0-NEXT:Target Pass Configuration ; GCN-O0-NEXT:Machine Module Information ; GCN-O0-NEXT:Target Transform Information +; GCN-O0-NEXT:Library Function Lowering Analysis ; GCN-O0-NEXT:Assumption Cache Tracker ; GCN-O0-NEXT:Profile summary info ; GCN-O0-NEXT:Argument Register Usage Information Storage @@ -162,9 +164,11 @@ ; GCN-O0-NEXT: Free MachineFunction ; GCN-O1:Target Library Information +; GCN-O1-NEXT:Runtime Library Function Analysis ; GCN-O1-NEXT:Target Pass Configuration ; GCN-O1-NEXT:Machine Module Information ; GCN-O1-NEXT:Target Transform Information +; GCN-O1-NEXT:Library Function Lowering Analysis ; GCN-O1-NEXT:Assumption Cache Tracker ; GCN-O1-NEXT:Profile summary info ; GCN-O1-NEXT:AMDGPU Address space based Alias Analysis @@ -455,9 +459,11 @@ ; GCN-O1-NEXT: Free MachineFunction ; GCN-O1-OPTS:Target Library Information +; GCN-O1-OPTS-NEXT:Runtime Library Function Analysis ; GCN-O1-OPTS-NEXT:Target Pass Configuration ; GCN-O1-OPTS-NEXT:Machine Module Information ; GCN-O1-OPTS-NEXT:Target Transform Information +; GCN-O1-OPTS-NEXT:Library Function Lowering Analysis ; GCN-O1-OPTS-NEXT:Assumption Cache Tracker ; GCN-O1-OPTS-NEXT:Profile summary info ; GCN-O1-OPTS-NEXT:AMDGPU Address space based Alias Analysis @@ -776,9 +782,11 @@ ; GCN-O1-OPTS-NEXT: Free MachineFunction ; GCN-O2:Target Library Information +; GCN-O2-NEXT:Runtime Library Function Analysis ; GCN-O2-NEXT:Target Pass Configuration ; GCN-O2-NEXT:Machine Module Information ; GCN-O2-NEXT:Target Transform Information +; GCN-O2-NEXT:Library Function Lowering Analysis ; GCN-O2-NEXT:Assumption Cache Tracker ; GCN-O2-NEXT:Profile summary info ; GCN-O2-NEXT:AMDGPU Address space based Alias Analysis @@ -1102,9 +1110,11 @@ ; GCN-O2-NEXT: Free MachineFunction ; GCN-O3:Target Library Information +; GCN-O3-NEXT:Runtime Library Function Analysis ; GCN-O3-NEXT:Target Pass Configuration ; GCN-O3-NEXT:Machine Module Information ; GCN-O3-NEXT:Target Transform Information +; GCN-O3-NEXT:Library Function Lowering Analysis ; GCN-O3-NEXT:Assumption Cache Tracker ; GCN-O3-NEXT:Profile summary info ; GCN-O3-NEXT:AMDGPU Address space based Alias Analysis diff --git a/llvm/test/CodeGen/LoongArch/O0-pipeline.ll b/llvm/test/CodeGen/LoongArch/O0-pipeline.ll index 9006b5c8d6fe1..5f4fccdd72b12 100644 --- a/llvm/test/CodeGen/LoongArch/O0-pipeline.ll +++ b/llvm/test/CodeGen/LoongArch/O0-pipeline.ll @@ -9,9 +9,11 @@ ; CHECK-LABEL: Pass Arguments: ; CHECK-NEXT: Target Library Information +; CHECK-NEXT: Runtime Library Function Analysis ; CHECK-NEXT: Target Pass Configuration ; CHECK-NEXT: Machine Module Information ; CHECK-NEXT: Target Transform Information +; CHECK-NEXT: Library Function Lowering Analysis ; CHECK-NEXT: Create Garbage Collector Module Metadata ; CHECK-NEXT: Assumption Cache Tracker ; CHECK-NEXT: Profile summary info diff --git a/llvm/test/CodeGen/LoongArch/opt-pipeline.ll b/llvm/test/CodeGen/LoongArch/opt-pipeline.ll index 661f67d4989c4..546ed6cec5c4a 100644 --- a/llvm/test/CodeGen/LoongArch/opt-pipeline.ll +++ b/llvm/test/CodeGen/LoongArch/opt-pipeline.ll @@ -17,9 +17,11 @@ ; LAXX-LABEL: Pass Arguments: ; LAXX-NEXT: Target Library Information +; LAXX-NEXT: Runtime Library Function Analysis ; LAXX-NEXT: Target Pass Configuration ; LAXX-NEXT: Machine Module Information ; LAXX-NEXT: Target Transform Information +; LAXX-NEXT: Library Function Lowering Analysis ; LAXX-NEXT: Assumption Cache Tracker ; LAXX-NEXT: Type-Based Alias Analysis ; LAXX-NEXT: Scoped NoAlias Alias Analysis diff --git a/llvm/test/CodeGen/PowerPC/O0-pipeline.ll b/llvm/test/CodeGen/PowerPC/O0-pipeline.ll index 38b1074e55d22..ac04be436f6a1 100644 --- a/llvm/test/CodeGen/PowerPC/O0-pipeline.ll +++ b/llvm/test/CodeGen/PowerPC/O0-pipeline.ll @@ -6,9 +6,11 @@ ; CHECK-LABEL: Pass Arguments: ; CHECK-NEXT: Target Library Information +; CHECK-NEXT: Runtime Library Function Analysis ; CHECK-NEXT: Target Pass Configuration ; CHECK-NEXT: Machine Module Information ; CHECK-NEXT: Target Transform Information +; CHECK-NEXT: Library Function Lowering Analysis ; CHECK-NEXT: Create Garbage Collector Module Metadata ; CHECK-NEXT: Assumption Cache Tracker ; CHECK-NEXT: Profile summary info diff --git a/llvm/test/CodeGen/PowerPC/O3-pipeline.ll b/llvm/test/CodeGen/PowerPC/O3-pipeline.ll index 7cbb1a1c98873..fd8fd5fa34a17 100644 --- a/llvm/test/CodeGen/PowerPC/O3-pipeline.ll +++ b/llvm/test/CodeGen/PowerPC/O3-pipeline.ll @@ -5,9 +5,11 @@ ; REQUIRES: asserts ; CHECK-LABEL: Pass Arguments: ; CHECK-NEXT: Target Library Information +; CHECK-NEXT: Runtime Library Function Analysis ; CHECK-NEXT: Target Pass Configuration ; CHECK-NEXT: Machine Module Information ; CHECK-NEXT: Target Transform Information +; CHECK-NEXT: Library Function Lowering Analysis ; CHECK-NEXT: Assumption Cache Tracker ; CHECK-NEXT: Type-Based Alias Analysis ; CHECK-NEXT: Scoped NoAlias Alias Analysis diff --git a/llvm/test/CodeGen/RISCV/O0-pipeline.ll b/llvm/test/CodeGen/RISCV/O0-pipeline.ll index 8714b286374a5..42d30fcef2a9b 100644 --- a/llvm/test/CodeGen/RISCV/O0-pipeline.ll +++ b/llvm/test/CodeGen/RISCV/O0-pipeline.ll @@ -9,9 +9,11 @@ ; CHECK-LABEL: Pass Arguments: ; CHECK-NEXT: Target Library Information +; CHECK-NEXT: Runtime Library Function Analysis ; CHECK-NEXT: Target Pass Configuration ; CHECK-NEXT: Machine Module Information ; CHECK-NEXT: Target Transform Information +; CHECK-NEXT: Library Function Lowering Analysis ; CHECK-NEXT: Create Garbage Collector Module Metadata ; CHECK-NEXT: Assumption Cache Tracker ; CHECK-NEXT: Profile summary info diff --git a/llvm/test/CodeGen/RISCV/O3-pipeline.ll b/llvm/test/CodeGen/RISCV/O3-pipeline.ll index 769823d1c4216..3d8d89c5df54b 100644 --- a/llvm/test/CodeGen/RISCV/O3-pipeline.ll +++ b/llvm/test/CodeGen/RISCV/O3-pipeline.ll @@ -9,9 +9,11 @@ ; CHECK-LABEL: Pass Arguments: ; CHECK-NEXT: Target Library Information +; CHECK-NEXT: Runtime Library Function Analysis ; CHECK-NEXT: Target Pass Configuration ; CHECK-NEXT: Machine Module Information ; CHECK-NEXT: Target Transform Information +; CHECK-NEXT: Library Function Lowering Analysis ; CHECK-NEXT: Assumption Cache Tracker ; CHECK-NEXT: Profile summary info ; CHECK-NEXT: Type-Based Alias Analysis diff --git a/llvm/test/CodeGen/SPIRV/llc-pipeline.ll b/llvm/test/CodeGen/SPIRV/llc-pipeline.ll index 6db375445e4a3..3a1d0f7b5d218 100644 --- a/llvm/test/CodeGen/SPIRV/llc-pipeline.ll +++ b/llvm/test/CodeGen/SPIRV/llc-pipeline.ll @@ -11,9 +11,11 @@ ; REQUIRES:asserts ; SPIRV-O0:Target Library Information +; SPIRV-O0-NEXT:Runtime Library Function Analysis ; SPIRV-O0-NEXT:Target Pass Configuration ; SPIRV-O0-NEXT:Machine Module Information ; SPIRV-O0-NEXT:Target Transform Information +; SPIRV-O0-NEXT:Library Function Lowering Analysis ; SPIRV-O0-NEXT:Create Garbage Collector Module Metadata ; SPIRV-O0-NEXT:Assumption Cache Tracker ; SPIRV-O0-NEXT:Profile summary info @@ -83,9 +85,11 @@ ; SPIRV-O0-NEXT: Free MachineFunction ; SPIRV-Opt:Target Library Information +; SPIRV-Opt-NEXT:Runtime Library Function Analysis ; SPIRV-Opt-NEXT:Target Pass Configuration ; SPIRV-Opt-NEXT:Machine Module Information ; SPIRV-Opt-NEXT:Target Transform Information +; SPIRV-Opt-NEXT:Library Function Lowering Analysis ; SPIRV-Opt-NEXT:Assumption Cache Tracker ; SPIRV-Opt-NEXT:Type-Based Alias Analysis ; SPIRV-Opt-NEXT:Scoped NoAlias Alias Analysis diff --git a/llvm/test/CodeGen/X86/O0-pipeline.ll b/llvm/test/CodeGen/X86/O0-pipeline.ll index 78a02b11b17bb..9223348abbcb9 100644 --- a/llvm/test/CodeGen/X86/O0-pipeline.ll +++ b/llvm/test/CodeGen/X86/O0-pipeline.ll @@ -7,9 +7,11 @@ ; CHECK-LABEL: Pass Arguments: ; CHECK-NEXT: Target Library Information +; CHECK-NEXT: Runtime Library Function Analysis ; CHECK-NEXT: Target Pass Configuration ; CHECK-NEXT: Machine Module Information ; CHECK-NEXT: Target Transform Information +; CHECK-NEXT: Library Function Lowering Analysis ; CHECK-NEXT: Create Garbage Collector Module Metadata ; CHECK-NEXT: Assumption Cache Tracker ; CHECK-NEXT: Profile summary info diff --git a/llvm/test/CodeGen/X86/opt-pipeline.ll b/llvm/test/CodeGen/X86/opt-pipeline.ll index 276232e27c000..9f08658e067ab 100644 --- a/llvm/test/CodeGen/X86/opt-pipeline.ll +++ b/llvm/test/CodeGen/X86/opt-pipeline.ll @@ -13,9 +13,11 @@ ; CHECK-LABEL: Pass Arguments: ; CHECK-NEXT: Target Library Information +; CHECK-NEXT: Runtime Library Function Analysis ; CHECK-NEXT: Target Pass Configuration ; CHECK-NEXT: Machine Module Information ; CHECK-NEXT: Target Transform Information +; CHECK-NEXT: Library Function Lowering Analysis ; CHECK-NEXT: Assumption Cache Tracker ; CHECK-NEXT: Type-Based Alias Analysis ; CHECK-NEXT: Scoped NoAlias Alias Analysis diff --git a/llvm/test/Transforms/ExpandFp/AMDGPU/frem-inf.ll b/llvm/test/Transforms/ExpandFp/AMDGPU/frem-inf.ll index f70f0d25f172d..54ece8d52f08a 100644 --- a/llvm/test/Transforms/ExpandFp/AMDGPU/frem-inf.ll +++ b/llvm/test/Transforms/ExpandFp/AMDGPU/frem-inf.ll @@ -1,5 +1,5 @@ -; RUN: opt -mtriple=amdgcn -passes="expand-fp" %s -S -o - | FileCheck --check-prefixes CHECK %s -; RUN: opt -mtriple=amdgcn -passes="expand-fp" %s -S -o - | FileCheck --check-prefixes CHECK,OPT1 %s +; RUN: opt -mtriple=amdgcn -passes="require,expand-fp" %s -S -o - | FileCheck --check-prefixes CHECK %s +; RUN: opt -mtriple=amdgcn -passes="require,expand-fp" %s -S -o - | FileCheck --check-prefixes CHECK,OPT1 %s ; Check the handling of potentially infinite numerators in the frem ; expansion at different optimization levels and with different diff --git a/llvm/test/Transforms/ExpandFp/AMDGPU/frem.ll b/llvm/test/Transforms/ExpandFp/AMDGPU/frem.ll index 4c0f9db147c96..5cd6f1e8a6086 100644 --- a/llvm/test/Transforms/ExpandFp/AMDGPU/frem.ll +++ b/llvm/test/Transforms/ExpandFp/AMDGPU/frem.ll @@ -1,5 +1,5 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 -; RUN: opt -mtriple=amdgcn -passes="expand-fp" %s -S -o - | FileCheck %s +; RUN: opt -mtriple=amdgcn -passes="require,expand-fp" %s -S -o - | FileCheck %s define amdgpu_kernel void @frem_f16(ptr addrspace(1) %out, ptr addrspace(1) %in1, ; CHECK-LABEL: define amdgpu_kernel void @frem_f16( diff --git a/llvm/test/Transforms/ExpandFp/AMDGPU/missing-analysis.ll b/llvm/test/Transforms/ExpandFp/AMDGPU/missing-analysis.ll new file mode 100644 index 0000000000000..2d5f2a7223e3a --- /dev/null +++ b/llvm/test/Transforms/ExpandFp/AMDGPU/missing-analysis.ll @@ -0,0 +1,6 @@ +; RUN: not opt -mtriple=amdgcn -passes=expand-fp -disable-output %s 2>&1 | FileCheck %s + +; CHECK: 'LibcallLoweringModuleAnalysis' analysis required +define void @empty() { + ret void +} diff --git a/llvm/test/Transforms/ExpandFp/AMDGPU/pass-parameters.ll b/llvm/test/Transforms/ExpandFp/AMDGPU/pass-parameters.ll index 03cafd4ff1160..794d5805291b0 100644 --- a/llvm/test/Transforms/ExpandFp/AMDGPU/pass-parameters.ll +++ b/llvm/test/Transforms/ExpandFp/AMDGPU/pass-parameters.ll @@ -1,18 +1,18 @@ -; RUN: opt -mtriple=amdgcn -passes="expand-fp" %s -S -o /dev/null -; RUN: opt -mtriple=amdgcn -passes="expand-fp" %s -S -o /dev/null -; RUN: opt -mtriple=amdgcn -passes="expand-fp" %s -S -o /dev/null -; RUN: opt -mtriple=amdgcn -passes="expand-fp" %s -S -o /dev/null +; RUN: opt -mtriple=amdgcn -passes="require,expand-fp" %s -S -disable-output +; RUN: opt -mtriple=amdgcn -passes="require,expand-fp" %s -S -disable-output +; RUN: opt -mtriple=amdgcn -passes="require,expand-fp" %s -S -disable-output +; RUN: opt -mtriple=amdgcn -passes="require,expand-fp" %s -S -disable-output -; RUN: not opt -mtriple=amdgcn -passes="expand-fp" %s -S -o /dev/null 2>&1 | FileCheck --check-prefix=TOO-LARGE %s +; RUN: not opt -mtriple=amdgcn -passes="require,expand-fp" %s -S -disable-output 2>&1 | FileCheck --check-prefix=TOO-LARGE %s ; TOO-LARGE: {{.*}}invalid optimization level for expand-fp pass: 4 -; RUN: not opt -mtriple=amdgcn -passes="expand-fp" %s -S -o /dev/null 2>&1 | FileCheck --check-prefix=NON-NUMERIC %s +; RUN: not opt -mtriple=amdgcn -passes="require,expand-fp" %s -S -disable-output 2>&1 | FileCheck --check-prefix=NON-NUMERIC %s ; NON-NUMERIC: {{.*}}invalid expand-fp pass parameter -; RUN: not opt -mtriple=amdgcn -passes="expand-fp" %s -S -o /dev/null 2>&1 | FileCheck --check-prefix=NEGATIVE %s +; RUN: not opt -mtriple=amdgcn -passes="require,expand-fp" %s -S -disable-output 2>&1 | FileCheck --check-prefix=NEGATIVE %s ; NEGATIVE: {{.*}}invalid expand-fp pass parameter 'O-1' -; RUN: not opt -mtriple=amdgcn -passes="expand-fp" %s -S -o /dev/null 2>&1 | FileCheck --check-prefix=NO-O-PREFIX %s +; RUN: not opt -mtriple=amdgcn -passes="require,expand-fp" %s -S -disable-output 2>&1 | FileCheck --check-prefix=NO-O-PREFIX %s ; NO-O-PREFIX: {{.*}}invalid expand-fp pass parameter 'foo' define void @empty() { diff --git a/llvm/test/Transforms/ExpandLargeFpConvert/X86/expand-large-fp-convert-fptosi129.ll b/llvm/test/Transforms/ExpandLargeFpConvert/X86/expand-large-fp-convert-fptosi129.ll index f5bf8bb61a16e..0cf8829aec037 100644 --- a/llvm/test/Transforms/ExpandLargeFpConvert/X86/expand-large-fp-convert-fptosi129.ll +++ b/llvm/test/Transforms/ExpandLargeFpConvert/X86/expand-large-fp-convert-fptosi129.ll @@ -1,6 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -S -mtriple=x86_64-- --expand-fp < %s | FileCheck %s -; RUN: opt -S -mtriple=x86_64-- -passes=expand-fp < %s | FileCheck %s +; RUN: opt -S -mtriple=x86_64-- -passes='require,expand-fp' < %s | FileCheck %s define i129 @halftosi129(half %a) { ; CHECK-LABEL: @halftosi129( diff --git a/llvm/test/Transforms/ExpandLargeFpConvert/X86/expand-large-fp-convert-fptoui129.ll b/llvm/test/Transforms/ExpandLargeFpConvert/X86/expand-large-fp-convert-fptoui129.ll index 94ed32abe46f8..055e3e0dc261d 100644 --- a/llvm/test/Transforms/ExpandLargeFpConvert/X86/expand-large-fp-convert-fptoui129.ll +++ b/llvm/test/Transforms/ExpandLargeFpConvert/X86/expand-large-fp-convert-fptoui129.ll @@ -1,6 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -S -mtriple=x86_64-- --expand-fp < %s | FileCheck %s -; RUN: opt -S -mtriple=x86_64-- -passes=expand-fp < %s | FileCheck %s +; RUN: opt -S -mtriple=x86_64-- -passes='require,expand-fp' < %s | FileCheck %s define i129 @halftoui129(half %a) { ; CHECK-LABEL: @halftoui129( diff --git a/llvm/test/Transforms/ExpandLargeFpConvert/X86/expand-large-fp-convert-si129tofp.ll b/llvm/test/Transforms/ExpandLargeFpConvert/X86/expand-large-fp-convert-si129tofp.ll index 8820b873f3818..af053e82a62a4 100644 --- a/llvm/test/Transforms/ExpandLargeFpConvert/X86/expand-large-fp-convert-si129tofp.ll +++ b/llvm/test/Transforms/ExpandLargeFpConvert/X86/expand-large-fp-convert-si129tofp.ll @@ -1,6 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -S -mtriple=x86_64-- --expand-fp < %s | FileCheck %s -; RUN: opt -S -mtriple=x86_64-- -passes=expand-fp < %s | FileCheck %s +; RUN: opt -S -mtriple=x86_64-- -passes='require,expand-fp' < %s | FileCheck %s define half @si129tohalf(i129 %a) { ; CHECK-LABEL: @si129tohalf( diff --git a/llvm/test/Transforms/ExpandLargeFpConvert/X86/expand-large-fp-convert-ui129tofp.ll b/llvm/test/Transforms/ExpandLargeFpConvert/X86/expand-large-fp-convert-ui129tofp.ll index b58d88bc02c79..ede9b2a4cd049 100644 --- a/llvm/test/Transforms/ExpandLargeFpConvert/X86/expand-large-fp-convert-ui129tofp.ll +++ b/llvm/test/Transforms/ExpandLargeFpConvert/X86/expand-large-fp-convert-ui129tofp.ll @@ -1,6 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -S -mtriple=x86_64-- --expand-fp < %s | FileCheck %s -; RUN: opt -S -mtriple=x86_64-- -passes=expand-fp < %s | FileCheck %s +; RUN: opt -S -mtriple=x86_64-- -passes='require,expand-fp' < %s | FileCheck %s define half @ui129tohalf(i129 %a) { ; CHECK-LABEL: @ui129tohalf( diff --git a/llvm/test/Transforms/ExpandLargeFpConvert/X86/expand-large-fp-optnone.ll b/llvm/test/Transforms/ExpandLargeFpConvert/X86/expand-large-fp-optnone.ll index 78bc0006fda23..e78eaeb70fbf1 100644 --- a/llvm/test/Transforms/ExpandLargeFpConvert/X86/expand-large-fp-optnone.ll +++ b/llvm/test/Transforms/ExpandLargeFpConvert/X86/expand-large-fp-optnone.ll @@ -1,6 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 ; RUN: opt -S -mtriple=x86_64-- --expand-fp < %s | FileCheck %s -; RUN: opt -S -mtriple=x86_64-- -passes=expand-fp < %s | FileCheck %s +; RUN: opt -S -mtriple=x86_64-- -passes='require,expand-fp' < %s | FileCheck %s ; expand-fp must also run with optnone diff --git a/llvm/tools/llc/NewPMDriver.cpp b/llvm/tools/llc/NewPMDriver.cpp index fa82689ecf9ae..c01aa30779276 100644 --- a/llvm/tools/llc/NewPMDriver.cpp +++ b/llvm/tools/llc/NewPMDriver.cpp @@ -14,8 +14,10 @@ #include "NewPMDriver.h" #include "llvm/Analysis/CGSCCPassManager.h" +#include "llvm/Analysis/RuntimeLibcallInfo.h" #include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/CodeGen/CommandFlags.h" +#include "llvm/CodeGen/LibcallLoweringInfo.h" #include "llvm/CodeGen/MIRParser/MIRParser.h" #include "llvm/CodeGen/MIRPrinter.h" #include "llvm/CodeGen/MachineFunctionAnalysis.h" @@ -129,6 +131,16 @@ int llvm::compileModuleWithNewPM( SI.registerCallbacks(PIC, &MAM); FAM.registerPass([&] { return TargetLibraryAnalysis(TLII); }); + + MAM.registerPass([&] { + const TargetOptions &Options = Target->Options; + return RuntimeLibraryAnalysis( + M->getTargetTriple(), Target->Options.ExceptionModel, + Target->Options.FloatABIType, Target->Options.EABIVersion, + Options.MCOptions.ABIName, Target->Options.VecLib); + }); + MAM.registerPass([&] { return LibcallLoweringModuleAnalysis(); }); + MAM.registerPass([&] { return MachineModuleAnalysis(MMI); }); ModulePassManager MPM; diff --git a/llvm/tools/llc/llc.cpp b/llvm/tools/llc/llc.cpp index ce1ce5d68c137..90fc0a994cd83 100644 --- a/llvm/tools/llc/llc.cpp +++ b/llvm/tools/llc/llc.cpp @@ -16,6 +16,7 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/ScopeExit.h" #include "llvm/ADT/Statistic.h" +#include "llvm/Analysis/RuntimeLibcallInfo.h" #include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/CodeGen/CommandFlags.h" #include "llvm/CodeGen/LinkAllAsmWriterComponents.h" @@ -729,6 +730,10 @@ static int compileModule(char **argv, LLVMContext &Context, // Build up all of the passes that we want to do to the module. legacy::PassManager PM; PM.add(new TargetLibraryInfoWrapperPass(TLII)); + PM.add(new RuntimeLibraryInfoWrapper( + M->getTargetTriple(), Target->Options.ExceptionModel, + Target->Options.FloatABIType, Target->Options.EABIVersion, + Options.MCOptions.ABIName, Target->Options.VecLib)); { raw_pwrite_stream *OS = &Out->os(); diff --git a/llvm/tools/opt/NewPMDriver.cpp b/llvm/tools/opt/NewPMDriver.cpp index 01d7ac8e3f959..3209b652b44b4 100644 --- a/llvm/tools/opt/NewPMDriver.cpp +++ b/llvm/tools/opt/NewPMDriver.cpp @@ -21,6 +21,7 @@ #include "llvm/Analysis/RuntimeLibcallInfo.h" #include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/Bitcode/BitcodeWriterPass.h" +#include "llvm/CodeGen/LibcallLoweringInfo.h" #include "llvm/Config/llvm-config.h" #include "llvm/IR/Dominators.h" #include "llvm/IR/LLVMContext.h" @@ -352,9 +353,9 @@ static void registerEPCallbacks(PassBuilder &PB) { bool llvm::runPassPipeline( StringRef Arg0, Module &M, TargetMachine *TM, TargetLibraryInfoImpl *TLII, - RTLIB::RuntimeLibcallsInfo &RTLCI, ToolOutputFile *Out, - ToolOutputFile *ThinLTOLinkOut, ToolOutputFile *OptRemarkFile, - StringRef PassPipeline, ArrayRef PassPlugins, + ToolOutputFile *Out, ToolOutputFile *ThinLTOLinkOut, + ToolOutputFile *OptRemarkFile, StringRef PassPipeline, + ArrayRef PassPlugins, ArrayRef> PassBuilderCallbacks, OutputKind OK, VerifierKind VK, bool ShouldPreserveAssemblyUseListOrder, bool ShouldPreserveBitcodeUseListOrder, bool EmitSummaryIndex, @@ -410,14 +411,24 @@ bool llvm::runPassPipeline( P->CSAction = PGOOptions::CSIRUse; } } - if (TM) - TM->setPGOOption(P); LoopAnalysisManager LAM; FunctionAnalysisManager FAM; CGSCCAnalysisManager CGAM; ModuleAnalysisManager MAM; - MAM.registerPass([&] { return RuntimeLibraryAnalysis(std::move(RTLCI)); }); + + if (TM) { + TM->setPGOOption(P); + + MAM.registerPass([&] { + const TargetOptions &Options = TM->Options; + return RuntimeLibraryAnalysis(M.getTargetTriple(), Options.ExceptionModel, + Options.FloatABIType, Options.EABIVersion, + Options.MCOptions.ABIName, Options.VecLib); + }); + + MAM.registerPass([&] { return LibcallLoweringModuleAnalysis(); }); + } PassInstrumentationCallbacks PIC; PrintPassOptions PrintPassOpts; diff --git a/llvm/tools/opt/NewPMDriver.h b/llvm/tools/opt/NewPMDriver.h index 31da61b9c0cae..042d5d4bbfe47 100644 --- a/llvm/tools/opt/NewPMDriver.h +++ b/llvm/tools/opt/NewPMDriver.h @@ -31,10 +31,6 @@ class TargetMachine; class ToolOutputFile; class TargetLibraryInfoImpl; -namespace RTLIB { -struct RuntimeLibcallsInfo; -} - extern cl::opt DebugifyEach; extern cl::opt DebugifyExport; @@ -71,9 +67,9 @@ void printPasses(raw_ostream &OS); /// nullptr. bool runPassPipeline( StringRef Arg0, Module &M, TargetMachine *TM, TargetLibraryInfoImpl *TLII, - RTLIB::RuntimeLibcallsInfo &RTLCI, ToolOutputFile *Out, - ToolOutputFile *ThinLinkOut, ToolOutputFile *OptRemarkFile, - StringRef PassPipeline, ArrayRef PassPlugins, + ToolOutputFile *Out, ToolOutputFile *ThinLinkOut, + ToolOutputFile *OptRemarkFile, StringRef PassPipeline, + ArrayRef PassPlugins, ArrayRef> PassBuilderCallbacks, opt_tool::OutputKind OK, opt_tool::VerifierKind VK, bool ShouldPreserveAssemblyUseListOrder, diff --git a/llvm/tools/opt/optdriver.cpp b/llvm/tools/opt/optdriver.cpp index d24c8abef31d0..d953521a0a6a1 100644 --- a/llvm/tools/opt/optdriver.cpp +++ b/llvm/tools/opt/optdriver.cpp @@ -674,12 +674,6 @@ optMain(int argc, char **argv, // Add an appropriate TargetLibraryInfo pass for the module's triple. TargetLibraryInfoImpl TLII(ModuleTriple, VecLib); - RTLIB::RuntimeLibcallsInfo RTLCI(ModuleTriple, codegen::getExceptionModel(), - codegen::getFloatABIForCalls(), - codegen::getEABIVersion(), - "", // FIXME: Get ABI name from MCOptions - VecLib); - // The -disable-simplify-libcalls flag actually disables all builtin optzns. if (DisableSimplifyLibCalls) TLII.disableAllFunctions(); @@ -754,7 +748,7 @@ optMain(int argc, char **argv, // string. Hand off the rest of the functionality to the new code for that // layer. if (!runPassPipeline( - argv[0], *M, TM.get(), &TLII, RTLCI, Out.get(), ThinLinkOut.get(), + argv[0], *M, TM.get(), &TLII, Out.get(), ThinLinkOut.get(), RemarksFile.get(), Pipeline, PluginList, PassBuilderCallbacks, OK, VK, /* ShouldPreserveAssemblyUseListOrder */ false, /* ShouldPreserveBitcodeUseListOrder */ true, EmitSummaryIndex,