1 //===- ReduceIRReferences.cpp - Specialized Delta Pass --------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements a function which calls the Generic Delta pass in order
10 // to remove backreferences to the IR from MIR. In particular, this will remove
11 // the Value references in MachineMemOperands.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #include "ReduceIRReferences.h"
16 #include "Delta.h"
17 #include "llvm/CodeGen/MachineFrameInfo.h"
18 
19 using namespace llvm;
20 
dropIRReferencesFromInstructions(Oracle & O,MachineFunction & MF)21 static void dropIRReferencesFromInstructions(Oracle &O, MachineFunction &MF) {
22   for (MachineBasicBlock &MBB : MF) {
23     for (MachineInstr &MI : MBB) {
24       if (!O.shouldKeep()) {
25         for (MachineMemOperand *MMO : MI.memoperands()) {
26           // Leave behind pseudo source values.
27           // TODO: Removing all MemOperand values is a further reduction step.
28           if (MMO->getPointerInfo().V.is<const Value *>())
29             MMO->setValue(static_cast<const Value *>(nullptr));
30         }
31 
32         // TODO: Try to remove GlobalValue references and metadata
33       }
34     }
35   }
36 }
37 
stripIRFromInstructions(Oracle & O,ReducerWorkItem & WorkItem)38 static void stripIRFromInstructions(Oracle &O, ReducerWorkItem &WorkItem) {
39   for (const Function &F : WorkItem.getModule()) {
40     if (auto *MF = WorkItem.MMI->getMachineFunction(F))
41       dropIRReferencesFromInstructions(O, *MF);
42   }
43 }
44 
stripIRFromBlocks(Oracle & O,ReducerWorkItem & WorkItem)45 static void stripIRFromBlocks(Oracle &O, ReducerWorkItem &WorkItem) {
46   for (const Function &F : WorkItem.getModule()) {
47     if (auto *MF = WorkItem.MMI->getMachineFunction(F)) {
48       for (MachineBasicBlock &MBB : *MF) {
49         if (!O.shouldKeep())
50           MBB.clearBasicBlock();
51       }
52     }
53   }
54 }
55 
stripIRFromFunctions(Oracle & O,ReducerWorkItem & WorkItem)56 static void stripIRFromFunctions(Oracle &O, ReducerWorkItem &WorkItem) {
57   for (const Function &F : WorkItem.getModule()) {
58     if (!O.shouldKeep()) {
59       if (auto *MF = WorkItem.MMI->getMachineFunction(F)) {
60         MachineFrameInfo &MFI = MF->getFrameInfo();
61         for (int I = MFI.getObjectIndexBegin(), E = MFI.getObjectIndexEnd();
62              I != E; ++I)
63           MFI.clearObjectAllocation(I);
64       }
65     }
66   }
67 }
68 
reduceIRInstructionReferencesDeltaPass(TestRunner & Test)69 void llvm::reduceIRInstructionReferencesDeltaPass(TestRunner &Test) {
70   outs() << "*** Reducing IR references from instructions...\n";
71   runDeltaPass(Test, stripIRFromInstructions);
72 }
73 
reduceIRBlockReferencesDeltaPass(TestRunner & Test)74 void llvm::reduceIRBlockReferencesDeltaPass(TestRunner &Test) {
75   outs() << "*** Reducing IR references from blocks...\n";
76   runDeltaPass(Test, stripIRFromBlocks);
77 }
78 
reduceIRFunctionReferencesDeltaPass(TestRunner & Test)79 void llvm::reduceIRFunctionReferencesDeltaPass(TestRunner &Test) {
80   outs() << "*** Reducing IR references from functions...\n";
81   runDeltaPass(Test, stripIRFromFunctions);
82 }
83