[llvm-branch-commits] [llvm] DAG: Take LibcallLoweringInfo from analysis (PR #176800)
Matt Arsenault via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Jan 19 10:43:07 PST 2026
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 <Matthew.Arsenault at amd.com>
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
More information about the llvm-branch-commits
mailing list