https://github.com/arsenm created https://github.com/llvm/llvm-project/pull/176800
Previously this was taking a duplicate copy of this information from TargetLowering. This moves the bulk of libcall checks to use the new analysis. There are still a few straggler uses in misc. passes in a few backends (mainly AArch64 has some libcall emission in FinalizeISel and PrologEpilogInserter). >From 4b36f42da3350353bee08124f19e14c35bbbfcb1 Mon Sep 17 00:00:00 2001 From: Matt Arsenault <[email protected]> Date: Mon, 19 Jan 2026 17:15:46 +0100 Subject: [PATCH] DAG: Take LibcallLoweringInfo from analysis Previously this was taking a duplicate copy of this information from TargetLowering. This moves the bulk of libcall checks to use the new analysis. There are still a few straggler uses in misc. passes in a few backends (mainly AArch64 has some libcall emission in FinalizeISel and PrologEpilogInserter). --- llvm/include/llvm/CodeGen/SelectionDAGISel.h | 1 + llvm/include/llvm/Passes/CodeGenPassBuilder.h | 3 ++ .../CodeGen/SelectionDAG/SelectionDAGISel.cpp | 45 ++++++++++++------- llvm/test/CodeGen/AMDGPU/llc-pipeline-npm.ll | 3 ++ llvm/test/CodeGen/X86/llc-pipeline-npm.ll | 4 ++ 5 files changed, 40 insertions(+), 16 deletions(-) diff --git a/llvm/include/llvm/CodeGen/SelectionDAGISel.h b/llvm/include/llvm/CodeGen/SelectionDAGISel.h index c1467cfb81bdc..c94dc4241368e 100644 --- a/llvm/include/llvm/CodeGen/SelectionDAGISel.h +++ b/llvm/include/llvm/CodeGen/SelectionDAGISel.h @@ -46,6 +46,7 @@ class SelectionDAGISel { public: TargetMachine &TM; const TargetLibraryInfo *LibInfo; + const LibcallLoweringInfo *LibcallLowering; std::unique_ptr<FunctionLoweringInfo> FuncInfo; std::unique_ptr<SwiftErrorValueTracking> SwiftError; diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h b/llvm/include/llvm/Passes/CodeGenPassBuilder.h index 005b695741903..83b3f4f8b5720 100644 --- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h +++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h @@ -581,6 +581,9 @@ Error CodeGenPassBuilder<Derived, TargetMachineT>::buildPipeline( /*Force=*/true); addModulePass(RequireAnalysisPass<RuntimeLibraryAnalysis, Module>(), PMW, /*Force=*/true); + addModulePass(RequireAnalysisPass<LibcallLoweringModuleAnalysis, Module>(), + PMW, + /*Force=*/true); addISelPasses(PMW); flushFPMsToMPM(PMW); diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index b8e18dd4b0241..14c70751442db 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -437,6 +437,9 @@ void SelectionDAGISelLegacy::getAnalysisUsage(AnalysisUsage &AU) const { AU.addPreserved<AssignmentTrackingAnalysis>(); if (RegisterPGOPasses) LazyBlockFrequencyInfoPass::getLazyBFIAnalysisUsage(AU); + + AU.addRequired<LibcallLoweringInfoWrapper>(); + MachineFunctionPass::getAnalysisUsage(AU); } @@ -489,9 +492,10 @@ void SelectionDAGISel::initializeAnalysisResults( (void)MatchFilterFuncName; #endif + const TargetSubtargetInfo &Subtarget = MF->getSubtarget(); bool RegisterPGOPasses = maintainPGOProfile(TM, OptLevel); - TII = MF->getSubtarget().getInstrInfo(); - TLI = MF->getSubtarget().getTargetLowering(); + TII = Subtarget.getInstrInfo(); + TLI = Subtarget.getTargetLowering(); RegInfo = &MF->getRegInfo(); LibInfo = &FAM.getResult<TargetLibraryAnalysis>(Fn); @@ -512,9 +516,16 @@ void SelectionDAGISel::initializeAnalysisResults( MachineModuleInfo &MMI = MAMP.getCachedResult<MachineModuleAnalysis>(*Fn.getParent())->getMMI(); - CurDAG->init(*MF, *ORE, MFAM, LibInfo, - &TLI->getLibcallLoweringInfo(), // FIXME: Take from analysis - UA, PSI, BFI, MMI, FnVarLocs); + const LibcallLoweringModuleAnalysisResult *LibcallResult = + MAMP.getCachedResult<LibcallLoweringModuleAnalysis>(*Fn.getParent()); + if (!LibcallResult) { + reportFatalUsageError("'" + LibcallLoweringModuleAnalysis::name() + + "' analysis required"); + } + + LibcallLowering = &LibcallResult->getLibcallLowering(Subtarget); + CurDAG->init(*MF, *ORE, MFAM, LibInfo, LibcallLowering, UA, PSI, BFI, MMI, + FnVarLocs); // Now get the optional analyzes if we want to. // This is based on the possibly changed OptLevel (after optnone is taken @@ -535,7 +546,7 @@ void SelectionDAGISel::initializeAnalysisResults( TTI = &FAM.getResult<TargetIRAnalysis>(Fn); - HwMode = MF->getSubtarget().getHwMode(); + HwMode = Subtarget.getHwMode(); } void SelectionDAGISel::initializeAnalysisResults(MachineFunctionPass &MFP) { @@ -547,9 +558,11 @@ void SelectionDAGISel::initializeAnalysisResults(MachineFunctionPass &MFP) { (void)MatchFilterFuncName; #endif + const TargetSubtargetInfo &Subtarget = MF->getSubtarget(); + bool RegisterPGOPasses = maintainPGOProfile(TM, OptLevel); - TII = MF->getSubtarget().getInstrInfo(); - TLI = MF->getSubtarget().getTargetLowering(); + TII = Subtarget.getInstrInfo(); + TLI = Subtarget.getTargetLowering(); RegInfo = &MF->getRegInfo(); LibInfo = &MFP.getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(Fn); @@ -573,9 +586,12 @@ void SelectionDAGISel::initializeAnalysisResults(MachineFunctionPass &MFP) { MachineModuleInfo &MMI = MFP.getAnalysis<MachineModuleInfoWrapperPass>().getMMI(); - CurDAG->init(*MF, *ORE, &MFP, LibInfo, - &TLI->getLibcallLoweringInfo(), // FIXME: Take from analysis - UA, PSI, BFI, MMI, FnVarLocs); + LibcallLowering = + &MFP.getAnalysis<LibcallLoweringInfoWrapper>().getLibcallLowering( + *Fn.getParent(), Subtarget); + + CurDAG->init(*MF, *ORE, &MFP, LibInfo, LibcallLowering, UA, PSI, BFI, MMI, + FnVarLocs); // Now get the optional analyzes if we want to. // This is based on the possibly changed OptLevel (after optnone is taken @@ -597,7 +613,7 @@ void SelectionDAGISel::initializeAnalysisResults(MachineFunctionPass &MFP) { TTI = &MFP.getAnalysis<TargetTransformInfoWrapperPass>().getTTI(Fn); - HwMode = MF->getSubtarget().getHwMode(); + HwMode = Subtarget.getHwMode(); } bool SelectionDAGISel::runOnMachineFunction(MachineFunction &mf) { @@ -1658,10 +1674,7 @@ void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) { FastISel *FastIS = nullptr; if (TM.Options.EnableFastISel) { LLVM_DEBUG(dbgs() << "Enabling fast-isel\n"); - FastIS = TLI->createFastISel( - *FuncInfo, LibInfo, - &TLI->getLibcallLoweringInfo() // FIXME: Take from analysis - ); + FastIS = TLI->createFastISel(*FuncInfo, LibInfo, LibcallLowering); } ReversePostOrderTraversal<const Function*> RPOT(&Fn); diff --git a/llvm/test/CodeGen/AMDGPU/llc-pipeline-npm.ll b/llvm/test/CodeGen/AMDGPU/llc-pipeline-npm.ll index 6305806c48f18..5a47e18f54a12 100644 --- a/llvm/test/CodeGen/AMDGPU/llc-pipeline-npm.ll +++ b/llvm/test/CodeGen/AMDGPU/llc-pipeline-npm.ll @@ -11,6 +11,7 @@ ; GCN-O0-NEXT: require<profile-summary> ; GCN-O0-NEXT: require<collector-metadata> ; GCN-O0-NEXT: require<runtime-libcall-info> +; GCN-O0-NEXT: require<libcall-lowering-info> ; GCN-O0-NEXT: pre-isel-intrinsic-lowering ; GCN-O0-NEXT: function(expand-ir-insts<O0>) ; GCN-O0-NEXT: amdgpu-remove-incompatible-functions @@ -90,6 +91,7 @@ ; GCN-O2-NEXT: require<profile-summary> ; GCN-O2-NEXT: require<collector-metadata> ; GCN-O2-NEXT: require<runtime-libcall-info> +; GCN-O2-NEXT: require<libcall-lowering-info> ; GCN-O2-NEXT: pre-isel-intrinsic-lowering ; GCN-O2-NEXT: function(expand-ir-insts<O2>) ; GCN-O2-NEXT: amdgpu-remove-incompatible-functions @@ -261,6 +263,7 @@ ; GCN-O3-NEXT: require<profile-summary> ; GCN-O3-NEXT: require<collector-metadata> ; GCN-O3-NEXT: require<runtime-libcall-info> +; GCN-O3-NEXT: require<libcall-lowering-info> ; GCN-O3-NEXT: pre-isel-intrinsic-lowering ; GCN-O3-NEXT: function(expand-ir-insts<O3>) ; GCN-O3-NEXT: amdgpu-remove-incompatible-functions diff --git a/llvm/test/CodeGen/X86/llc-pipeline-npm.ll b/llvm/test/CodeGen/X86/llc-pipeline-npm.ll index 8230539452f0d..d1bb666b9f423 100644 --- a/llvm/test/CodeGen/X86/llc-pipeline-npm.ll +++ b/llvm/test/CodeGen/X86/llc-pipeline-npm.ll @@ -14,6 +14,7 @@ ; O0-NEXT: require<profile-summary> ; O0-NEXT: require<collector-metadata> ; O0-NEXT: require<runtime-libcall-info> +; O0-NEXT: require<libcall-lowering-info> ; O0-NEXT: pre-isel-intrinsic-lowering ; O0-NEXT: function(expand-ir-insts<O0> ; O0-NEXT: atomic-expand @@ -70,6 +71,7 @@ ; O2-NEXT: require<profile-summary> ; O2-NEXT: require<collector-metadata> ; O2-NEXT: require<runtime-libcall-info> +; O2-NEXT: require<libcall-lowering-info> ; O2-NEXT: pre-isel-intrinsic-lowering ; O2-NEXT: function(expand-ir-insts<O2> ; O2-NEXT: atomic-expand @@ -180,6 +182,7 @@ ; O0-WINDOWS-NEXT: require<profile-summary> ; O0-WINDOWS-NEXT: require<collector-metadata> ; O0-WINDOWS-NEXT: require<runtime-libcall-info> +; O0-WINDOWS-NEXT: require<libcall-lowering-info> ; O0-WINDOWS-NEXT: pre-isel-intrinsic-lowering ; O0-WINDOWS-NEXT: function(expand-ir-insts<O0> ; O0-WINDOWS-NEXT: atomic-expand @@ -239,6 +242,7 @@ ; O3-WINDOWS-NEXT: require<profile-summary> ; O3-WINDOWS-NEXT: require<collector-metadata> ; O3-WINDOWS-NEXT: require<runtime-libcall-info> +; O3-WINDOWS-NEXT: require<libcall-lowering-info> ; O3-WINDOWS-NEXT: pre-isel-intrinsic-lowering ; O3-WINDOWS-NEXT: function(expand-ir-insts<O3> ; O3-WINDOWS-NEXT: atomic-expand _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
