[llvm] 250de73 - [llvm-reduce] Add reduction for special globals like llvm.used.

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 11 03:25:31 PST 2020


Author: Florian Hahn
Date: 2020-11-11T11:25:05Z
New Revision: 250de7388b34500b1597d25af5c42f718ed28575

URL: https://github.com/llvm/llvm-project/commit/250de7388b34500b1597d25af5c42f718ed28575
DIFF: https://github.com/llvm/llvm-project/commit/250de7388b34500b1597d25af5c42f718ed28575.diff

LOG: [llvm-reduce] Add reduction for special globals like llvm.used.

This patch adds a reduction of 'special' globals that lead to further
reductions (e.g. alias or regular globals reduction) being less efficient
because there are special constraints on values referenced in those
special globals. For example, values in @llvm.used and
@llvm.compiler.used need to be named, so replacing all uses of an
alias/global with undef or a different unnamed constant results in
invalid IR.

More details:
https://llvm.org/docs/LangRef.html#intrinsic-global-variables

Reviewed By: lebedev.ri

Differential Revision: https://reviews.llvm.org/D90302

Added: 
    llvm/tools/llvm-reduce/deltas/ReduceSpecialGlobals.cpp
    llvm/tools/llvm-reduce/deltas/ReduceSpecialGlobals.h

Modified: 
    llvm/test/Reduce/remove-alias.ll
    llvm/tools/llvm-reduce/CMakeLists.txt
    llvm/tools/llvm-reduce/DeltaManager.h

Removed: 
    


################################################################################
diff  --git a/llvm/test/Reduce/remove-alias.ll b/llvm/test/Reduce/remove-alias.ll
index 48b39d26ee26..1859388f4387 100644
--- a/llvm/test/Reduce/remove-alias.ll
+++ b/llvm/test/Reduce/remove-alias.ll
@@ -5,15 +5,9 @@
 
 ; CHECK-INTERESTINGNESS: define void @fn3
 
-; CHECK-FINAL: @g1 = global
-; CHECK-FINAL: @g2 = global
-
-; CHECK-FINAL-NOT: $a1
-; CHECK-FINAL-NOT: $a2
-; CHECK-FINAL-NOT: $a3
-; CHECK-FINAL-NOT: $a4
-; CHECK-FINAL: $a5
-; CHECK-FINAL: $a6
+; CHECK-FINAL-NOT: global
+
+; CHECK-FINAL-NOT: = alias
 
 ; CHECK-FINAL-NOT: @llvm.used
 ; CHECK-FINAL-NOT: @llvm.compiler.used

