[llvm] 136c8f5 - [Reduce] Try turning function definitions into declarations first, NFCI-ish

Roman Lebedev via llvm-commits llvm-commits at lists.llvm.org
Sat Jul 25 11:51:32 PDT 2020


Author: Roman Lebedev
Date: 2020-07-25T21:43:36+03:00
New Revision: 136c8f50e96381ee9daf0ac3dbe524ba63d51560

URL: https://github.com/llvm/llvm-project/commit/136c8f50e96381ee9daf0ac3dbe524ba63d51560
DIFF: https://github.com/llvm/llvm-project/commit/136c8f50e96381ee9daf0ac3dbe524ba63d51560.diff

LOG: [Reduce] Try turning function definitions into declarations first, NFCI-ish

ReduceFunctions could do it, but it also replaces *all* calls with undef,
so if any of undef replacements makes reduction uninteresting,
it won't work.

ReduceBasicBlocks also could do it, but well, it may take many guesses
for all the blocks of a function to happen to be out-of-chunk,
which is not a very efficient way to go about it.

So let's just do this first.

Added: 
    llvm/test/Reduce/remove-function-bodies.ll
    llvm/tools/llvm-reduce/deltas/ReduceFunctionBodies.cpp
    llvm/tools/llvm-reduce/deltas/ReduceFunctionBodies.h

Modified: 
    llvm/tools/llvm-reduce/CMakeLists.txt
    llvm/tools/llvm-reduce/DeltaManager.h

Removed: 
    


################################################################################
diff  --git a/llvm/test/Reduce/remove-function-bodies.ll b/llvm/test/Reduce/remove-function-bodies.ll
new file mode 100644
index 000000000000..c70df0e38f3d
--- /dev/null
+++ b/llvm/test/Reduce/remove-function-bodies.ll
@@ -0,0 +1,17 @@
+; RUN: llvm-reduce --test FileCheck --test-arg --check-prefixes=CHECK-ALL,CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t
+; RUN: cat %t | FileCheck --check-prefixes=CHECK-ALL,CHECK-FINAL %s
+
+; CHECK-INTERESTINGNESS: @callee(
+; CHECK-FINAL: declare void @callee()
+define void @callee() {
+  ret void
+}
+
+; CHECK-ALL: define void @caller()
+define void @caller() {
+entry:
+; CHECK-ALL: call void @callee()
+; CHECK-ALL: ret void
+  call void @callee()
+  ret void
+}

diff  --git a/llvm/tools/llvm-reduce/CMakeLists.txt b/llvm/tools/llvm-reduce/CMakeLists.txt
index 01b9d0b4afe1..81b4e95eece5 100644
--- a/llvm/tools/llvm-reduce/CMakeLists.txt
+++ b/llvm/tools/llvm-reduce/CMakeLists.txt
@@ -16,6 +16,7 @@ add_llvm_tool(llvm-reduce
   deltas/ReduceArguments.cpp
   deltas/ReduceAttributes.cpp
   deltas/ReduceBasicBlocks.cpp
+  deltas/ReduceFunctionBodies.cpp
   deltas/ReduceFunctions.cpp
   deltas/ReduceGlobalVars.cpp
   deltas/ReduceInstructions.cpp

diff  --git a/llvm/tools/llvm-reduce/DeltaManager.h b/llvm/tools/llvm-reduce/DeltaManager.h
index b1a4ee0df4db..83278c88791b 100644
--- a/llvm/tools/llvm-reduce/DeltaManager.h
+++ b/llvm/tools/llvm-reduce/DeltaManager.h
@@ -16,6 +16,7 @@
 #include "deltas/ReduceArguments.h"
 #include "deltas/ReduceAttributes.h"
 #include "deltas/ReduceBasicBlocks.h"
+#include "deltas/ReduceFunctionBodies.h"
 #include "deltas/ReduceFunctions.h"
 #include "deltas/ReduceGlobalVars.h"
 #include "deltas/ReduceInstructions.h"
@@ -26,6 +27,7 @@ namespace llvm {
 
 // TODO: Add CLI option to run only specified Passes (for unit tests)
 inline void runDeltaPasses(TestRunner &Tester) {
+  reduceFunctionBodiesDeltaPass(Tester);
   reduceFunctionsDeltaPass(Tester);
   reduceBasicBlocksDeltaPass(Tester);
   reduceGlobalsDeltaPass(Tester);

diff  --git a/llvm/tools/llvm-reduce/deltas/ReduceFunctionBodies.cpp b/llvm/tools/llvm-reduce/deltas/ReduceFunctionBodies.cpp
new file mode 100644
index 000000000000..a047d42b50c5
--- /dev/null
+++ b/llvm/tools/llvm-reduce/deltas/ReduceFunctionBodies.cpp
@@ -0,0 +1,54 @@
+//===- ReduceFunctions.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 function bodies in the provided Module.
+//
+//===----------------------------------------------------------------------===//
+
+#include "ReduceFunctionBodies.h"
+#include "Delta.h"
+
+using namespace llvm;
+
+/// Removes all the bodies of defined functions that aren't inside any of the
+/// desired Chunks.
+static void
+extractFunctionBodiesFromModule(const std::vector<Chunk> &ChunksToKeep,
+                                Module *Program) {
+  Oracle O(ChunksToKeep);
+
+  // Delete out-of-chunk function bodies
+  std::vector<Function *> FuncDefsToReduce;
+  for (auto &F : *Program)
+    if (!F.isDeclaration() && !O.shouldKeep())
+      F.deleteBody();
+}
+
+/// Counts the amount of non-declaration functions and prints their
+/// respective name & index
+static int countFunctionDefinitions(Module *Program) {
+  // TODO: Silence index with --quiet flag
+  errs() << "----------------------------\n";
+  errs() << "Function Definition Index Reference:\n";
+  int FunctionDefinitionCount = 0;
+  for (auto &F : *Program)
+    if (!F.isDeclaration())
+      errs() << "\t" << ++FunctionDefinitionCount << ": " << F.getName()
+             << "\n";
+
+  errs() << "----------------------------\n";
+  return FunctionDefinitionCount;
+}
+
+void llvm::reduceFunctionBodiesDeltaPass(TestRunner &Test) {
+  errs() << "*** Reducing Function Bodies...\n";
+  int Functions = countFunctionDefinitions(Test.getProgram());
+  runDeltaPass(Test, Functions, extractFunctionBodiesFromModule);
+  errs() << "----------------------------\n";
+}

diff  --git a/llvm/tools/llvm-reduce/deltas/ReduceFunctionBodies.h b/llvm/tools/llvm-reduce/deltas/ReduceFunctionBodies.h
new file mode 100644
index 000000000000..8c06c2e4a1a9
--- /dev/null
+++ b/llvm/tools/llvm-reduce/deltas/ReduceFunctionBodies.h
@@ -0,0 +1,18 @@
+//===- ReduceFunctionBodies.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 function bodies in the provided Module.
+//
+//===----------------------------------------------------------------------===//
+
+#include "Delta.h"
+
+namespace llvm {
+void reduceFunctionBodiesDeltaPass(TestRunner &Test);
+} // namespace llvm


        


More information about the llvm-commits mailing list