[llvm-reduce] Reduce global value linkage
authorArthur Eubanks <aeubanks@google.com>
Mon, 17 Jul 2023 22:37:20 +0000 (15:37 -0700)
committerArthur Eubanks <aeubanks@google.com>
Mon, 17 Jul 2023 22:46:38 +0000 (15:46 -0700)
llvm/test/tools/llvm-reduce/reduce-linkage.ll [new file with mode: 0644]
llvm/tools/llvm-reduce/deltas/ReduceGlobalValues.cpp

diff --git a/llvm/test/tools/llvm-reduce/reduce-linkage.ll b/llvm/test/tools/llvm-reduce/reduce-linkage.ll
new file mode 100644 (file)
index 0000000..e7f3524
--- /dev/null
@@ -0,0 +1,22 @@
+; Test that llvm-reduce can remove function linkage.
+;
+; RUN: llvm-reduce --abort-on-invalid-reduction --delta-passes=global-values --test FileCheck --test-arg --check-prefixes=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t
+; RUN: FileCheck --check-prefix=CHECK-FINAL --implicit-check-not=internal %s < %t
+
+; CHECK-INTERESTINGNESS: define
+; CHECK-INTERESTINGNESS-SAME: void @f
+
+; CHECK-FINAL: define void @f()
+
+define void @f() {
+  ret void
+}
+
+; CHECK-INTERESTINGNESS: define
+; CHECK-INTERESTINGNESS-SAME: void @g
+
+; CHECK-FINAL: define void @g()
+
+define internal void @g() {
+  ret void
+}
index 470d5ba..224fe9c 100644 (file)
@@ -37,6 +37,10 @@ static bool shouldReduceThreadLocal(GlobalValue &GV) {
   return GV.isThreadLocal();
 }
 
+static bool shouldReduceLinkage(GlobalValue &GV) {
+  return !GV.hasExternalLinkage();
+}
+
 static void reduceGVs(Oracle &O, ReducerWorkItem &Program) {
   for (auto &GV : Program.getModule().global_values()) {
     if (shouldReduceDSOLocal(GV) && !O.shouldKeep())
@@ -54,6 +58,12 @@ static void reduceGVs(Oracle &O, ReducerWorkItem &Program) {
           GlobalValue::DLLStorageClassTypes::DefaultStorageClass);
     if (shouldReduceThreadLocal(GV) && !O.shouldKeep())
       GV.setThreadLocal(false);
+    if (shouldReduceLinkage(GV) && !O.shouldKeep()) {
+      bool IsImplicitDSOLocal = GV.isImplicitDSOLocal();
+      GV.setLinkage(GlobalValue::ExternalLinkage);
+      if (IsImplicitDSOLocal)
+        GV.setDSOLocal(false);
+    }
   }
 }