diff  --git a/llvm/tools/llvm-reduce/CMakeLists.txt b/llvm/tools/llvm-reduce/CMakeLists.txt
index cbe9978c10a8..3d635d178a71 100644
--- a/llvm/tools/llvm-reduce/CMakeLists.txt
+++ b/llvm/tools/llvm-reduce/CMakeLists.txt
@@ -23,6 +23,7 @@ add_llvm_tool(llvm-reduce
   deltas/ReduceInstructions.cpp
   deltas/ReduceMetadata.cpp
   deltas/ReduceOperandBundles.cpp
+  deltas/ReduceSpecialGlobals.cpp
   llvm-reduce.cpp
 
   DEPENDS

diff  --git a/llvm/tools/llvm-reduce/DeltaManager.h b/llvm/tools/llvm-reduce/DeltaManager.h
index 8c9ccca69309..9c18da9793e7 100644
--- a/llvm/tools/llvm-reduce/DeltaManager.h
+++ b/llvm/tools/llvm-reduce/DeltaManager.h
@@ -23,11 +23,13 @@
 #include "deltas/ReduceInstructions.h"
 #include "deltas/ReduceMetadata.h"
 #include "deltas/ReduceOperandBundles.h"
+#include "deltas/ReduceSpecialGlobals.h"
 
 namespace llvm {
 
 // TODO: Add CLI option to run only specified Passes (for unit tests)
 inline void runDeltaPasses(TestRunner &Tester) {
+  reduceSpecialGlobalsDeltaPass(Tester);
   reduceAliasesDeltaPass(Tester);
   reduceFunctionBodiesDeltaPass(Tester);
   reduceFunctionsDeltaPass(Tester);

diff  --git a/llvm/tools/llvm-reduce/deltas/ReduceSpecialGlobals.cpp b/llvm/tools/llvm-reduce/deltas/ReduceSpecialGlobals.cpp
new file mode 100644
index 000000000000..dedeac8287f7
--- /dev/null
+++ b/llvm/tools/llvm-reduce/deltas/ReduceSpecialGlobals.cpp
@@ -0,0 +1,62 @@
+//===- ReduceSpecialGlobals.cpp - Specialized Delta Pass ------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements a function which calls the Generic Delta pass in order
+// to reduce special globals, like @llvm.used, in the provided Module.
+//
+// For more details about special globals, see
+// https://llvm.org/docs/LangRef.html#intrinsic-global-variables
+//
+//===----------------------------------------------------------------------===//
+
+#include "ReduceSpecialGlobals.h"
+#include "Delta.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/IR/Constants.h"
+#include "llvm/IR/GlobalValue.h"
+
+using namespace llvm;
+
+static StringRef SpecialGlobalNames[] = {"llvm.used", "llvm.compiler.used"};
+
+/// Removes all special globals aren't inside any of the
+/// desired Chunks.
+static void
+extractSpecialGlobalsFromModule(const std::vector<Chunk> &ChunksToKeep,
+                                Module *Program) {
+  Oracle O(ChunksToKeep);
+
+  for (StringRef Name : SpecialGlobalNames) {
+    if (auto *Used = Program->getNamedGlobal(Name)) {
+      Used->replaceAllUsesWith(UndefValue::get(Used->getType()));
+      Used->eraseFromParent();
+    }
+  }
+}
+
+/// Counts the amount of special globals and prints their
+/// respective name & index
+static int countSpecialGlobals(Module *Program) {
+  // TODO: Silence index with --quiet flag
+  errs() << "----------------------------\n";
+  errs() << "Special Globals Index Reference:\n";
+  int Count = 0;
+  for (StringRef Name : SpecialGlobalNames) {
+    if (auto *Used = Program->getNamedGlobal(Name))
+      errs() << "\t" << ++Count << ": " << Used->getName() << "\n";
+  }
+  errs() << "----------------------------\n";
+  return Count;
+}
+
+void llvm::reduceSpecialGlobalsDeltaPass(TestRunner &Test) {
+  errs() << "*** Reducing Special Globals ...\n";
+  int Functions = countSpecialGlobals(Test.getProgram());
+  runDeltaPass(Test, Functions, extractSpecialGlobalsFromModule);
+  errs() << "----------------------------\n";
+}

diff  --git a/llvm/tools/llvm-reduce/deltas/ReduceSpecialGlobals.h b/llvm/tools/llvm-reduce/deltas/ReduceSpecialGlobals.h
new file mode 100644
index 000000000000..52ecaed4cd91
--- /dev/null
+++ b/llvm/tools/llvm-reduce/deltas/ReduceSpecialGlobals.h
@@ -0,0 +1,21 @@
+//===- ReduceSpecialGlobals.h - Specialized Delta Pass --------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements a function which calls the Generic Delta pass in order
+// to reduce special globals, like @llvm.used, in the provided Module.
+//
+// For more details about special globals, see
+// https://llvm.org/docs/LangRef.html#intrinsic-global-variables
+//
+//===----------------------------------------------------------------------===//
+
+#include "Delta.h"
+
+namespace llvm {
+void reduceSpecialGlobalsDeltaPass(TestRunner &Test);
+} // namespace llvm


        


More information about the llvm-commits mailing list