Skip to content

Commit 301a1d5

Browse files
authored
RuntimeLibcalls: Invert handling of 64-bit only libcalls (#148571)
Switch the default set to exclude these conditionally available calls, so they are opt-in instead of opt-out.
1 parent 91d017a commit 301a1d5

File tree

2 files changed

+35
-37
lines changed

2 files changed

+35
-37
lines changed

llvm/include/llvm/IR/RuntimeLibcalls.td

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -439,26 +439,21 @@ let IsDefault = true in {
439439
def __ashlhi3 : RuntimeLibcallImpl<SHL_I16>;
440440
def __ashlsi3 : RuntimeLibcallImpl<SHL_I32>;
441441
def __ashldi3 : RuntimeLibcallImpl<SHL_I64>;
442-
def __ashlti3 : RuntimeLibcallImpl<SHL_I128>;
443442

444443
def __lshrhi3 : RuntimeLibcallImpl<SRL_I16>;
445444
def __lshrsi3 : RuntimeLibcallImpl<SRL_I32>;
446445
def __lshrdi3 : RuntimeLibcallImpl<SRL_I64>;
447-
def __lshrti3 : RuntimeLibcallImpl<SRL_I128>;
448446

449447
def __ashrhi3 : RuntimeLibcallImpl<SRA_I16>;
450448
def __ashrsi3 : RuntimeLibcallImpl<SRA_I32>;
451449
def __ashrdi3 : RuntimeLibcallImpl<SRA_I64>;
452-
def __ashrti3 : RuntimeLibcallImpl<SRA_I128>;
453450

454451
def __mulqi3 : RuntimeLibcallImpl<MUL_I8>;
455452
def __mulhi3 : RuntimeLibcallImpl<MUL_I16>;
456453
def __mulsi3 : RuntimeLibcallImpl<MUL_I32>;
457454
def __muldi3 : RuntimeLibcallImpl<MUL_I64>;
458-
def __multi3 : RuntimeLibcallImpl<MUL_I128>;
459455

460456
def __mulosi4 : RuntimeLibcallImpl<MULO_I32>;
461-
def __mulodi4 : RuntimeLibcallImpl<MULO_I64>;
462457

463458
def __divqi3 : RuntimeLibcallImpl<SDIV_I8>;
464459
def __divhi3 : RuntimeLibcallImpl<SDIV_I16>;
@@ -935,10 +930,29 @@ def calloc : RuntimeLibcallImpl<CALLOC>;
935930
} // End let IsDefault = true
936931

937932
//--------------------------------------------------------------------
938-
// compiler-rt, not available for most architectures
933+
// compiler-rt/libgcc but 64-bit only, not available by default
939934
//--------------------------------------------------------------------
940935

941-
def __muloti4 : RuntimeLibcallImpl<MULO_I128>;
936+
// Exist in libgcc and compiler-rt for 64-bit targets, or if
937+
// COMPILER_RT_ENABLE_SOFTWARE_INT128.
938+
defset list<RuntimeLibcallImpl> Int128RTLibcalls = {
939+
def __ashlti3 : RuntimeLibcallImpl<SHL_I128>;
940+
def __lshrti3 : RuntimeLibcallImpl<SRL_I128>;
941+
def __ashrti3 : RuntimeLibcallImpl<SRA_I128>;
942+
def __multi3 : RuntimeLibcallImpl<MUL_I128>;
943+
}
944+
945+
//--------------------------------------------------------------------
946+
// compiler-rt only, not available by default
947+
//--------------------------------------------------------------------
948+
949+
defset list<RuntimeLibcallImpl> CompilerRTOnlyInt64Libcalls = {
950+
def __mulodi4 : RuntimeLibcallImpl<MULO_I64>;
951+
}
952+
953+
defset list<RuntimeLibcallImpl> CompilerRTOnlyInt128Libcalls = {
954+
def __muloti4 : RuntimeLibcallImpl<MULO_I128>;
955+
}
942956

943957
//--------------------------------------------------------------------
944958
// Define implementation other libcalls
@@ -1034,21 +1048,6 @@ defset list<RuntimeLibcallImpl> LibmF128FiniteLibcalls = {
10341048
defvar AllDefaultRuntimeLibcallImpls
10351049
= !filter(entry, !instances<RuntimeLibcallImpl>(), entry.IsDefault);
10361050

1037-
// Exist in libgcc and compiler-rt for 64-bit targets, or if
1038-
// COMPILER_RT_ENABLE_SOFTWARE_INT128.
1039-
defvar Int128RTLibcalls = [
1040-
__ashlti3, __lshrti3, __ashrti3, __multi3
1041-
];
1042-
1043-
// Only available in compiler-rt
1044-
defvar CompilerRTOnlyInt64Libcalls = [
1045-
__mulodi4
1046-
];
1047-
1048-
defvar CompilerRTOnlyInt128Libcalls = [
1049-
__muloti4
1050-
];
1051-
10521051
defvar DefaultRuntimeLibcallImpls_f80 =
10531052
!filter(entry, AllDefaultRuntimeLibcallImpls,
10541053
!match(!cast<string>(entry.Provides), "F80"));
@@ -1064,12 +1063,9 @@ defvar DefaultRuntimeLibcallImpls_f128 =
10641063
defvar DefaultRuntimeLibcallImpls =
10651064
!listremove(
10661065
!listremove(
1067-
!listremove(
1068-
!listremove(AllDefaultRuntimeLibcallImpls, Int128RTLibcalls),
1069-
!listconcat(CompilerRTOnlyInt64Libcalls,
1070-
CompilerRTOnlyInt128Libcalls)),
1071-
DefaultRuntimeLibcallImpls_f80),
1072-
DefaultRuntimeLibcallImpls_ppcf128);
1066+
!listremove(AllDefaultRuntimeLibcallImpls, Int128RTLibcalls),
1067+
DefaultRuntimeLibcallImpls_f80),
1068+
DefaultRuntimeLibcallImpls_ppcf128);
10731069

