aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-reduce/deltas/ReduceIRReferences.cpp
diff options
context:
space:
mode:
authorMichael Kruse <llvm-project@meinersbur.de>2022-05-06 02:43:49 -0500
committerMichael Kruse <llvm-project@meinersbur.de>2022-05-06 02:43:49 -0500
commitd3460d2a890ccb4ee84ffd05d4a722ff82b5170d (patch)
tree19c511c63d14da385bc907b4aa99276b8636dc1a /llvm/tools/llvm-reduce/deltas/ReduceIRReferences.cpp
parentfdb6ddcfeb62be7dbc502a4a4ed7c5be11c1c9b6 (diff)
parent9c1085c7e20bdd7c4a487f50313ebeeb2b6683b8 (diff)
downloadllvm-users/meinersbur/irbuilder-ompregion.zip
llvm-users/meinersbur/irbuilder-ompregion.tar.gz
llvm-users/meinersbur/irbuilder-ompregion.tar.bz2
Merge branch 'main' into irbuilder-ompregionusers/meinersbur/irbuilder-ompregion
Diffstat (limited to 'llvm/tools/llvm-reduce/deltas/ReduceIRReferences.cpp')
-rw-r--r--llvm/tools/llvm-reduce/deltas/ReduceIRReferences.cpp82
1 files changed, 82 insertions, 0 deletions
diff --git a/llvm/tools/llvm-reduce/deltas/ReduceIRReferences.cpp b/llvm/tools/llvm-reduce/deltas/ReduceIRReferences.cpp
new file mode 100644
index 0000000..975bdc2
--- /dev/null
+++ b/llvm/tools/llvm-reduce/deltas/ReduceIRReferences.cpp
@@ -0,0 +1,82 @@
+//===- ReduceIRReferences.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 remove backreferences to the IR from MIR. In particular, this will remove
+// the Value references in MachineMemOperands.
+//
+//===----------------------------------------------------------------------===//
+
+#include "ReduceIRReferences.h"
+#include "Delta.h"
+#include "llvm/CodeGen/MachineFrameInfo.h"
+
+using namespace llvm;
+
+static void dropIRReferencesFromInstructions(Oracle &O, MachineFunction &MF) {
+ for (MachineBasicBlock &MBB : MF) {
+ for (MachineInstr &MI : MBB) {
+ if (!O.shouldKeep()) {
+ for (MachineMemOperand *MMO : MI.memoperands()) {
+ // Leave behind pseudo source values.
+ // TODO: Removing all MemOperand values is a further reduction step.
+ if (MMO->getPointerInfo().V.is<const Value *>())
+ MMO->setValue(static_cast<const Value *>(nullptr));
+ }
+
+ // TODO: Try to remove GlobalValue references and metadata
+ }
+ }
+ }
+}
+
+static void stripIRFromInstructions(Oracle &O, ReducerWorkItem &WorkItem) {
+ for (const Function &F : WorkItem.getModule()) {
+ if (auto *MF = WorkItem.MMI->getMachineFunction(F))
+ dropIRReferencesFromInstructions(O, *MF);
+ }
+}
+
+static void stripIRFromBlocks(Oracle &O, ReducerWorkItem &WorkItem) {
+ for (const Function &F : WorkItem.getModule()) {
+ if (auto *MF = WorkItem.MMI->getMachineFunction(F)) {
+ for (MachineBasicBlock &MBB : *MF) {
+ if (!O.shouldKeep())
+ MBB.clearBasicBlock();
+ }
+ }
+ }
+}
+
+static void stripIRFromFunctions(Oracle &O, ReducerWorkItem &WorkItem) {
+ for (const Function &F : WorkItem.getModule()) {
+ if (!O.shouldKeep()) {
+ if (auto *MF = WorkItem.MMI->getMachineFunction(F)) {
+ MachineFrameInfo &MFI = MF->getFrameInfo();
+ for (int I = MFI.getObjectIndexBegin(), E = MFI.getObjectIndexEnd();
+ I != E; ++I)
+ MFI.clearObjectAllocation(I);
+ }
+ }
+ }
+}
+
+void llvm::reduceIRInstructionReferencesDeltaPass(TestRunner &Test) {
+ outs() << "*** Reducing IR references from instructions...\n";
+ runDeltaPass(Test, stripIRFromInstructions);
+}
+
+void llvm::reduceIRBlockReferencesDeltaPass(TestRunner &Test) {
+ outs() << "*** Reducing IR references from blocks...\n";
+ runDeltaPass(Test, stripIRFromBlocks);
+}
+
+void llvm::reduceIRFunctionReferencesDeltaPass(TestRunner &Test) {
+ outs() << "*** Reducing IR references from functions...\n";
+ runDeltaPass(Test, stripIRFromFunctions);
+}