[llvm] DAG: Add overload of getExternalSymbol using RTLIB::LibcallImpl (PR #170587)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Fri Dec 5 14:05:00 PST 2025
https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/170587
>From 5a3e77081393a374d59176c09358d2e7043d2c21 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Thu, 4 Dec 2025 01:39:58 +0100
Subject: [PATCH] DAG: Add overload of getExternalSymbol using
RTLIB::LibcallImpl
---
llvm/include/llvm/CodeGen/SelectionDAG.h | 1 +
llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 15 +++++++--------
.../CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp | 3 +--
llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 5 +++++
llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp | 8 ++++----
5 files changed, 18 insertions(+), 14 deletions(-)
diff --git a/llvm/include/llvm/CodeGen/SelectionDAG.h b/llvm/include/llvm/CodeGen/SelectionDAG.h
index 37a43aaf1d0c7..18dee551a76b2 100644
--- a/llvm/include/llvm/CodeGen/SelectionDAG.h
+++ b/llvm/include/llvm/CodeGen/SelectionDAG.h
@@ -793,6 +793,7 @@ class SelectionDAG {
// to provide debug info for the BB at that time, so keep this one around.
LLVM_ABI SDValue getBasicBlock(MachineBasicBlock *MBB);
LLVM_ABI SDValue getExternalSymbol(const char *Sym, EVT VT);
+ LLVM_ABI SDValue getExternalSymbol(RTLIB::LibcallImpl LCImpl, EVT VT);
LLVM_ABI SDValue getTargetExternalSymbol(const char *Sym, EVT VT,
unsigned TargetFlags = 0);
LLVM_ABI SDValue getMCSymbol(MCSymbol *Sym, EVT VT);
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
index 1eb18e10ba2d9..c46264e09bc46 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
@@ -2127,8 +2127,9 @@ SelectionDAGLegalize::ExpandLibCall(RTLIB::Libcall LC, SDNode *Node,
bool IsSigned, EVT RetVT) {
EVT CodePtrTy = TLI.getPointerTy(DAG.getDataLayout());
SDValue Callee;
- if (const char *LibcallName = TLI.getLibcallName(LC))
- Callee = DAG.getExternalSymbol(LibcallName, CodePtrTy);
+ RTLIB::LibcallImpl LCImpl = TLI.getLibcallImpl(LC);
+ if (LCImpl != RTLIB::Unsupported)
+ Callee = DAG.getExternalSymbol(LCImpl, CodePtrTy);
else {
Callee = DAG.getPOISON(CodePtrTy);
DAG.getContext()->emitError(Twine("no libcall available for ") +
@@ -2157,7 +2158,7 @@ SelectionDAGLegalize::ExpandLibCall(RTLIB::Libcall LC, SDNode *Node,
bool signExtend = TLI.shouldSignExtendTypeInLibCall(RetTy, IsSigned);
CLI.setDebugLoc(SDLoc(Node))
.setChain(InChain)
- .setLibCallee(TLI.getLibcallCallingConv(LC), RetTy, Callee,
+ .setLibCallee(TLI.getLibcallImplCallingConv(LCImpl), RetTy, Callee,
std::move(Args))
.setTailCall(isTailCall)
.setSExtResult(signExtend)
@@ -2392,8 +2393,7 @@ SelectionDAGLegalize::ExpandDivRemLibCall(SDNode *Node,
}
SDValue Callee =
- DAG.getExternalSymbol(TLI.getLibcallImplName(LibcallImpl).data(),
- TLI.getPointerTy(DAG.getDataLayout()));
+ DAG.getExternalSymbol(LibcallImpl, TLI.getPointerTy(DAG.getDataLayout()));
SDLoc dl(Node);
TargetLowering::CallLoweringInfo CLI(DAG);
@@ -2461,10 +2461,9 @@ SDValue SelectionDAGLegalize::ExpandSincosStretLibCall(SDNode *Node) const {
Type *SincosStretRetTy = FuncTy->getReturnType();
CallingConv::ID CallConv = CallsInfo.getLibcallImplCallingConv(SincosStret);
- StringRef LibcallImplName = CallsInfo.getLibcallImplName(SincosStret);
- SDValue Callee = DAG.getExternalSymbol(LibcallImplName.data(),
- TLI.getProgramPointerTy(DL));
+ SDValue Callee =
+ DAG.getExternalSymbol(SincosStret, TLI.getProgramPointerTy(DL));
TargetLowering::ArgListTy Args;
SDValue SRet;
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
index 8410f47fd5417..08c6b90cc8a74 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
@@ -5213,8 +5213,7 @@ void DAGTypeLegalizer::ExpandIntRes_XMULO(SDNode *N,
Entry.IsZExt = false;
Args.push_back(Entry);
- SDValue Func =
- DAG.getExternalSymbol(TLI.getLibcallImplName(LCImpl).data(), PtrVT);
+ SDValue Func = DAG.getExternalSymbol(LCImpl, PtrVT);
TargetLowering::CallLoweringInfo CLI(DAG);
CLI.setDebugLoc(dl)
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index a4acea3118e03..b7e78b94c0687 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -2066,6 +2066,11 @@ SDValue SelectionDAG::getExternalSymbol(const char *Sym, EVT VT) {
return SDValue(N, 0);
}
+SDValue SelectionDAG::getExternalSymbol(RTLIB::LibcallImpl Libcall, EVT VT) {
+ StringRef SymName = TLI->getLibcallImplName(Libcall);
+ return getExternalSymbol(SymName.data(), VT);
+}
+
SDValue SelectionDAG::getMCSymbol(MCSymbol *Sym, EVT VT) {
SDNode *&N = MCSymbols[Sym];
if (N)
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index 172c7485e108b..c65ddc6c28986 100644
--- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -187,8 +187,8 @@ TargetLowering::makeLibCall(SelectionDAG &DAG, RTLIB::LibcallImpl LibcallImpl,
Args.push_back(Entry);
}
- SDValue Callee = DAG.getExternalSymbol(getLibcallImplName(LibcallImpl).data(),
- getPointerTy(DAG.getDataLayout()));
+ SDValue Callee =
+ DAG.getExternalSymbol(LibcallImpl, getPointerTy(DAG.getDataLayout()));
Type *RetTy = RetVT.getTypeForEVT(*DAG.getContext());
Type *OrigRetTy = RetTy;
@@ -12261,8 +12261,8 @@ bool TargetLowering::expandMultipleResultFPLibCall(
? Node->getValueType(*CallRetResNo).getTypeForEVT(Ctx)
: Type::getVoidTy(Ctx);
SDValue InChain = StoresInChain ? StoresInChain : DAG.getEntryNode();
- SDValue Callee = DAG.getExternalSymbol(getLibcallImplName(LibcallImpl).data(),
- getPointerTy(DAG.getDataLayout()));
+ SDValue Callee =
+ DAG.getExternalSymbol(LibcallImpl, getPointerTy(DAG.getDataLayout()));
TargetLowering::CallLoweringInfo CLI(DAG);
CLI.setDebugLoc(DL).setChain(InChain).setLibCallee(
getLibcallImplCallingConv(LibcallImpl), RetType, Callee, std::move(Args));
More information about the llvm-commits
mailing list