72 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8//9// This file implements a function which calls the Generic Delta pass in order10// to remove backreferences to the IR from MIR. In particular, this will remove11// the Value references in MachineMemOperands.12//13//===----------------------------------------------------------------------===//14 15#include "ReduceIRReferences.h"16#include "llvm/CodeGen/MachineFrameInfo.h"17#include "llvm/CodeGen/MachineFunction.h"18#include "llvm/CodeGen/MachineModuleInfo.h"19 20using namespace llvm;21 22static void dropIRReferencesFromInstructions(Oracle &O, MachineFunction &MF) {23 for (MachineBasicBlock &MBB : MF) {24 for (MachineInstr &MI : MBB) {25 if (!O.shouldKeep()) {26 for (MachineMemOperand *MMO : MI.memoperands()) {27 // Leave behind pseudo source values.28 // TODO: Removing all MemOperand values is a further reduction step.29 if (isa<const Value *>(MMO->getPointerInfo().V))30 MMO->setValue(static_cast<const Value *>(nullptr));31 }32 33 // TODO: Try to remove GlobalValue references and metadata34 }35 }36 }37}38 39void llvm::reduceIRInstructionReferencesDeltaPass(Oracle &O,40 ReducerWorkItem &WorkItem) {41 for (const Function &F : WorkItem.getModule()) {42 if (auto *MF = WorkItem.MMI->getMachineFunction(F))43 dropIRReferencesFromInstructions(O, *MF);44 }45}46 47void llvm::reduceIRBlockReferencesDeltaPass(Oracle &O,48 ReducerWorkItem &WorkItem) {49 for (const Function &F : WorkItem.getModule()) {50 if (auto *MF = WorkItem.MMI->getMachineFunction(F)) {51 for (MachineBasicBlock &MBB : *MF) {52 if (!O.shouldKeep())53 MBB.clearBasicBlock();54 }55 }56 }57}58 59void llvm::reduceIRFunctionReferencesDeltaPass(Oracle &O,60 ReducerWorkItem &WorkItem) {61 for (const Function &F : WorkItem.getModule()) {62 if (!O.shouldKeep()) {63 if (auto *MF = WorkItem.MMI->getMachineFunction(F)) {64 MachineFrameInfo &MFI = MF->getFrameInfo();65 for (int I = MFI.getObjectIndexBegin(), E = MFI.getObjectIndexEnd();66 I != E; ++I)67 MFI.clearObjectAllocation(I);68 }69 }70 }71}72