//===- ReduceRegisterUses.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 uninteresting register uses from the MachineFunction. // //===----------------------------------------------------------------------===// #include "ReduceRegisterUses.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineModuleInfo.h" #include "llvm/CodeGen/MachineRegisterInfo.h" using namespace llvm; static void removeUsesFromFunction(Oracle &O, MachineFunction &MF) { MachineRegisterInfo &MRI = MF.getRegInfo(); for (MachineBasicBlock &MBB : MF) { for (MachineInstr &MI : MBB) { // Generic instructions are not supposed to have undef operands. if (isPreISelGenericOpcode(MI.getOpcode())) continue; int NumOperands = MI.getNumOperands(); int NumRequiredOps = MI.getNumExplicitOperands() + MI.getDesc().implicit_defs().size() + MI.getDesc().implicit_uses().size(); for (int I = NumOperands - 1; I >= 0; --I) { MachineOperand &MO = MI.getOperand(I); if (!MO.isReg() || !MO.readsReg()) continue; Register Reg = MO.getReg(); if (Reg.isPhysical() && MRI.isReserved(Reg)) continue; if (O.shouldKeep()) continue; // Remove implicit operands. If the register is part of the fixed // operand list, set to undef. if (I >= NumRequiredOps) MI.removeOperand(I); else MO.setIsUndef(); } } } } static void removeUsesFromModule(Oracle &O, ReducerWorkItem &WorkItem) { for (const Function &F : WorkItem.getModule()) { if (auto *MF = WorkItem.MMI->getMachineFunction(F)) removeUsesFromFunction(O, *MF); } } void llvm::reduceRegisterUsesMIRDeltaPass(TestRunner &Test) { runDeltaPass(Test, removeUsesFromModule, "Reducing register uses"); }