brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.5 KiB · 231883f Raw
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