[llvm] [Internalize] Preserve built-in functions (PR #69216)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 16 07:36:26 PDT 2023
https://github.com/DianQK created https://github.com/llvm/llvm-project/pull/69216
Fixes #65965.
Related:
- https://github.com/rust-lang/rust/pull/113923
- e06bac4796bffed2b80649497afaadfb67d767cf
>From 157ba5686fe3cd46f6f9996796c0df196a802e07 Mon Sep 17 00:00:00 2001
From: DianQK <dianqk at dianqk.net>
Date: Mon, 16 Oct 2023 20:21:16 +0800
Subject: [PATCH 1/3] [Internalize] Pre-commit for built-in
---
llvm/test/Transforms/Internalize/built-in.ll | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
create mode 100644 llvm/test/Transforms/Internalize/built-in.ll
diff --git a/llvm/test/Transforms/Internalize/built-in.ll b/llvm/test/Transforms/Internalize/built-in.ll
new file mode 100644
index 000000000000000..311b2a90f294f05
--- /dev/null
+++ b/llvm/test/Transforms/Internalize/built-in.ll
@@ -0,0 +1,18 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
+; RUN: opt < %s -passes=internalize -S | FileCheck %s
+
+define i128 @__multi3(i128 %0, i128 %1) {
+; CHECK-LABEL: define internal i128 @__multi3(
+; CHECK-SAME: i128 [[TMP0:%.*]], i128 [[TMP1:%.*]]) {
+; CHECK-NEXT: ret i128 0
+;
+ ret i128 0
+}
+
+define i64 @__udivmoddi4(i64 %0, i64 %1, ptr %2) {
+; CHECK-LABEL: define internal i64 @__udivmoddi4(
+; CHECK-SAME: i64 [[TMP0:%.*]], i64 [[TMP1:%.*]], ptr [[TMP2:%.*]]) {
+; CHECK-NEXT: ret i64 0
+;
+ ret i64 0
+}
>From 50538c97894a363afb4b7b04b6541ad523a7631a Mon Sep 17 00:00:00 2001
From: DianQK <dianqk at dianqk.net>
Date: Mon, 16 Oct 2023 20:26:51 +0800
Subject: [PATCH 2/3] [Internalize] Preserve built-in functions
---
llvm/lib/Transforms/IPO/Internalize.cpp | 10 ++++++++++
llvm/test/Transforms/Internalize/built-in.ll | 2 +-
2 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/llvm/lib/Transforms/IPO/Internalize.cpp b/llvm/lib/Transforms/IPO/Internalize.cpp
index 0b8fde6489f8e76..2539699103bc056 100644
--- a/llvm/lib/Transforms/IPO/Internalize.cpp
+++ b/llvm/lib/Transforms/IPO/Internalize.cpp
@@ -51,6 +51,12 @@ static cl::list<std::string>
APIList("internalize-public-api-list", cl::value_desc("list"),
cl::desc("A list of symbol names to preserve"), cl::CommaSeparated);
+static const char *PreservedLibcallSymbols[] = {
+#define HANDLE_LIBCALL(code, name) name,
+#include "llvm/IR/RuntimeLibcalls.def"
+#undef HANDLE_LIBCALL
+};
+
namespace {
// Helper to load an API list to preserve from file and expose it as a functor
// for internalization.
@@ -127,6 +133,10 @@ bool InternalizePass::shouldPreserveGV(const GlobalValue &GV) {
if (AlwaysPreserved.count(GV.getName()))
return true;
+ // Preserve built-in functions
+ if (llvm::is_contained(PreservedLibcallSymbols, GV.getName()))
+ return true;
+
return MustPreserveGV(GV);
}
diff --git a/llvm/test/Transforms/Internalize/built-in.ll b/llvm/test/Transforms/Internalize/built-in.ll
index 311b2a90f294f05..8cb931f3a1d987f 100644
--- a/llvm/test/Transforms/Internalize/built-in.ll
+++ b/llvm/test/Transforms/Internalize/built-in.ll
@@ -2,7 +2,7 @@
; RUN: opt < %s -passes=internalize -S | FileCheck %s
define i128 @__multi3(i128 %0, i128 %1) {
-; CHECK-LABEL: define internal i128 @__multi3(
+; CHECK-LABEL: define i128 @__multi3(
; CHECK-SAME: i128 [[TMP0:%.*]], i128 [[TMP1:%.*]]) {
; CHECK-NEXT: ret i128 0
;
>From edbf0128cdeac3e914cc04812ae52b911da194ba Mon Sep 17 00:00:00 2001
From: DianQK <dianqk at dianqk.net>
Date: Mon, 16 Oct 2023 20:33:31 +0800
Subject: [PATCH 3/3] [IR] Add missing built-in functions
---
llvm/include/llvm/IR/RuntimeLibcalls.def | 89 ++++++++++++++++++--
llvm/test/Transforms/Internalize/built-in.ll | 2 +-
2 files changed, 84 insertions(+), 7 deletions(-)
diff --git a/llvm/include/llvm/IR/RuntimeLibcalls.def b/llvm/include/llvm/IR/RuntimeLibcalls.def
index 6ec98e278988428..3e09b998e6135d7 100644
--- a/llvm/include/llvm/IR/RuntimeLibcalls.def
+++ b/llvm/include/llvm/IR/RuntimeLibcalls.def
@@ -72,19 +72,53 @@ HANDLE_LIBCALL(UREM_I64, "__umoddi3")
HANDLE_LIBCALL(UREM_I128, "__umodti3")
HANDLE_LIBCALL(SDIVREM_I8, nullptr)
HANDLE_LIBCALL(SDIVREM_I16, nullptr)
-HANDLE_LIBCALL(SDIVREM_I32, nullptr)
-HANDLE_LIBCALL(SDIVREM_I64, nullptr)
-HANDLE_LIBCALL(SDIVREM_I128, nullptr)
+HANDLE_LIBCALL(SDIVREM_I32, "__divmodsi4")
+HANDLE_LIBCALL(SDIVREM_I64, "__divmoddi4")
+HANDLE_LIBCALL(SDIVREM_I128, "__divmodti4")
HANDLE_LIBCALL(UDIVREM_I8, nullptr)
HANDLE_LIBCALL(UDIVREM_I16, nullptr)
-HANDLE_LIBCALL(UDIVREM_I32, nullptr)
-HANDLE_LIBCALL(UDIVREM_I64, nullptr)
-HANDLE_LIBCALL(UDIVREM_I128, nullptr)
+HANDLE_LIBCALL(UDIVREM_I32, "__udivmodsi4")
+HANDLE_LIBCALL(UDIVREM_I64, "__udivmoddi4")
+HANDLE_LIBCALL(UDIVREM_I128, "__udivmodti4")
HANDLE_LIBCALL(NEG_I32, "__negsi2")
HANDLE_LIBCALL(NEG_I64, "__negdi2")
+HANDLE_LIBCALL(NEG_I128, "__negti2")
HANDLE_LIBCALL(CTLZ_I32, "__clzsi2")
HANDLE_LIBCALL(CTLZ_I64, "__clzdi2")
HANDLE_LIBCALL(CTLZ_I128, "__clzti2")
+HANDLE_LIBCALL(CTTZ_I32, "__ctzsi2")
+HANDLE_LIBCALL(CTTZ_I64, "__ctzdi2")
+HANDLE_LIBCALL(CTTZ_I128, "__ctzti2")
+HANDLE_LIBCALL(FFS_I32, "__ffssi2")
+HANDLE_LIBCALL(FFS_I64, "__ffsdi2")
+HANDLE_LIBCALL(FFS_I128, "__ffsti2")
+HANDLE_LIBCALL(PARITY_I32, "__paritysi2")
+HANDLE_LIBCALL(PARITY_I64, "__paritydi2")
+HANDLE_LIBCALL(PARITY_I128, "__parityti2")
+HANDLE_LIBCALL(POPCOUNT_I32, "__popcountsi2")
+HANDLE_LIBCALL(POPCOUNT_I64, "__popcountdi2")
+HANDLE_LIBCALL(POPCOUNT_I128, "__popcountti2")
+HANDLE_LIBCALL(BSWAP_I32, "__bswapsi2")
+HANDLE_LIBCALL(BSWAP_I64, "__bswapdi2")
+HANDLE_LIBCALL(ABSV_I32, "__absvsi2")
+HANDLE_LIBCALL(ABSV_I64, "__absvdi2")
+HANDLE_LIBCALL(ABSV_I128, "__absvti2")
+HANDLE_LIBCALL(NEGV_I32, "__negvsi2")
+HANDLE_LIBCALL(NEGV_I64, "__negvdi2")
+HANDLE_LIBCALL(NEGV_I128, "__negvti2")
+HANDLE_LIBCALL(ADDV_I32, "__addvsi3")
+HANDLE_LIBCALL(ADDV_I64, "__addvdi3")
+HANDLE_LIBCALL(ADDV_I128, "__addvti3")
+HANDLE_LIBCALL(SUBV_I32, "__subvsi3")
+HANDLE_LIBCALL(SUBV_I64, "__subvdi3")
+HANDLE_LIBCALL(SUBV_I128, "__subvti3")
+HANDLE_LIBCALL(MULV_I32, "__mulvsi3")
+HANDLE_LIBCALL(MULV_I64, "__mulvdi3")
+HANDLE_LIBCALL(MULV_I128, "__mulvti3")
+HANDLE_LIBCALL(CMP_I64, "__cmpdi2")
+HANDLE_LIBCALL(CMP_I128, "__cmpti2")
+HANDLE_LIBCALL(UCMP_I64, "__ucmpdi2")
+HANDLE_LIBCALL(UCMP_I128, "__ucmpti2")
// Floating-point
HANDLE_LIBCALL(ADD_F32, "__addsf3")
@@ -101,11 +135,19 @@ HANDLE_LIBCALL(MUL_F32, "__mulsf3")
HANDLE_LIBCALL(MUL_F64, "__muldf3")
HANDLE_LIBCALL(MUL_F80, "__mulxf3")
HANDLE_LIBCALL(MUL_F128, "__multf3")
+HANDLE_LIBCALL(MULC_F32, "__mulsc3")
+HANDLE_LIBCALL(MULC_F64, "__muldc3")
+HANDLE_LIBCALL(MULC_F80, "__mulxc3")
+HANDLE_LIBCALL(MULC_F128, "__multc3")
HANDLE_LIBCALL(MUL_PPCF128, "__gcc_qmul")
HANDLE_LIBCALL(DIV_F32, "__divsf3")
HANDLE_LIBCALL(DIV_F64, "__divdf3")
HANDLE_LIBCALL(DIV_F80, "__divxf3")
HANDLE_LIBCALL(DIV_F128, "__divtf3")
+HANDLE_LIBCALL(DIVC_F32, "__divsc3")
+HANDLE_LIBCALL(DIVC_F64, "__divdc3")
+HANDLE_LIBCALL(DIVC_F80, "__divxc3")
+HANDLE_LIBCALL(DIVC_F128, "__divtc3")
HANDLE_LIBCALL(DIV_PPCF128, "__gcc_qdiv")
HANDLE_LIBCALL(REM_F32, "fmodf")
HANDLE_LIBCALL(REM_F64, "fmod")
@@ -434,6 +476,41 @@ HANDLE_LIBCALL(UO_F64, "__unorddf2")
HANDLE_LIBCALL(UO_F128, "__unordtf2")
HANDLE_LIBCALL(UO_PPCF128, "__gcc_qunord")
+// VFP
+HANDLE_LIBCALL(VFP_ADD_F32, "__addsf3vfp")
+HANDLE_LIBCALL(VFP_ADD_F64, "__adddf3vfp")
+HANDLE_LIBCALL(VFP_DIV_F32, "__divsf3vfp")
+HANDLE_LIBCALL(VFP_DIV_F64, "__divdf3vfp")
+HANDLE_LIBCALL(VFP_OEQ_F32, "__eqsf2vfp")
+HANDLE_LIBCALL(VFP_OEQ_F64, "__eqdf2vfp")
+HANDLE_LIBCALL(VFP_FPEXT_F32_F64, "__extendsfdf2vfp")
+HANDLE_LIBCALL(VFP_FPTOSINT_F64_I32, "__fixdfsivfp")
+HANDLE_LIBCALL(VFP_FPTOSINT_F32_I32, "__fixsfsivfp")
+HANDLE_LIBCALL(VFP_FPTOUINT_F32_I32, "__fixunssfsivfp")
+HANDLE_LIBCALL(VFP_FPTOUINT_F64_I32, "__fixunsdfsivfp")
+HANDLE_LIBCALL(VFP_SINTTOFP_I32_F64, "__floatsidfvfp")
+HANDLE_LIBCALL(VFP_SINTTOFP_I32_F32, "__floatsisfvfp")
+HANDLE_LIBCALL(VFP_UINTTOFP_I32_F64, "__floatunssidfvfp")
+HANDLE_LIBCALL(VFP_UINTTOFP_I32_F32, "__floatunssisfvfp")
+HANDLE_LIBCALL(VFP_OGE_F64, "__gedf2vfp")
+HANDLE_LIBCALL(VFP_OGE_F32, "__gesf2vfp")
+HANDLE_LIBCALL(VFP_OGT_F64, "__gtdf2vfp")
+HANDLE_LIBCALL(VFP_OGT_F32, "__gtsf2vfp")
+HANDLE_LIBCALL(VFP_OLE_F64, "__ledf2vfp")
+HANDLE_LIBCALL(VFP_OLE_F32, "__lesf2vfp")
+HANDLE_LIBCALL(VFP_OLT_F64, "__ltdf2vfp")
+HANDLE_LIBCALL(VFP_OLT_F32, "__ltsf2vfp")
+HANDLE_LIBCALL(VFP_MUL_F64, "__muldf3vfp")
+HANDLE_LIBCALL(VFP_MUL_F32, "__mulsf3vfp")
+HANDLE_LIBCALL(VFP_UNE_F64, "__nedf2vfp")
+HANDLE_LIBCALL(VFP_NEG_F64, "__negdf2vfp")
+HANDLE_LIBCALL(VFP_NEG_F32, "__negsf2vfp")
+HANDLE_LIBCALL(VFP_SUB_F64, "__subdf3vfp")
+HANDLE_LIBCALL(VFP_SUB_F32, "__subsf3vfp")
+HANDLE_LIBCALL(VFP_FPROUND_F64_F32, "__truncdfsf2vfp")
+HANDLE_LIBCALL(VFP_UO_F64, "__unorddf2vfp")
+HANDLE_LIBCALL(VFP_UO_F32, "__unordsf2vfp")
+
// Memory
HANDLE_LIBCALL(MEMCPY, "memcpy")
HANDLE_LIBCALL(MEMMOVE, "memmove")
diff --git a/llvm/test/Transforms/Internalize/built-in.ll b/llvm/test/Transforms/Internalize/built-in.ll
index 8cb931f3a1d987f..e9aea0837098a78 100644
--- a/llvm/test/Transforms/Internalize/built-in.ll
+++ b/llvm/test/Transforms/Internalize/built-in.ll
@@ -10,7 +10,7 @@ define i128 @__multi3(i128 %0, i128 %1) {
}
define i64 @__udivmoddi4(i64 %0, i64 %1, ptr %2) {
-; CHECK-LABEL: define internal i64 @__udivmoddi4(
+; CHECK-LABEL: define i64 @__udivmoddi4(
; CHECK-SAME: i64 [[TMP0:%.*]], i64 [[TMP1:%.*]], ptr [[TMP2:%.*]]) {
; CHECK-NEXT: ret i64 0
;
More information about the llvm-commits
mailing list