[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