10741070
/// Default set of libcall impls for 32-bit architectures.
10751071
defvar DefaultLibcallImpls32 = DefaultRuntimeLibcallImpls;

llvm/lib/IR/RuntimeLibcalls.cpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,10 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
139139
EABI EABIVersion, StringRef ABIName) {
140140
setTargetRuntimeLibcallSets(TT, FloatABI);
141141

142+
// Early exit for targets that have fully ported to tablegen.
143+
if (TT.isAMDGPU() || TT.isNVPTX() || TT.isWasm())
144+
return;
145+
142146
// Use the f128 variants of math functions on x86
143147
if (TT.isX86() && TT.isGNUEnvironment())
144148
setLongDoubleIsF128Libm(*this, /*FiniteOnlyFuncs=*/true);
@@ -241,15 +245,13 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
241245
if (TT.isARM() || TT.isThumb())
242246
setARMLibcallNames(*this, TT, FloatABI, EABIVersion);
243247

244-
if (!TT.isWasm()) {
245-
// These libcalls are only available in compiler-rt, not libgcc.
246-
if (TT.isArch32Bit()) {
247-
setLibcallImpl(RTLIB::SHL_I128, RTLIB::Unsupported);
248-
setLibcallImpl(RTLIB::SRL_I128, RTLIB::Unsupported);
249-
setLibcallImpl(RTLIB::SRA_I128, RTLIB::Unsupported);
250-
setLibcallImpl(RTLIB::MUL_I128, RTLIB::Unsupported);
251-
setLibcallImpl(RTLIB::MULO_I64, RTLIB::Unsupported);
252-
}
248+
// These libcalls are only available in compiler-rt, not libgcc.
249+
if (TT.isArch64Bit()) {
250+
setLibcallImpl(RTLIB::SHL_I128, RTLIB::__ashlti3);
251+
setLibcallImpl(RTLIB::SRL_I128, RTLIB::__lshrti3);
252+
setLibcallImpl(RTLIB::SRA_I128, RTLIB::__ashrti3);
253+
setLibcallImpl(RTLIB::MUL_I128, RTLIB::__multi3);
254+
setLibcallImpl(RTLIB::MULO_I64, RTLIB::__mulodi4);
253255
}
254256

255257
if (TT.getArch() == Triple::ArchType::msp430) {

0 commit comments

Comments
 (0)