[llvm] RuntimeLibcalls: Use iterable enum for libcall types (PR #143075)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 5 23:47:13 PDT 2025
https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/143075
>From 69edc26404bf27252d4bddbb9bd9c81381eb126a Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Fri, 6 Jun 2025 15:01:45 +0900
Subject: [PATCH 1/3] RuntimeLibcalls: Use iterable enum for libcall types
---
llvm/include/llvm/IR/RuntimeLibcalls.h | 13 +++++++++++++
llvm/lib/IR/RuntimeLibcalls.cpp | 17 +++++------------
llvm/lib/Target/ARM/ARMISelLowering.cpp | 9 +++++----
llvm/lib/Target/Lanai/LanaiISelLowering.cpp | 5 ++---
4 files changed, 25 insertions(+), 19 deletions(-)
diff --git a/llvm/include/llvm/IR/RuntimeLibcalls.h b/llvm/include/llvm/IR/RuntimeLibcalls.h
index 26c085031a48a..4f277198bbfad 100644
--- a/llvm/include/llvm/IR/RuntimeLibcalls.h
+++ b/llvm/include/llvm/IR/RuntimeLibcalls.h
@@ -15,6 +15,7 @@
#define LLVM_IR_RUNTIME_LIBCALLS_H
#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/Sequence.h"
#include "llvm/IR/CallingConv.h"
#include "llvm/Support/AtomicOrdering.h"
#include "llvm/Support/Compiler.h"
@@ -36,6 +37,18 @@ enum Libcall {
#include "llvm/IR/RuntimeLibcalls.def"
#undef HANDLE_LIBCALL
};
+} // namespace RTLIB
+
+template <> struct enum_iteration_traits<RTLIB::Libcall> {
+ static constexpr bool is_iterable = true;
+};
+
+namespace RTLIB {
+
+// Return an iterator over all Libcall values
+static inline auto libcalls() {
+ return enum_seq(static_cast<RTLIB::Libcall>(0), RTLIB::UNKNOWN_LIBCALL);
+}
/// A simple container for information about the supported runtime calls.
struct RuntimeLibcallsInfo {
diff --git a/llvm/lib/IR/RuntimeLibcalls.cpp b/llvm/lib/IR/RuntimeLibcalls.cpp
index ca45cd4b7b13c..9a71cd2b0f173 100644
--- a/llvm/lib/IR/RuntimeLibcalls.cpp
+++ b/llvm/lib/IR/RuntimeLibcalls.cpp
@@ -208,21 +208,14 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT) {
setLibcallName(RTLIB::FREXP_PPCF128, nullptr);
}
- // Disable most libcalls on AMDGPU.
- if (TT.isAMDGPU()) {
- for (int I = 0; I < RTLIB::UNKNOWN_LIBCALL; ++I) {
- if (I < RTLIB::ATOMIC_LOAD || I > RTLIB::ATOMIC_FETCH_NAND_16)
- setLibcallName(static_cast<RTLIB::Libcall>(I), nullptr);
+ // Disable most libcalls on AMDGPU and NVPTX
+ if (TT.isAMDGPU() || TT.isNVPTX()) {
+ for (RTLIB::Libcall LC : RTLIB::libcalls()) {
+ if (LC < RTLIB::ATOMIC_LOAD || LC > RTLIB::ATOMIC_FETCH_NAND_16)
+ setLibcallName(LC, nullptr);
}
}
- // Disable most libcalls on NVPTX.
- if (TT.isNVPTX()) {
- for (int I = 0; I < RTLIB::UNKNOWN_LIBCALL; ++I)
- if (I < RTLIB::ATOMIC_LOAD || I > RTLIB::ATOMIC_FETCH_NAND_16)
- setLibcallName(static_cast<RTLIB::Libcall>(I), nullptr);
- }
-
if (TT.isOSMSVCRT()) {
// MSVCRT doesn't have powi; fall back to pow
setLibcallName(RTLIB::POWI_F32, nullptr);
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp
index d156851d7e214..574281d12e3cb 100644
--- a/llvm/lib/Target/ARM/ARMISelLowering.cpp
+++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp
@@ -511,10 +511,11 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM,
if (!Subtarget->isTargetDarwin() && !Subtarget->isTargetIOS() &&
!Subtarget->isTargetWatchOS() && !Subtarget->isTargetDriverKit()) {
bool IsHFTarget = TM.Options.FloatABIType == FloatABI::Hard;
- for (int LCID = 0; LCID < RTLIB::UNKNOWN_LIBCALL; ++LCID)
- setLibcallCallingConv(static_cast<RTLIB::Libcall>(LCID),
- IsHFTarget ? CallingConv::ARM_AAPCS_VFP
- : CallingConv::ARM_AAPCS);
+
+ for (RTLIB::Libcall LC : RTLIB::libcalls()) {
+ setLibcallCallingConv(LC, IsHFTarget ? CallingConv::ARM_AAPCS_VFP
+ : CallingConv::ARM_AAPCS);
+ }
}
if (Subtarget->isTargetMachO()) {
diff --git a/llvm/lib/Target/Lanai/LanaiISelLowering.cpp b/llvm/lib/Target/Lanai/LanaiISelLowering.cpp
index 8b50eb2678af6..7781817aef71a 100644
--- a/llvm/lib/Target/Lanai/LanaiISelLowering.cpp
+++ b/llvm/lib/Target/Lanai/LanaiISelLowering.cpp
@@ -151,9 +151,8 @@ LanaiTargetLowering::LanaiTargetLowering(const TargetMachine &TM,
setMinimumJumpTableEntries(100);
// Use fast calling convention for library functions.
- for (int I = 0; I < RTLIB::UNKNOWN_LIBCALL; ++I) {
- setLibcallCallingConv(static_cast<RTLIB::Libcall>(I), CallingConv::Fast);
- }
+ for (RTLIB::Libcall LC : RTLIB::libcalls())
+ setLibcallCallingConv(LC, CallingConv::Fast);
MaxStoresPerMemset = 16; // For @llvm.memset -> sequence of stores
MaxStoresPerMemsetOptSize = 8;
>From 17d2c1215123c542a88f3c42efac343c8b41f96d Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Fri, 6 Jun 2025 15:46:52 +0900
Subject: [PATCH 2/3] Update llvm/lib/IR/RuntimeLibcalls.cpp
Co-authored-by: Daniel Kiss <daniel.kiss at arm.com>
---
llvm/lib/IR/RuntimeLibcalls.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/lib/IR/RuntimeLibcalls.cpp b/llvm/lib/IR/RuntimeLibcalls.cpp
index 9a71cd2b0f173..0936c7cc64f37 100644
--- a/llvm/lib/IR/RuntimeLibcalls.cpp
+++ b/llvm/lib/IR/RuntimeLibcalls.cpp
@@ -208,7 +208,7 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT) {
setLibcallName(RTLIB::FREXP_PPCF128, nullptr);
}
- // Disable most libcalls on AMDGPU and NVPTX
+ // Disable most libcalls on AMDGPU and NVPTX.
if (TT.isAMDGPU() || TT.isNVPTX()) {
for (RTLIB::Libcall LC : RTLIB::libcalls()) {
if (LC < RTLIB::ATOMIC_LOAD || LC > RTLIB::ATOMIC_FETCH_NAND_16)
>From 46c8706fa6017b36df93633235151013b2018a25 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Fri, 6 Jun 2025 15:47:05 +0900
Subject: [PATCH 3/3] Update llvm/include/llvm/IR/RuntimeLibcalls.h
Co-authored-by: Daniel Kiss <daniel.kiss at arm.com>
---
llvm/include/llvm/IR/RuntimeLibcalls.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/include/llvm/IR/RuntimeLibcalls.h b/llvm/include/llvm/IR/RuntimeLibcalls.h
index 4f277198bbfad..89e466ee5933d 100644
--- a/llvm/include/llvm/IR/RuntimeLibcalls.h
+++ b/llvm/include/llvm/IR/RuntimeLibcalls.h
@@ -45,7 +45,7 @@ template <> struct enum_iteration_traits<RTLIB::Libcall> {
namespace RTLIB {
-// Return an iterator over all Libcall values
+// Return an iterator over all Libcall values.
static inline auto libcalls() {
return enum_seq(static_cast<RTLIB::Libcall>(0), RTLIB::UNKNOWN_LIBCALL);
}
More information about the llvm-commits
mailing list