Conversation
This was referenced Jun 27, 2025
Contributor
Author
Member
|
@llvm/pr-subscribers-backend-arm @llvm/pr-subscribers-llvm-ir Author: Matt Arsenault (arsenm) ChangesThis fully consolidates all the calling convention configuration into Full diff: https://github.com/llvm/llvm-project/pull/146083.diff 2 Files Affected:
diff --git a/llvm/lib/IR/RuntimeLibcalls.cpp b/llvm/lib/IR/RuntimeLibcalls.cpp
index b08ee16791dfd..9f24e9d1fc4b1 100644
--- a/llvm/lib/IR/RuntimeLibcalls.cpp
+++ b/llvm/lib/IR/RuntimeLibcalls.cpp
@@ -98,6 +98,45 @@ static void setARMLibcallNames(RuntimeLibcallsInfo &Info, const Triple &TT,
Info.setLibcallImpl(RTLIB::SDIVREM_I32, RTLIB::__divmodsi4);
Info.setLibcallImpl(RTLIB::UDIVREM_I32, RTLIB::__udivmodsi4);
}
+
+ static const RTLIB::LibcallImpl AAPCS_Libcalls[] = {
+ RTLIB::__aeabi_dadd, RTLIB::__aeabi_ddiv,
+ RTLIB::__aeabi_dmul, RTLIB::__aeabi_dsub,
+ RTLIB::__aeabi_dcmpeq__ne, RTLIB::__aeabi_dcmpeq__eq,
+ RTLIB::__aeabi_dcmplt, RTLIB::__aeabi_dcmple,
+ RTLIB::__aeabi_dcmpge, RTLIB::__aeabi_dcmpgt,
+ RTLIB::__aeabi_dcmpun, RTLIB::__aeabi_fadd,
+ RTLIB::__aeabi_fdiv, RTLIB::__aeabi_fmul,
+ RTLIB::__aeabi_fsub, RTLIB::__aeabi_fcmpeq__ne,
+ RTLIB::__aeabi_fcmpeq__eq, RTLIB::__aeabi_fcmplt,
+ RTLIB::__aeabi_fcmple, RTLIB::__aeabi_fcmpge,
+ RTLIB::__aeabi_fcmpgt, RTLIB::__aeabi_fcmpun,
+ RTLIB::__aeabi_d2iz, RTLIB::__aeabi_d2uiz,
+ RTLIB::__aeabi_d2lz, RTLIB::__aeabi_d2ulz,
+ RTLIB::__aeabi_f2iz, RTLIB::__aeabi_f2uiz,
+ RTLIB::__aeabi_f2lz, RTLIB::__aeabi_f2ulz,
+ RTLIB::__aeabi_d2f, RTLIB::__aeabi_d2h,
+ RTLIB::__aeabi_f2d, RTLIB::__aeabi_i2d,
+ RTLIB::__aeabi_ui2d, RTLIB::__aeabi_l2d,
+ RTLIB::__aeabi_ul2d, RTLIB::__aeabi_i2f,
+ RTLIB::__aeabi_ui2f, RTLIB::__aeabi_l2f,
+ RTLIB::__aeabi_ul2f, RTLIB::__aeabi_lmul,
+ RTLIB::__aeabi_llsl, RTLIB::__aeabi_llsr,
+ RTLIB::__aeabi_lasr, RTLIB::__aeabi_idiv__i8,
+ RTLIB::__aeabi_idiv__i16, RTLIB::__aeabi_idiv__i32,
+ RTLIB::__aeabi_ldivmod, RTLIB::__aeabi_uidiv__i8,
+ RTLIB::__aeabi_uidiv__i16, RTLIB::__aeabi_uidiv__i32,
+ RTLIB::__aeabi_uldivmod, RTLIB::__aeabi_f2h,
+ RTLIB::__aeabi_d2h, RTLIB::__aeabi_h2f,
+ RTLIB::__aeabi_memcpy, RTLIB::__aeabi_memmove,
+ RTLIB::__aeabi_memset, RTLIB::__aeabi_memcpy4,
+ RTLIB::__aeabi_memcpy8, RTLIB::__aeabi_memmove4,
+ RTLIB::__aeabi_memmove8, RTLIB::__aeabi_memset4,
+ RTLIB::__aeabi_memset8, RTLIB::__aeabi_memclr,
+ RTLIB::__aeabi_memclr4, RTLIB::__aeabi_memclr8};
+
+ for (RTLIB::LibcallImpl Impl : AAPCS_Libcalls)
+ Info.setLibcallImplCallingConv(Impl, CallingConv::ARM_AAPCS);
}
static void setLongDoubleIsF128Libm(RuntimeLibcallsInfo &Info,
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp
index 78ef3c23e8423..2ece698df264b 100644
--- a/llvm/lib/Target/ARM/ARMISelLowering.cpp
+++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp
@@ -578,9 +578,8 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
};
// clang-format on
- for (const auto &LC : LibraryCalls) {
+ for (const auto &LC : LibraryCalls)
setLibcallImpl(LC.Op, LC.Impl);
- }
}
}
@@ -594,94 +593,91 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
static const struct {
const RTLIB::Libcall Op;
const RTLIB::LibcallImpl Impl;
- const CallingConv::ID CC;
} LibraryCalls[] = {
// Double-precision floating-point arithmetic helper functions
// RTABI chapter 4.1.2, Table 2
- { RTLIB::ADD_F64, RTLIB::__aeabi_dadd, CallingConv::ARM_AAPCS },
- { RTLIB::DIV_F64, RTLIB::__aeabi_ddiv, CallingConv::ARM_AAPCS },
- { RTLIB::MUL_F64, RTLIB::__aeabi_dmul, CallingConv::ARM_AAPCS },
- { RTLIB::SUB_F64, RTLIB::__aeabi_dsub, CallingConv::ARM_AAPCS },
+ { RTLIB::ADD_F64, RTLIB::__aeabi_dadd },
+ { RTLIB::DIV_F64, RTLIB::__aeabi_ddiv },
+ { RTLIB::MUL_F64, RTLIB::__aeabi_dmul },
+ { RTLIB::SUB_F64, RTLIB::__aeabi_dsub },
// Double-precision floating-point comparison helper functions
// RTABI chapter 4.1.2, Table 3
- { RTLIB::OEQ_F64, RTLIB::__aeabi_dcmpeq__ne, CallingConv::ARM_AAPCS },
- { RTLIB::UNE_F64, RTLIB::__aeabi_dcmpeq__eq, CallingConv::ARM_AAPCS },
- { RTLIB::OLT_F64, RTLIB::__aeabi_dcmplt, CallingConv::ARM_AAPCS },
- { RTLIB::OLE_F64, RTLIB::__aeabi_dcmple, CallingConv::ARM_AAPCS },
- { RTLIB::OGE_F64, RTLIB::__aeabi_dcmpge, CallingConv::ARM_AAPCS },
- { RTLIB::OGT_F64, RTLIB::__aeabi_dcmpgt, CallingConv::ARM_AAPCS },
- { RTLIB::UO_F64, RTLIB::__aeabi_dcmpun, CallingConv::ARM_AAPCS },
+ { RTLIB::OEQ_F64, RTLIB::__aeabi_dcmpeq__ne },
+ { RTLIB::UNE_F64, RTLIB::__aeabi_dcmpeq__eq },
+ { RTLIB::OLT_F64, RTLIB::__aeabi_dcmplt },
+ { RTLIB::OLE_F64, RTLIB::__aeabi_dcmple },
+ { RTLIB::OGE_F64, RTLIB::__aeabi_dcmpge },
+ { RTLIB::OGT_F64, RTLIB::__aeabi_dcmpgt },
+ { RTLIB::UO_F64, RTLIB::__aeabi_dcmpun },
// Single-precision floating-point arithmetic helper functions
// RTABI chapter 4.1.2, Table 4
- { RTLIB::ADD_F32, RTLIB::__aeabi_fadd, CallingConv::ARM_AAPCS },
- { RTLIB::DIV_F32, RTLIB::__aeabi_fdiv, CallingConv::ARM_AAPCS },
- { RTLIB::MUL_F32, RTLIB::__aeabi_fmul, CallingConv::ARM_AAPCS },
- { RTLIB::SUB_F32, RTLIB::__aeabi_fsub, CallingConv::ARM_AAPCS },
+ { RTLIB::ADD_F32, RTLIB::__aeabi_fadd },
+ { RTLIB::DIV_F32, RTLIB::__aeabi_fdiv },
+ { RTLIB::MUL_F32, RTLIB::__aeabi_fmul },
+ { RTLIB::SUB_F32, RTLIB::__aeabi_fsub },
// Single-precision floating-point comparison helper functions
// RTABI chapter 4.1.2, Table 5
- { RTLIB::OEQ_F32, RTLIB::__aeabi_fcmpeq__ne, CallingConv::ARM_AAPCS },
- { RTLIB::UNE_F32, RTLIB::__aeabi_fcmpeq__eq, CallingConv::ARM_AAPCS },
- { RTLIB::OLT_F32, RTLIB::__aeabi_fcmplt, CallingConv::ARM_AAPCS},
- { RTLIB::OLE_F32, RTLIB::__aeabi_fcmple, CallingConv::ARM_AAPCS },
- { RTLIB::OGE_F32, RTLIB::__aeabi_fcmpge, CallingConv::ARM_AAPCS },
- { RTLIB::OGT_F32, RTLIB::__aeabi_fcmpgt, CallingConv::ARM_AAPCS },
- { RTLIB::UO_F32, RTLIB::__aeabi_fcmpun, CallingConv::ARM_AAPCS },
+ { RTLIB::OEQ_F32, RTLIB::__aeabi_fcmpeq__ne },
+ { RTLIB::UNE_F32, RTLIB::__aeabi_fcmpeq__eq },
+ { RTLIB::OLT_F32, RTLIB::__aeabi_fcmplt},
+ { RTLIB::OLE_F32, RTLIB::__aeabi_fcmple },
+ { RTLIB::OGE_F32, RTLIB::__aeabi_fcmpge },
+ { RTLIB::OGT_F32, RTLIB::__aeabi_fcmpgt },
+ { RTLIB::UO_F32, RTLIB::__aeabi_fcmpun },
// Floating-point to integer conversions.
// RTABI chapter 4.1.2, Table 6
- { RTLIB::FPTOSINT_F64_I32, RTLIB::__aeabi_d2iz, CallingConv::ARM_AAPCS },
- { RTLIB::FPTOUINT_F64_I32, RTLIB::__aeabi_d2uiz, CallingConv::ARM_AAPCS },
- { RTLIB::FPTOSINT_F64_I64, RTLIB::__aeabi_d2lz, CallingConv::ARM_AAPCS },
- { RTLIB::FPTOUINT_F64_I64, RTLIB::__aeabi_d2ulz, CallingConv::ARM_AAPCS },
- { RTLIB::FPTOSINT_F32_I32, RTLIB::__aeabi_f2iz, CallingConv::ARM_AAPCS },
- { RTLIB::FPTOUINT_F32_I32, RTLIB::__aeabi_f2uiz, CallingConv::ARM_AAPCS },
- { RTLIB::FPTOSINT_F32_I64, RTLIB::__aeabi_f2lz, CallingConv::ARM_AAPCS },
- { RTLIB::FPTOUINT_F32_I64, RTLIB::__aeabi_f2ulz, CallingConv::ARM_AAPCS },
+ { RTLIB::FPTOSINT_F64_I32, RTLIB::__aeabi_d2iz },
+ { RTLIB::FPTOUINT_F64_I32, RTLIB::__aeabi_d2uiz },
+ { RTLIB::FPTOSINT_F64_I64, RTLIB::__aeabi_d2lz },
+ { RTLIB::FPTOUINT_F64_I64, RTLIB::__aeabi_d2ulz },
+ { RTLIB::FPTOSINT_F32_I32, RTLIB::__aeabi_f2iz },
+ { RTLIB::FPTOUINT_F32_I32, RTLIB::__aeabi_f2uiz },
+ { RTLIB::FPTOSINT_F32_I64, RTLIB::__aeabi_f2lz },
+ { RTLIB::FPTOUINT_F32_I64, RTLIB::__aeabi_f2ulz },
// Conversions between floating types.
// RTABI chapter 4.1.2, Table 7
- { RTLIB::FPROUND_F64_F32, RTLIB::__aeabi_d2f, CallingConv::ARM_AAPCS },
- { RTLIB::FPROUND_F64_F16, RTLIB::__aeabi_d2h, CallingConv::ARM_AAPCS },
- { RTLIB::FPEXT_F32_F64, RTLIB::__aeabi_f2d, CallingConv::ARM_AAPCS },
+ { RTLIB::FPROUND_F64_F32, RTLIB::__aeabi_d2f },
+ { RTLIB::FPROUND_F64_F16, RTLIB::__aeabi_d2h },
+ { RTLIB::FPEXT_F32_F64, RTLIB::__aeabi_f2d },
// Integer to floating-point conversions.
// RTABI chapter 4.1.2, Table 8
- { RTLIB::SINTTOFP_I32_F64, RTLIB::__aeabi_i2d, CallingConv::ARM_AAPCS },
- { RTLIB::UINTTOFP_I32_F64, RTLIB::__aeabi_ui2d, CallingConv::ARM_AAPCS },
- { RTLIB::SINTTOFP_I64_F64, RTLIB::__aeabi_l2d, CallingConv::ARM_AAPCS },
- { RTLIB::UINTTOFP_I64_F64, RTLIB::__aeabi_ul2d, CallingConv::ARM_AAPCS },
- { RTLIB::SINTTOFP_I32_F32, RTLIB::__aeabi_i2f, CallingConv::ARM_AAPCS },
- { RTLIB::UINTTOFP_I32_F32, RTLIB::__aeabi_ui2f, CallingConv::ARM_AAPCS },
- { RTLIB::SINTTOFP_I64_F32, RTLIB::__aeabi_l2f, CallingConv::ARM_AAPCS },
- { RTLIB::UINTTOFP_I64_F32, RTLIB::__aeabi_ul2f, CallingConv::ARM_AAPCS },
+ { RTLIB::SINTTOFP_I32_F64, RTLIB::__aeabi_i2d },
+ { RTLIB::UINTTOFP_I32_F64, RTLIB::__aeabi_ui2d },
+ { RTLIB::SINTTOFP_I64_F64, RTLIB::__aeabi_l2d },
+ { RTLIB::UINTTOFP_I64_F64, RTLIB::__aeabi_ul2d },
+ { RTLIB::SINTTOFP_I32_F32, RTLIB::__aeabi_i2f },
+ { RTLIB::UINTTOFP_I32_F32, RTLIB::__aeabi_ui2f },
+ { RTLIB::SINTTOFP_I64_F32, RTLIB::__aeabi_l2f },
+ { RTLIB::UINTTOFP_I64_F32, RTLIB::__aeabi_ul2f },
// Long long helper functions
// RTABI chapter 4.2, Table 9
- { RTLIB::MUL_I64, RTLIB::__aeabi_lmul, CallingConv::ARM_AAPCS },
- { RTLIB::SHL_I64, RTLIB::__aeabi_llsl, CallingConv::ARM_AAPCS },
- { RTLIB::SRL_I64, RTLIB::__aeabi_llsr, CallingConv::ARM_AAPCS },
- { RTLIB::SRA_I64, RTLIB::__aeabi_lasr, CallingConv::ARM_AAPCS },
+ { RTLIB::MUL_I64, RTLIB::__aeabi_lmul },
+ { RTLIB::SHL_I64, RTLIB::__aeabi_llsl },
+ { RTLIB::SRL_I64, RTLIB::__aeabi_llsr },
+ { RTLIB::SRA_I64, RTLIB::__aeabi_lasr },
// Integer division functions
// RTABI chapter 4.3.1
- { RTLIB::SDIV_I8, RTLIB::__aeabi_idiv__i8, CallingConv::ARM_AAPCS },
- { RTLIB::SDIV_I16, RTLIB::__aeabi_idiv__i16, CallingConv::ARM_AAPCS },
- { RTLIB::SDIV_I32, RTLIB::__aeabi_idiv__i32, CallingConv::ARM_AAPCS },
- { RTLIB::SDIV_I64, RTLIB::__aeabi_ldivmod, CallingConv::ARM_AAPCS },
- { RTLIB::UDIV_I8, RTLIB::__aeabi_uidiv__i8, CallingConv::ARM_AAPCS },
- { RTLIB::UDIV_I16, RTLIB::__aeabi_uidiv__i16, CallingConv::ARM_AAPCS },
- { RTLIB::UDIV_I32, RTLIB::__aeabi_uidiv__i32, CallingConv::ARM_AAPCS },
- { RTLIB::UDIV_I64, RTLIB::__aeabi_uldivmod, CallingConv::ARM_AAPCS },
+ { RTLIB::SDIV_I8, RTLIB::__aeabi_idiv__i8 },
+ { RTLIB::SDIV_I16, RTLIB::__aeabi_idiv__i16 },
+ { RTLIB::SDIV_I32, RTLIB::__aeabi_idiv__i32},
+ { RTLIB::SDIV_I64, RTLIB::__aeabi_ldivmod },
+ { RTLIB::UDIV_I8, RTLIB::__aeabi_uidiv__i8 },
+ { RTLIB::UDIV_I16, RTLIB::__aeabi_uidiv__i16 },
+ { RTLIB::UDIV_I32, RTLIB::__aeabi_uidiv__i32 },
+ { RTLIB::UDIV_I64, RTLIB::__aeabi_uldivmod },
};
// clang-format on
- for (const auto &LC : LibraryCalls) {
+ for (const auto &LC : LibraryCalls)
setLibcallImpl(LC.Op, LC.Impl);
- setLibcallImplCallingConv(LC.Impl, LC.CC);
- }
// EABI dependent RTLIB
if (TM.Options.EABIVersion == EABI::EABI4 ||
@@ -689,36 +685,25 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
static const struct {
const RTLIB::Libcall Op;
const RTLIB::LibcallImpl Impl;
- const CallingConv::ID CC;
} MemOpsLibraryCalls[] = {
// Memory operations
// RTABI chapter 4.3.4
- {RTLIB::MEMCPY, RTLIB::__aeabi_memcpy, CallingConv::ARM_AAPCS},
- {RTLIB::MEMMOVE, RTLIB::__aeabi_memmove, CallingConv::ARM_AAPCS},
- {RTLIB::MEMSET, RTLIB::__aeabi_memset, CallingConv::ARM_AAPCS},
- {RTLIB::AEABI_MEMCPY4, RTLIB::__aeabi_memcpy4,
- CallingConv::ARM_AAPCS},
- {RTLIB::AEABI_MEMCPY8, RTLIB::__aeabi_memcpy8,
- CallingConv::ARM_AAPCS},
- {RTLIB::AEABI_MEMMOVE4, RTLIB::__aeabi_memmove4,
- CallingConv::ARM_AAPCS},
- {RTLIB::AEABI_MEMMOVE8, RTLIB::__aeabi_memmove8,
- CallingConv::ARM_AAPCS},
- {RTLIB::AEABI_MEMSET4, RTLIB::__aeabi_memset4,
- CallingConv::ARM_AAPCS},
- {RTLIB::AEABI_MEMSET8, RTLIB::__aeabi_memset8,
- CallingConv::ARM_AAPCS},
- {RTLIB::AEABI_MEMCLR, RTLIB::__aeabi_memclr, CallingConv::ARM_AAPCS},
- {RTLIB::AEABI_MEMCLR4, RTLIB::__aeabi_memclr4,
- CallingConv::ARM_AAPCS},
- {RTLIB::AEABI_MEMCLR8, RTLIB::__aeabi_memclr8,
- CallingConv::ARM_AAPCS},
+ {RTLIB::MEMCPY, RTLIB::__aeabi_memcpy},
+ {RTLIB::MEMMOVE, RTLIB::__aeabi_memmove},
+ {RTLIB::MEMSET, RTLIB::__aeabi_memset},
+ {RTLIB::AEABI_MEMCPY4, RTLIB::__aeabi_memcpy4},
+ {RTLIB::AEABI_MEMCPY8, RTLIB::__aeabi_memcpy8},
+ {RTLIB::AEABI_MEMMOVE4, RTLIB::__aeabi_memmove4},
+ {RTLIB::AEABI_MEMMOVE8, RTLIB::__aeabi_memmove8},
+ {RTLIB::AEABI_MEMSET4, RTLIB::__aeabi_memset4},
+ {RTLIB::AEABI_MEMSET8, RTLIB::__aeabi_memset8},
+ {RTLIB::AEABI_MEMCLR, RTLIB::__aeabi_memclr},
+ {RTLIB::AEABI_MEMCLR4, RTLIB::__aeabi_memclr4},
+ {RTLIB::AEABI_MEMCLR8, RTLIB::__aeabi_memclr8},
};
- for (const auto &LC : MemOpsLibraryCalls) {
+ for (const auto &LC : MemOpsLibraryCalls)
setLibcallImpl(LC.Op, LC.Impl);
- setLibcallImplCallingConv(LC.Impl, LC.CC);
- }
}
}
@@ -746,16 +731,14 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
static const struct {
const RTLIB::Libcall Op;
const RTLIB::LibcallImpl Impl;
- const CallingConv::ID CC;
} LibraryCalls[] = {
- {RTLIB::FPROUND_F32_F16, RTLIB::__aeabi_f2h, CallingConv::ARM_AAPCS},
- {RTLIB::FPROUND_F64_F16, RTLIB::__aeabi_d2h, CallingConv::ARM_AAPCS},
- {RTLIB::FPEXT_F16_F32, RTLIB::__aeabi_h2f, CallingConv::ARM_AAPCS},
+ {RTLIB::FPROUND_F32_F16, RTLIB::__aeabi_f2h},
+ {RTLIB::FPROUND_F64_F16, RTLIB::__aeabi_d2h},
+ {RTLIB::FPEXT_F16_F32, RTLIB::__aeabi_h2f},
};
for (const auto &LC : LibraryCalls) {
setLibcallImpl(LC.Op, LC.Impl);
- setLibcallImplCallingConv(LC.Impl, LC.CC);
}
} else if (!TT.isOSBinFormatMachO()) {
setLibcallImpl(RTLIB::FPROUND_F32_F16, RTLIB::__gnu_f2h_ieee);
|
4e8ecb3 to
effe1ad
Compare
7663236 to
b49694f
Compare
effe1ad to
1070967
Compare
f5915e2 to
b90e7ff
Compare
48fcd78 to
0daf2fa
Compare
57f1f29 to
ce9644f
Compare
0daf2fa to
66fa070
Compare
This was referenced Jul 8, 2025
66fa070 to
f06a7b1
Compare
30bc9f8 to
fe15c75
Compare
f06a7b1 to
e31b61b
Compare
This was referenced Jul 9, 2025
Contributor
Author
e31b61b to
1391620
Compare
Base automatically changed from
users/arsenm/runtime-libcalls/remove-table-soft-float-compare-types
to
main
July 9, 2025 08:14
This fully consolidates all the calling convention configuration into RuntimeLibcallInfo. I'm assuming that __aeabi functions have a universal calling convention, and on other ABIs just don't use them. This will enable splitting of RuntimeLibcallInfo into the ABI and lowering component.
fe15c75 to
3e51d0b
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

This fully consolidates all the calling convention configuration into
RuntimeLibcallInfo. I'm assuming that __aeabi functions have a universal
calling convention, and on other ABIs just don't use them. This will
enable splitting of RuntimeLibcallInfo into the ABI and lowering component.