[llvm] DAG: Make more use of the LibcallImpl overload of getExternalSymbol (PR #172171)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Sat Dec 13 10:48:28 PST 2025
https://github.com/arsenm created https://github.com/llvm/llvm-project/pull/172171
Also add a new copy for TargetExternalSymbol that AArch64 needs.
>From dbff004f7608383ed83596f62a877472a24e9017 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Sat, 13 Dec 2025 18:58:04 +0100
Subject: [PATCH] DAG: Make more use of the LibcallImpl overload of
getExternalSymbol
Also add a new copy for TargetExternalSymbol that AArch64 needs.
---
llvm/include/llvm/CodeGen/SelectionDAG.h | 3 +
.../lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 59 ++++++++-----------
.../Target/AArch64/AArch64ISelLowering.cpp | 8 +--
llvm/lib/Target/ARM/ARMISelLowering.cpp | 39 +++++++-----
4 files changed, 57 insertions(+), 52 deletions(-)
diff --git a/llvm/include/llvm/CodeGen/SelectionDAG.h b/llvm/include/llvm/CodeGen/SelectionDAG.h
index 9fd3c9a8841c8..4c7c9942fb8f6 100644
--- a/llvm/include/llvm/CodeGen/SelectionDAG.h
+++ b/llvm/include/llvm/CodeGen/SelectionDAG.h
@@ -796,6 +796,9 @@ class SelectionDAG {
LLVM_ABI SDValue getExternalSymbol(RTLIB::LibcallImpl LCImpl, EVT VT);
LLVM_ABI SDValue getTargetExternalSymbol(const char *Sym, EVT VT,
unsigned TargetFlags = 0);
+ LLVM_ABI SDValue getTargetExternalSymbol(RTLIB::LibcallImpl LCImpl, EVT VT,
+ unsigned TargetFlags = 0);
+
LLVM_ABI SDValue getMCSymbol(MCSymbol *Sym, EVT VT);
LLVM_ABI SDValue getValueType(EVT);
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index cbe3236eb80d9..039c29842804e 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -2090,6 +2090,12 @@ SDValue SelectionDAG::getTargetExternalSymbol(const char *Sym, EVT VT,
return SDValue(N, 0);
}
+SDValue SelectionDAG::getTargetExternalSymbol(RTLIB::LibcallImpl Libcall,
+ EVT VT, unsigned TargetFlags) {
+ StringRef SymName = TLI->getLibcallImplName(Libcall);
+ return getTargetExternalSymbol(SymName.data(), VT, TargetFlags);
+}
+
SDValue SelectionDAG::getCondCode(ISD::CondCode Cond) {
if ((unsigned)Cond >= CondCodeNodes.size())
CondCodeNodes.resize(Cond+1);
@@ -9122,14 +9128,13 @@ SelectionDAG::getMemcmp(SDValue Chain, const SDLoc &dl, SDValue Mem0,
bool IsTailCall =
isInTailCallPositionWrapper(CI, this, /*AllowReturnsFirstArg*/ true);
- StringRef LibCallName = TLI->getLibcallImplName(MemcmpImpl);
CLI.setDebugLoc(dl)
.setChain(Chain)
- .setLibCallee(TLI->getLibcallImplCallingConv(MemcmpImpl),
- Type::getInt32Ty(*getContext()),
- getExternalSymbol(LibCallName.data(),
- TLI->getPointerTy(getDataLayout())),
- std::move(Args))
+ .setLibCallee(
+ TLI->getLibcallImplCallingConv(MemcmpImpl),
+ Type::getInt32Ty(*getContext()),
+ getExternalSymbol(MemcmpImpl, TLI->getPointerTy(getDataLayout())),
+ std::move(Args))
.setTailCall(IsTailCall);
return TLI->LowerCallTo(CLI);
@@ -9150,15 +9155,13 @@ std::pair<SDValue, SDValue> SelectionDAG::getStrlen(SDValue Chain,
TargetLowering::CallLoweringInfo CLI(*this);
bool IsTailCall =
isInTailCallPositionWrapper(CI, this, /*AllowReturnsFirstArg*/ true);
- StringRef LibcallName = TLI->getLibcallImplName(StrlenImpl);
CLI.setDebugLoc(dl)
.setChain(Chain)
- .setLibCallee(
- TLI->getLibcallImplCallingConv(StrlenImpl), CI->getType(),
- getExternalSymbol(LibcallName.data(),
- TLI->getProgramPointerTy(getDataLayout())),
- std::move(Args))
+ .setLibCallee(TLI->getLibcallImplCallingConv(StrlenImpl), CI->getType(),
+ getExternalSymbol(
+ StrlenImpl, TLI->getProgramPointerTy(getDataLayout())),
+ std::move(Args))
.setTailCall(IsTailCall);
return TLI->LowerCallTo(CLI);
@@ -9236,8 +9239,7 @@ SDValue SelectionDAG::getMemcpy(
.setLibCallee(
TLI->getLibcallImplCallingConv(MemCpyImpl),
Dst.getValueType().getTypeForEVT(*getContext()),
- getExternalSymbol(TLI->getLibcallImplName(MemCpyImpl).data(),
- TLI->getPointerTy(getDataLayout())),
+ getExternalSymbol(MemCpyImpl, TLI->getPointerTy(getDataLayout())),
std::move(Args))
.setDiscardResult()
.setTailCall(IsTailCall);
@@ -9271,8 +9273,7 @@ SDValue SelectionDAG::getAtomicMemcpy(SDValue Chain, const SDLoc &dl,
.setLibCallee(
TLI->getLibcallImplCallingConv(LibcallImpl),
Type::getVoidTy(*getContext()),
- getExternalSymbol(TLI->getLibcallImplName(LibcallImpl).data(),
- TLI->getPointerTy(getDataLayout())),
+ getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
std::move(Args))
.setDiscardResult()
.setTailCall(isTailCall);
@@ -9344,8 +9345,7 @@ SDValue SelectionDAG::getMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst,
.setLibCallee(
TLI->getLibcallImplCallingConv(MemmoveImpl),
Dst.getValueType().getTypeForEVT(*getContext()),
- getExternalSymbol(TLI->getLibcallImplName(MemmoveImpl).data(),
- TLI->getPointerTy(getDataLayout())),
+ getExternalSymbol(MemmoveImpl, TLI->getPointerTy(getDataLayout())),
std::move(Args))
.setDiscardResult()
.setTailCall(IsTailCall);
@@ -9379,8 +9379,7 @@ SDValue SelectionDAG::getAtomicMemmove(SDValue Chain, const SDLoc &dl,
.setLibCallee(
TLI->getLibcallImplCallingConv(LibcallImpl),
Type::getVoidTy(*getContext()),
- getExternalSymbol(TLI->getLibcallImplName(LibcallImpl).data(),
- TLI->getPointerTy(getDataLayout())),
+ getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
std::move(Args))
.setDiscardResult()
.setTailCall(isTailCall);
@@ -9452,9 +9451,7 @@ SDValue SelectionDAG::getMemset(SDValue Chain, const SDLoc &dl, SDValue Dst,
Args.emplace_back(Size, DL.getIntPtrType(Ctx));
CLI.setLibCallee(
TLI->getLibcallImplCallingConv(BzeroImpl), Type::getVoidTy(Ctx),
- getExternalSymbol(TLI->getLibcallImplName(BzeroImpl).data(),
- TLI->getPointerTy(DL)),
- std::move(Args));
+ getExternalSymbol(BzeroImpl, TLI->getPointerTy(DL)), std::move(Args));
} else {
RTLIB::LibcallImpl MemsetImpl = TLI->getLibcallImpl(RTLIB::MEMSET);
@@ -9462,12 +9459,10 @@ SDValue SelectionDAG::getMemset(SDValue Chain, const SDLoc &dl, SDValue Dst,
Args.emplace_back(Dst, PointerType::getUnqual(Ctx));
Args.emplace_back(Src, Src.getValueType().getTypeForEVT(Ctx));
Args.emplace_back(Size, DL.getIntPtrType(Ctx));
- CLI.setLibCallee(
- TLI->getLibcallImplCallingConv(MemsetImpl),
- Dst.getValueType().getTypeForEVT(Ctx),
- getExternalSymbol(TLI->getLibcallImplName(MemsetImpl).data(),
- TLI->getPointerTy(DL)),
- std::move(Args));
+ CLI.setLibCallee(TLI->getLibcallImplCallingConv(MemsetImpl),
+ Dst.getValueType().getTypeForEVT(Ctx),
+ getExternalSymbol(MemsetImpl, TLI->getPointerTy(DL)),
+ std::move(Args));
}
RTLIB::LibcallImpl MemsetImpl = TLI->getLibcallImpl(RTLIB::MEMSET);
@@ -9509,8 +9504,7 @@ SDValue SelectionDAG::getAtomicMemset(SDValue Chain, const SDLoc &dl,
.setLibCallee(
TLI->getLibcallImplCallingConv(LibcallImpl),
Type::getVoidTy(*getContext()),
- getExternalSymbol(TLI->getLibcallImplName(LibcallImpl).data(),
- TLI->getPointerTy(getDataLayout())),
+ getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout())),
std::move(Args))
.setDiscardResult()
.setTailCall(isTailCall);
@@ -14244,8 +14238,7 @@ SDValue SelectionDAG::makeStateFunctionCall(unsigned LibFunc, SDValue Ptr,
reportFatalUsageError("emitting call to unsupported libcall");
SDValue Callee =
- getExternalSymbol(TLI->getLibcallImplName(LibcallImpl).data(),
- TLI->getPointerTy(getDataLayout()));
+ getExternalSymbol(LibcallImpl, TLI->getPointerTy(getDataLayout()));
TargetLowering::CallLoweringInfo CLI(*this);
CLI.setDebugLoc(DLoc).setChain(InChain).setLibCallee(
TLI->getLibcallImplCallingConv(LibcallImpl),
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index 288a285276ce1..426d950f850e6 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -6005,7 +6005,7 @@ SDValue AArch64TargetLowering::getRuntimePStateSM(SelectionDAG &DAG,
SDValue Chain, SDLoc DL,
EVT VT) const {
RTLIB::Libcall LC = RTLIB::SMEABI_SME_STATE;
- SDValue Callee = DAG.getExternalSymbol(getLibcallName(LC),
+ SDValue Callee = DAG.getExternalSymbol(getLibcallImpl(LC),
getPointerTy(DAG.getDataLayout()));
Type *Int64Ty = Type::getInt64Ty(*DAG.getContext());
Type *RetTy = StructType::get(Int64Ty, Int64Ty);
@@ -8413,7 +8413,7 @@ static SDValue emitSMEStateSaveRestore(const AArch64TargetLowering &TLI,
RTLIB::Libcall LC =
IsSave ? RTLIB::SMEABI_SME_SAVE : RTLIB::SMEABI_SME_RESTORE;
- SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC),
+ SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallImpl(LC),
TLI.getPointerTy(DAG.getDataLayout()));
auto *RetTy = Type::getVoidTy(*DAG.getContext());
TargetLowering::CallLoweringInfo CLI(DAG);
@@ -8433,7 +8433,7 @@ static SDValue emitRestoreZALazySave(SDValue Chain, SDLoc DL,
SDValue RegMask = DAG.getRegisterMask(TRI.getCallPreservedMask(
DAG.getMachineFunction(), TLI.getLibcallCallingConv(LC)));
SDValue RestoreRoutine = DAG.getTargetExternalSymbol(
- TLI.getLibcallName(LC), TLI.getPointerTy(DAG.getDataLayout()));
+ TLI.getLibcallImpl(LC), TLI.getPointerTy(DAG.getDataLayout()));
SDValue TPIDR2_EL0 = DAG.getNode(
ISD::INTRINSIC_W_CHAIN, DL, MVT::i64, Chain,
DAG.getTargetConstant(Intrinsic::aarch64_sme_get_tpidr2, DL, MVT::i32));
@@ -8944,7 +8944,7 @@ SDValue AArch64TargetLowering::LowerFormalArguments(
} else if (Attrs.hasAgnosticZAInterface()) {
RTLIB::Libcall LC = RTLIB::SMEABI_SME_STATE_SIZE;
SDValue Callee = DAG.getExternalSymbol(
- getLibcallName(LC), getPointerTy(DAG.getDataLayout()));
+ getLibcallImpl(LC), getPointerTy(DAG.getDataLayout()));
auto *RetTy = EVT(MVT::i64).getTypeForEVT(*DAG.getContext());
TargetLowering::CallLoweringInfo CLI(DAG);
CLI.setDebugLoc(DL).setChain(Chain).setLibCallee(
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp
index 2d26c67a8077a..08bdcbf24c925 100644
--- a/llvm/lib/Target/ARM/ARMISelLowering.cpp
+++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp
@@ -9631,8 +9631,8 @@ SDValue ARMTargetLowering::LowerWindowsDIVLibCall(SDValue Op, SelectionDAG &DAG,
else
LC = VT == MVT::i32 ? RTLIB::UDIVREM_I32 : RTLIB::UDIVREM_I64;
- const char *Name = getLibcallName(LC);
- SDValue ES = DAG.getExternalSymbol(Name, getPointerTy(DL));
+ RTLIB::LibcallImpl LCImpl = getLibcallImpl(LC);
+ SDValue ES = DAG.getExternalSymbol(LCImpl, getPointerTy(DL));
ARMTargetLowering::ArgListTy Args;
@@ -9643,10 +9643,9 @@ SDValue ARMTargetLowering::LowerWindowsDIVLibCall(SDValue Op, SelectionDAG &DAG,
}
CallLoweringInfo CLI(DAG);
- CLI.setDebugLoc(dl)
- .setChain(Chain)
- .setCallee(CallingConv::ARM_AAPCS_VFP, VT.getTypeForEVT(*DAG.getContext()),
- ES, std::move(Args));
+ CLI.setDebugLoc(dl).setChain(Chain).setCallee(
+ getLibcallImplCallingConv(LCImpl), VT.getTypeForEVT(*DAG.getContext()),
+ ES, std::move(Args));
return LowerCallTo(CLI).first;
}
@@ -20423,8 +20422,9 @@ SDValue ARMTargetLowering::LowerDivRem(SDValue Op, SelectionDAG &DAG) const {
DAG.getContext(),
Subtarget);
- SDValue Callee = DAG.getExternalSymbol(getLibcallName(LC),
- getPointerTy(DAG.getDataLayout()));
+ RTLIB::LibcallImpl LCImpl = getLibcallImpl(LC);
+ SDValue Callee =
+ DAG.getExternalSymbol(LCImpl, getPointerTy(DAG.getDataLayout()));
Type *RetTy = StructType::get(Ty, Ty);
@@ -20432,9 +20432,13 @@ SDValue ARMTargetLowering::LowerDivRem(SDValue Op, SelectionDAG &DAG) const {
InChain = WinDBZCheckDenominator(DAG, Op.getNode(), InChain);
TargetLowering::CallLoweringInfo CLI(DAG);
- CLI.setDebugLoc(dl).setChain(InChain)
- .setCallee(getLibcallCallingConv(LC), RetTy, Callee, std::move(Args))
- .setInRegister().setSExtResult(isSigned).setZExtResult(!isSigned);
+ CLI.setDebugLoc(dl)
+ .setChain(InChain)
+ .setCallee(getLibcallImplCallingConv(LCImpl), RetTy, Callee,
+ std::move(Args))
+ .setInRegister()
+ .setSExtResult(isSigned)
+ .setZExtResult(!isSigned);
std::pair<SDValue, SDValue> CallInfo = LowerCallTo(CLI);
return CallInfo.first;
@@ -20475,8 +20479,10 @@ SDValue ARMTargetLowering::LowerREM(SDNode *N, SelectionDAG &DAG) const {
TargetLowering::ArgListTy Args = getDivRemArgList(N, DAG.getContext(),
Subtarget);
bool isSigned = N->getOpcode() == ISD::SREM;
- SDValue Callee = DAG.getExternalSymbol(getLibcallName(LC),
- getPointerTy(DAG.getDataLayout()));
+
+ RTLIB::LibcallImpl LCImpl = getLibcallImpl(LC);
+ SDValue Callee =
+ DAG.getExternalSymbol(LCImpl, getPointerTy(DAG.getDataLayout()));
if (Subtarget->isTargetWindows())
InChain = WinDBZCheckDenominator(DAG, N, InChain);
@@ -20484,8 +20490,11 @@ SDValue ARMTargetLowering::LowerREM(SDNode *N, SelectionDAG &DAG) const {
// Lower call
CallLoweringInfo CLI(DAG);
CLI.setChain(InChain)
- .setCallee(CallingConv::ARM_AAPCS, RetTy, Callee, std::move(Args))
- .setSExtResult(isSigned).setZExtResult(!isSigned).setDebugLoc(SDLoc(N));
+ .setCallee(getLibcallImplCallingConv(LCImpl), RetTy, Callee,
+ std::move(Args))
+ .setSExtResult(isSigned)
+ .setZExtResult(!isSigned)
+ .setDebugLoc(SDLoc(N));
std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
// Return second (rem) result operand (first contains div)
More information about the llvm-commits
mailing list