From 7cd747dfb173f5b73bbc573c79bfb630cc0fb919 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Sat, 25 Oct 2025 22:38:27 +0900 Subject: [PATCH] CodeGen: Add LibcallLoweringInfo analysis pass The libcall lowering decisions should be program dependent, depending on the current module's RuntimeLibcallInfo. We need another related analysis derived from that plus the current function's subtarget to provide concrete lowering decisions. This takes on a somewhat unusual form. It's a Module analysis, with a lookup keyed on the subtarget. This is a separate module analysis from RuntimeLibraryAnalysis to avoid that depending on codegen. It's not a function pass to avoid depending on any particular function, to avoid repeated subtarget map lookups in most of the use passes, and to avoid any recomputation in the common case of one subtarget (and keeps it reusable across repeated compilations). This also switches ExpandFp and PreISelIntrinsicLowering as a sample function and module pass. Note this is not yet wired up to SelectionDAG, which is still using the LibcallLoweringInfo constructed inside of TargetLowering. --- clang/lib/CodeGen/BackendUtil.cpp | 6 ++ .../llvm/Analysis/RuntimeLibcallInfo.h | 15 +++- .../llvm/CodeGen/LibcallLoweringInfo.h | 68 +++++++++++++++++++ llvm/include/llvm/InitializePasses.h | 1 + llvm/lib/Analysis/RuntimeLibcallInfo.cpp | 16 +++++ llvm/lib/CodeGen/CodeGen.cpp | 1 + llvm/lib/CodeGen/ExpandFp.cpp | 31 +++++++-- llvm/lib/CodeGen/LibcallLoweringInfo.cpp | 42 ++++++++++++ llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp | 53 ++++++++++----- llvm/lib/Passes/PassRegistry.def | 1 + llvm/test/CodeGen/AArch64/O0-pipeline.ll | 2 + llvm/test/CodeGen/AArch64/O3-pipeline.ll | 2 + llvm/test/CodeGen/AMDGPU/llc-pipeline.ll | 10 +++ llvm/test/CodeGen/LoongArch/O0-pipeline.ll | 2 + llvm/test/CodeGen/LoongArch/opt-pipeline.ll | 2 + llvm/test/CodeGen/PowerPC/O0-pipeline.ll | 2 + llvm/test/CodeGen/PowerPC/O3-pipeline.ll | 2 + llvm/test/CodeGen/RISCV/O0-pipeline.ll | 2 + llvm/test/CodeGen/RISCV/O3-pipeline.ll | 2 + llvm/test/CodeGen/SPIRV/llc-pipeline.ll | 4 ++ llvm/test/CodeGen/X86/O0-pipeline.ll | 2 + llvm/test/CodeGen/X86/opt-pipeline.ll | 2 + .../Transforms/ExpandFp/AMDGPU/frem-inf.ll | 4 +- llvm/test/Transforms/ExpandFp/AMDGPU/frem.ll | 2 +- .../ExpandFp/AMDGPU/missing-analysis.ll | 6 ++ .../ExpandFp/AMDGPU/pass-parameters.ll | 16 ++--- .../X86/expand-large-fp-convert-fptosi129.ll | 2 +- .../X86/expand-large-fp-convert-fptoui129.ll | 2 +- .../X86/expand-large-fp-convert-si129tofp.ll | 2 +- .../X86/expand-large-fp-convert-ui129tofp.ll | 2 +- .../X86/expand-large-fp-optnone.ll | 2 +- llvm/tools/llc/NewPMDriver.cpp | 12 ++++ llvm/tools/llc/llc.cpp | 5 ++ llvm/tools/opt/NewPMDriver.cpp | 23 +++++-- llvm/tools/opt/NewPMDriver.h | 10 +-- llvm/tools/opt/optdriver.cpp | 8 +-- 36 files changed, 303 insertions(+), 61 deletions(-) create mode 100644 llvm/test/Transforms/ExpandFp/AMDGPU/missing-analysis.ll 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,