1*09467b48Spatrick //===- MachineCopyPropagation.cpp - Machine Copy Propagation Pass ---------===// 2*09467b48Spatrick // 3*09467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*09467b48Spatrick // See https://llvm.org/LICENSE.txt for license information. 5*09467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*09467b48Spatrick // 7*09467b48Spatrick //===----------------------------------------------------------------------===// 8*09467b48Spatrick // 9*09467b48Spatrick // This is an extremely simple MachineInstr-level copy propagation pass. 10*09467b48Spatrick // 11*09467b48Spatrick // This pass forwards the source of COPYs to the users of their destinations 12*09467b48Spatrick // when doing so is legal. For example: 13*09467b48Spatrick // 14*09467b48Spatrick // %reg1 = COPY %reg0 15*09467b48Spatrick // ... 16*09467b48Spatrick // ... = OP %reg1 17*09467b48Spatrick // 18*09467b48Spatrick // If 19*09467b48Spatrick // - %reg0 has not been clobbered by the time of the use of %reg1 20*09467b48Spatrick // - the register class constraints are satisfied 21*09467b48Spatrick // - the COPY def is the only value that reaches OP 22*09467b48Spatrick // then this pass replaces the above with: 23*09467b48Spatrick // 24*09467b48Spatrick // %reg1 = COPY %reg0 25*09467b48Spatrick // ... 26*09467b48Spatrick // ... = OP %reg0 27*09467b48Spatrick // 28*09467b48Spatrick // This pass also removes some redundant COPYs. For example: 29*09467b48Spatrick // 30*09467b48Spatrick // %R1 = COPY %R0 31*09467b48Spatrick // ... // No clobber of %R1 32*09467b48Spatrick // %R0 = COPY %R1 <<< Removed 33*09467b48Spatrick // 34*09467b48Spatrick // or 35*09467b48Spatrick // 36*09467b48Spatrick // %R1 = COPY %R0 37*09467b48Spatrick // ... // No clobber of %R0 38*09467b48Spatrick // %R1 = COPY %R0 <<< Removed 39*09467b48Spatrick // 40*09467b48Spatrick // or 41*09467b48Spatrick // 42*09467b48Spatrick // $R0 = OP ... 43*09467b48Spatrick // ... // No read/clobber of $R0 and $R1 44*09467b48Spatrick // $R1 = COPY $R0 // $R0 is killed 45*09467b48Spatrick // Replace $R0 with $R1 and remove the COPY 46*09467b48Spatrick // $R1 = OP ... 47*09467b48Spatrick // ... 48*09467b48Spatrick // 49*09467b48Spatrick //===----------------------------------------------------------------------===// 50*09467b48Spatrick 51*09467b48Spatrick #include "llvm/ADT/DenseMap.h" 52*09467b48Spatrick #include "llvm/ADT/STLExtras.h" 53*09467b48Spatrick #include "llvm/ADT/SetVector.h" 54*09467b48Spatrick #include "llvm/ADT/SmallVector.h" 55*09467b48Spatrick #include "llvm/ADT/Statistic.h" 56*09467b48Spatrick #include "llvm/ADT/iterator_range.h" 57*09467b48Spatrick #include "llvm/CodeGen/MachineBasicBlock.h" 58*09467b48Spatrick #include "llvm/CodeGen/MachineFunction.h" 59*09467b48Spatrick #include "llvm/CodeGen/MachineFunctionPass.h" 60*09467b48Spatrick #include "llvm/CodeGen/MachineInstr.h" 61*09467b48Spatrick #include "llvm/CodeGen/MachineOperand.h" 62*09467b48Spatrick #include "llvm/CodeGen/MachineRegisterInfo.h" 63*09467b48Spatrick #include "llvm/CodeGen/TargetInstrInfo.h" 64*09467b48Spatrick #include "llvm/CodeGen/TargetRegisterInfo.h" 65*09467b48Spatrick #include "llvm/CodeGen/TargetSubtargetInfo.h" 66*09467b48Spatrick #include "llvm/InitializePasses.h" 67*09467b48Spatrick #include "llvm/MC/MCRegisterInfo.h" 68*09467b48Spatrick #include "llvm/Pass.h" 69*09467b48Spatrick #include "llvm/Support/Debug.h" 70*09467b48Spatrick #include "llvm/Support/DebugCounter.h" 71*09467b48Spatrick #include "llvm/Support/raw_ostream.h" 72*09467b48Spatrick #include <cassert> 73*09467b48Spatrick #include <iterator> 74*09467b48Spatrick 75*09467b48Spatrick using namespace llvm; 76*09467b48Spatrick 77*09467b48Spatrick #define DEBUG_TYPE "machine-cp" 78*09467b48Spatrick 79*09467b48Spatrick STATISTIC(NumDeletes, "Number of dead copies deleted"); 80*09467b48Spatrick STATISTIC(NumCopyForwards, "Number of copy uses forwarded"); 81*09467b48Spatrick STATISTIC(NumCopyBackwardPropagated, "Number of copy defs backward propagated"); 82*09467b48Spatrick DEBUG_COUNTER(FwdCounter, "machine-cp-fwd", 83*09467b48Spatrick "Controls which register COPYs are forwarded"); 84*09467b48Spatrick 85*09467b48Spatrick namespace { 86*09467b48Spatrick 87*09467b48Spatrick class CopyTracker { 88*09467b48Spatrick struct CopyInfo { 89*09467b48Spatrick MachineInstr *MI; 90*09467b48Spatrick SmallVector<unsigned, 4> DefRegs; 91*09467b48Spatrick bool Avail; 92*09467b48Spatrick }; 93*09467b48Spatrick 94*09467b48Spatrick DenseMap<unsigned, CopyInfo> Copies; 95*09467b48Spatrick 96*09467b48Spatrick public: 97*09467b48Spatrick /// Mark all of the given registers and their subregisters as unavailable for 98*09467b48Spatrick /// copying. 99*09467b48Spatrick void markRegsUnavailable(ArrayRef<unsigned> Regs, 100*09467b48Spatrick const TargetRegisterInfo &TRI) { 101*09467b48Spatrick for (unsigned Reg : Regs) { 102*09467b48Spatrick // Source of copy is no longer available for propagation. 103*09467b48Spatrick for (MCRegUnitIterator RUI(Reg, &TRI); RUI.isValid(); ++RUI) { 104*09467b48Spatrick auto CI = Copies.find(*RUI); 105*09467b48Spatrick if (CI != Copies.end()) 106*09467b48Spatrick CI->second.Avail = false; 107*09467b48Spatrick } 108*09467b48Spatrick } 109*09467b48Spatrick } 110*09467b48Spatrick 111*09467b48Spatrick /// Remove register from copy maps. 112*09467b48Spatrick void invalidateRegister(unsigned Reg, const TargetRegisterInfo &TRI) { 113*09467b48Spatrick // Since Reg might be a subreg of some registers, only invalidate Reg is not 114*09467b48Spatrick // enough. We have to find the COPY defines Reg or registers defined by Reg 115*09467b48Spatrick // and invalidate all of them. 116*09467b48Spatrick DenseSet<unsigned> RegsToInvalidate{Reg}; 117*09467b48Spatrick for (MCRegUnitIterator RUI(Reg, &TRI); RUI.isValid(); ++RUI) { 118*09467b48Spatrick auto I = Copies.find(*RUI); 119*09467b48Spatrick if (I != Copies.end()) { 120*09467b48Spatrick if (MachineInstr *MI = I->second.MI) { 121*09467b48Spatrick RegsToInvalidate.insert(MI->getOperand(0).getReg()); 122*09467b48Spatrick RegsToInvalidate.insert(MI->getOperand(1).getReg()); 123*09467b48Spatrick } 124*09467b48Spatrick RegsToInvalidate.insert(I->second.DefRegs.begin(), 125*09467b48Spatrick I->second.DefRegs.end()); 126*09467b48Spatrick } 127*09467b48Spatrick } 128*09467b48Spatrick for (unsigned InvalidReg : RegsToInvalidate) 129*09467b48Spatrick for (MCRegUnitIterator RUI(InvalidReg, &TRI); RUI.isValid(); ++RUI) 130*09467b48Spatrick Copies.erase(*RUI); 131*09467b48Spatrick } 132*09467b48Spatrick 133*09467b48Spatrick /// Clobber a single register, removing it from the tracker's copy maps. 134*09467b48Spatrick void clobberRegister(unsigned Reg, const TargetRegisterInfo &TRI) { 135*09467b48Spatrick for (MCRegUnitIterator RUI(Reg, &TRI); RUI.isValid(); ++RUI) { 136*09467b48Spatrick auto I = Copies.find(*RUI); 137*09467b48Spatrick if (I != Copies.end()) { 138*09467b48Spatrick // When we clobber the source of a copy, we need to clobber everything 139*09467b48Spatrick // it defined. 140*09467b48Spatrick markRegsUnavailable(I->second.DefRegs, TRI); 141*09467b48Spatrick // When we clobber the destination of a copy, we need to clobber the 142*09467b48Spatrick // whole register it defined. 143*09467b48Spatrick if (MachineInstr *MI = I->second.MI) 144*09467b48Spatrick markRegsUnavailable({MI->getOperand(0).getReg()}, TRI); 145*09467b48Spatrick // Now we can erase the copy. 146*09467b48Spatrick Copies.erase(I); 147*09467b48Spatrick } 148*09467b48Spatrick } 149*09467b48Spatrick } 150*09467b48Spatrick 151*09467b48Spatrick /// Add this copy's registers into the tracker's copy maps. 152*09467b48Spatrick void trackCopy(MachineInstr *MI, const TargetRegisterInfo &TRI) { 153*09467b48Spatrick assert(MI->isCopy() && "Tracking non-copy?"); 154*09467b48Spatrick 155*09467b48Spatrick Register Def = MI->getOperand(0).getReg(); 156*09467b48Spatrick Register Src = MI->getOperand(1).getReg(); 157*09467b48Spatrick 158*09467b48Spatrick // Remember Def is defined by the copy. 159*09467b48Spatrick for (MCRegUnitIterator RUI(Def, &TRI); RUI.isValid(); ++RUI) 160*09467b48Spatrick Copies[*RUI] = {MI, {}, true}; 161*09467b48Spatrick 162*09467b48Spatrick // Remember source that's copied to Def. Once it's clobbered, then 163*09467b48Spatrick // it's no longer available for copy propagation. 164*09467b48Spatrick for (MCRegUnitIterator RUI(Src, &TRI); RUI.isValid(); ++RUI) { 165*09467b48Spatrick auto I = Copies.insert({*RUI, {nullptr, {}, false}}); 166*09467b48Spatrick auto &Copy = I.first->second; 167*09467b48Spatrick if (!is_contained(Copy.DefRegs, Def)) 168*09467b48Spatrick Copy.DefRegs.push_back(Def); 169*09467b48Spatrick } 170*09467b48Spatrick } 171*09467b48Spatrick 172*09467b48Spatrick bool hasAnyCopies() { 173*09467b48Spatrick return !Copies.empty(); 174*09467b48Spatrick } 175*09467b48Spatrick 176*09467b48Spatrick MachineInstr *findCopyForUnit(unsigned RegUnit, const TargetRegisterInfo &TRI, 177*09467b48Spatrick bool MustBeAvailable = false) { 178*09467b48Spatrick auto CI = Copies.find(RegUnit); 179*09467b48Spatrick if (CI == Copies.end()) 180*09467b48Spatrick return nullptr; 181*09467b48Spatrick if (MustBeAvailable && !CI->second.Avail) 182*09467b48Spatrick return nullptr; 183*09467b48Spatrick return CI->second.MI; 184*09467b48Spatrick } 185*09467b48Spatrick 186*09467b48Spatrick MachineInstr *findCopyDefViaUnit(unsigned RegUnit, 187*09467b48Spatrick const TargetRegisterInfo &TRI) { 188*09467b48Spatrick auto CI = Copies.find(RegUnit); 189*09467b48Spatrick if (CI == Copies.end()) 190*09467b48Spatrick return nullptr; 191*09467b48Spatrick if (CI->second.DefRegs.size() != 1) 192*09467b48Spatrick return nullptr; 193*09467b48Spatrick MCRegUnitIterator RUI(CI->second.DefRegs[0], &TRI); 194*09467b48Spatrick return findCopyForUnit(*RUI, TRI, true); 195*09467b48Spatrick } 196*09467b48Spatrick 197*09467b48Spatrick MachineInstr *findAvailBackwardCopy(MachineInstr &I, unsigned Reg, 198*09467b48Spatrick const TargetRegisterInfo &TRI) { 199*09467b48Spatrick MCRegUnitIterator RUI(Reg, &TRI); 200*09467b48Spatrick MachineInstr *AvailCopy = findCopyDefViaUnit(*RUI, TRI); 201*09467b48Spatrick if (!AvailCopy || 202*09467b48Spatrick !TRI.isSubRegisterEq(AvailCopy->getOperand(1).getReg(), Reg)) 203*09467b48Spatrick return nullptr; 204*09467b48Spatrick 205*09467b48Spatrick Register AvailSrc = AvailCopy->getOperand(1).getReg(); 206*09467b48Spatrick Register AvailDef = AvailCopy->getOperand(0).getReg(); 207*09467b48Spatrick for (const MachineInstr &MI : 208*09467b48Spatrick make_range(AvailCopy->getReverseIterator(), I.getReverseIterator())) 209*09467b48Spatrick for (const MachineOperand &MO : MI.operands()) 210*09467b48Spatrick if (MO.isRegMask()) 211*09467b48Spatrick // FIXME: Shall we simultaneously invalidate AvailSrc or AvailDef? 212*09467b48Spatrick if (MO.clobbersPhysReg(AvailSrc) || MO.clobbersPhysReg(AvailDef)) 213*09467b48Spatrick return nullptr; 214*09467b48Spatrick 215*09467b48Spatrick return AvailCopy; 216*09467b48Spatrick } 217*09467b48Spatrick 218*09467b48Spatrick MachineInstr *findAvailCopy(MachineInstr &DestCopy, unsigned Reg, 219*09467b48Spatrick const TargetRegisterInfo &TRI) { 220*09467b48Spatrick // We check the first RegUnit here, since we'll only be interested in the 221*09467b48Spatrick // copy if it copies the entire register anyway. 222*09467b48Spatrick MCRegUnitIterator RUI(Reg, &TRI); 223*09467b48Spatrick MachineInstr *AvailCopy = 224*09467b48Spatrick findCopyForUnit(*RUI, TRI, /*MustBeAvailable=*/true); 225*09467b48Spatrick if (!AvailCopy || 226*09467b48Spatrick !TRI.isSubRegisterEq(AvailCopy->getOperand(0).getReg(), Reg)) 227*09467b48Spatrick return nullptr; 228*09467b48Spatrick 229*09467b48Spatrick // Check that the available copy isn't clobbered by any regmasks between 230*09467b48Spatrick // itself and the destination. 231*09467b48Spatrick Register AvailSrc = AvailCopy->getOperand(1).getReg(); 232*09467b48Spatrick Register AvailDef = AvailCopy->getOperand(0).getReg(); 233*09467b48Spatrick for (const MachineInstr &MI : 234*09467b48Spatrick make_range(AvailCopy->getIterator(), DestCopy.getIterator())) 235*09467b48Spatrick for (const MachineOperand &MO : MI.operands()) 236*09467b48Spatrick if (MO.isRegMask()) 237*09467b48Spatrick if (MO.clobbersPhysReg(AvailSrc) || MO.clobbersPhysReg(AvailDef)) 238*09467b48Spatrick return nullptr; 239*09467b48Spatrick 240*09467b48Spatrick return AvailCopy; 241*09467b48Spatrick } 242*09467b48Spatrick 243*09467b48Spatrick void clear() { 244*09467b48Spatrick Copies.clear(); 245*09467b48Spatrick } 246*09467b48Spatrick }; 247*09467b48Spatrick 248*09467b48Spatrick class MachineCopyPropagation : public MachineFunctionPass { 249*09467b48Spatrick const TargetRegisterInfo *TRI; 250*09467b48Spatrick const TargetInstrInfo *TII; 251*09467b48Spatrick const MachineRegisterInfo *MRI; 252*09467b48Spatrick 253*09467b48Spatrick public: 254*09467b48Spatrick static char ID; // Pass identification, replacement for typeid 255*09467b48Spatrick 256*09467b48Spatrick MachineCopyPropagation() : MachineFunctionPass(ID) { 257*09467b48Spatrick initializeMachineCopyPropagationPass(*PassRegistry::getPassRegistry()); 258*09467b48Spatrick } 259*09467b48Spatrick 260*09467b48Spatrick void getAnalysisUsage(AnalysisUsage &AU) const override { 261*09467b48Spatrick AU.setPreservesCFG(); 262*09467b48Spatrick MachineFunctionPass::getAnalysisUsage(AU); 263*09467b48Spatrick } 264*09467b48Spatrick 265*09467b48Spatrick bool runOnMachineFunction(MachineFunction &MF) override; 266*09467b48Spatrick 267*09467b48Spatrick MachineFunctionProperties getRequiredProperties() const override { 268*09467b48Spatrick return MachineFunctionProperties().set( 269*09467b48Spatrick MachineFunctionProperties::Property::NoVRegs); 270*09467b48Spatrick } 271*09467b48Spatrick 272*09467b48Spatrick private: 273*09467b48Spatrick typedef enum { DebugUse = false, RegularUse = true } DebugType; 274*09467b48Spatrick 275*09467b48Spatrick void ClobberRegister(unsigned Reg); 276*09467b48Spatrick void ReadRegister(unsigned Reg, MachineInstr &Reader, 277*09467b48Spatrick DebugType DT); 278*09467b48Spatrick void ForwardCopyPropagateBlock(MachineBasicBlock &MBB); 279*09467b48Spatrick void BackwardCopyPropagateBlock(MachineBasicBlock &MBB); 280*09467b48Spatrick bool eraseIfRedundant(MachineInstr &Copy, unsigned Src, unsigned Def); 281*09467b48Spatrick void forwardUses(MachineInstr &MI); 282*09467b48Spatrick void propagateDefs(MachineInstr &MI); 283*09467b48Spatrick bool isForwardableRegClassCopy(const MachineInstr &Copy, 284*09467b48Spatrick const MachineInstr &UseI, unsigned UseIdx); 285*09467b48Spatrick bool isBackwardPropagatableRegClassCopy(const MachineInstr &Copy, 286*09467b48Spatrick const MachineInstr &UseI, 287*09467b48Spatrick unsigned UseIdx); 288*09467b48Spatrick bool hasImplicitOverlap(const MachineInstr &MI, const MachineOperand &Use); 289*09467b48Spatrick 290*09467b48Spatrick /// Candidates for deletion. 291*09467b48Spatrick SmallSetVector<MachineInstr *, 8> MaybeDeadCopies; 292*09467b48Spatrick 293*09467b48Spatrick /// Multimap tracking debug users in current BB 294*09467b48Spatrick DenseMap<MachineInstr*, SmallVector<MachineInstr*, 2>> CopyDbgUsers; 295*09467b48Spatrick 296*09467b48Spatrick CopyTracker Tracker; 297*09467b48Spatrick 298*09467b48Spatrick bool Changed; 299*09467b48Spatrick }; 300*09467b48Spatrick 301*09467b48Spatrick } // end anonymous namespace 302*09467b48Spatrick 303*09467b48Spatrick char MachineCopyPropagation::ID = 0; 304*09467b48Spatrick 305*09467b48Spatrick char &llvm::MachineCopyPropagationID = MachineCopyPropagation::ID; 306*09467b48Spatrick 307*09467b48Spatrick INITIALIZE_PASS(MachineCopyPropagation, DEBUG_TYPE, 308*09467b48Spatrick "Machine Copy Propagation Pass", false, false) 309*09467b48Spatrick 310*09467b48Spatrick void MachineCopyPropagation::ReadRegister(unsigned Reg, MachineInstr &Reader, 311*09467b48Spatrick DebugType DT) { 312*09467b48Spatrick // If 'Reg' is defined by a copy, the copy is no longer a candidate 313*09467b48Spatrick // for elimination. If a copy is "read" by a debug user, record the user 314*09467b48Spatrick // for propagation. 315*09467b48Spatrick for (MCRegUnitIterator RUI(Reg, TRI); RUI.isValid(); ++RUI) { 316*09467b48Spatrick if (MachineInstr *Copy = Tracker.findCopyForUnit(*RUI, *TRI)) { 317*09467b48Spatrick if (DT == RegularUse) { 318*09467b48Spatrick LLVM_DEBUG(dbgs() << "MCP: Copy is used - not dead: "; Copy->dump()); 319*09467b48Spatrick MaybeDeadCopies.remove(Copy); 320*09467b48Spatrick } else { 321*09467b48Spatrick CopyDbgUsers[Copy].push_back(&Reader); 322*09467b48Spatrick } 323*09467b48Spatrick } 324*09467b48Spatrick } 325*09467b48Spatrick } 326*09467b48Spatrick 327*09467b48Spatrick /// Return true if \p PreviousCopy did copy register \p Src to register \p Def. 328*09467b48Spatrick /// This fact may have been obscured by sub register usage or may not be true at 329*09467b48Spatrick /// all even though Src and Def are subregisters of the registers used in 330*09467b48Spatrick /// PreviousCopy. e.g. 331*09467b48Spatrick /// isNopCopy("ecx = COPY eax", AX, CX) == true 332*09467b48Spatrick /// isNopCopy("ecx = COPY eax", AH, CL) == false 333*09467b48Spatrick static bool isNopCopy(const MachineInstr &PreviousCopy, unsigned Src, 334*09467b48Spatrick unsigned Def, const TargetRegisterInfo *TRI) { 335*09467b48Spatrick Register PreviousSrc = PreviousCopy.getOperand(1).getReg(); 336*09467b48Spatrick Register PreviousDef = PreviousCopy.getOperand(0).getReg(); 337*09467b48Spatrick if (Src == PreviousSrc) { 338*09467b48Spatrick assert(Def == PreviousDef); 339*09467b48Spatrick return true; 340*09467b48Spatrick } 341*09467b48Spatrick if (!TRI->isSubRegister(PreviousSrc, Src)) 342*09467b48Spatrick return false; 343*09467b48Spatrick unsigned SubIdx = TRI->getSubRegIndex(PreviousSrc, Src); 344*09467b48Spatrick return SubIdx == TRI->getSubRegIndex(PreviousDef, Def); 345*09467b48Spatrick } 346*09467b48Spatrick 347*09467b48Spatrick /// Remove instruction \p Copy if there exists a previous copy that copies the 348*09467b48Spatrick /// register \p Src to the register \p Def; This may happen indirectly by 349*09467b48Spatrick /// copying the super registers. 350*09467b48Spatrick bool MachineCopyPropagation::eraseIfRedundant(MachineInstr &Copy, unsigned Src, 351*09467b48Spatrick unsigned Def) { 352*09467b48Spatrick // Avoid eliminating a copy from/to a reserved registers as we cannot predict 353*09467b48Spatrick // the value (Example: The sparc zero register is writable but stays zero). 354*09467b48Spatrick if (MRI->isReserved(Src) || MRI->isReserved(Def)) 355*09467b48Spatrick return false; 356*09467b48Spatrick 357*09467b48Spatrick // Search for an existing copy. 358*09467b48Spatrick MachineInstr *PrevCopy = Tracker.findAvailCopy(Copy, Def, *TRI); 359*09467b48Spatrick if (!PrevCopy) 360*09467b48Spatrick return false; 361*09467b48Spatrick 362*09467b48Spatrick // Check that the existing copy uses the correct sub registers. 363*09467b48Spatrick if (PrevCopy->getOperand(0).isDead()) 364*09467b48Spatrick return false; 365*09467b48Spatrick if (!isNopCopy(*PrevCopy, Src, Def, TRI)) 366*09467b48Spatrick return false; 367*09467b48Spatrick 368*09467b48Spatrick LLVM_DEBUG(dbgs() << "MCP: copy is a NOP, removing: "; Copy.dump()); 369*09467b48Spatrick 370*09467b48Spatrick // Copy was redundantly redefining either Src or Def. Remove earlier kill 371*09467b48Spatrick // flags between Copy and PrevCopy because the value will be reused now. 372*09467b48Spatrick assert(Copy.isCopy()); 373*09467b48Spatrick Register CopyDef = Copy.getOperand(0).getReg(); 374*09467b48Spatrick assert(CopyDef == Src || CopyDef == Def); 375*09467b48Spatrick for (MachineInstr &MI : 376*09467b48Spatrick make_range(PrevCopy->getIterator(), Copy.getIterator())) 377*09467b48Spatrick MI.clearRegisterKills(CopyDef, TRI); 378*09467b48Spatrick 379*09467b48Spatrick Copy.eraseFromParent(); 380*09467b48Spatrick Changed = true; 381*09467b48Spatrick ++NumDeletes; 382*09467b48Spatrick return true; 383*09467b48Spatrick } 384*09467b48Spatrick 385*09467b48Spatrick bool MachineCopyPropagation::isBackwardPropagatableRegClassCopy( 386*09467b48Spatrick const MachineInstr &Copy, const MachineInstr &UseI, unsigned UseIdx) { 387*09467b48Spatrick Register Def = Copy.getOperand(0).getReg(); 388*09467b48Spatrick 389*09467b48Spatrick if (const TargetRegisterClass *URC = 390*09467b48Spatrick UseI.getRegClassConstraint(UseIdx, TII, TRI)) 391*09467b48Spatrick return URC->contains(Def); 392*09467b48Spatrick 393*09467b48Spatrick // We don't process further if UseI is a COPY, since forward copy propagation 394*09467b48Spatrick // should handle that. 395*09467b48Spatrick return false; 396*09467b48Spatrick } 397*09467b48Spatrick 398*09467b48Spatrick /// Decide whether we should forward the source of \param Copy to its use in 399*09467b48Spatrick /// \param UseI based on the physical register class constraints of the opcode 400*09467b48Spatrick /// and avoiding introducing more cross-class COPYs. 401*09467b48Spatrick bool MachineCopyPropagation::isForwardableRegClassCopy(const MachineInstr &Copy, 402*09467b48Spatrick const MachineInstr &UseI, 403*09467b48Spatrick unsigned UseIdx) { 404*09467b48Spatrick 405*09467b48Spatrick Register CopySrcReg = Copy.getOperand(1).getReg(); 406*09467b48Spatrick 407*09467b48Spatrick // If the new register meets the opcode register constraints, then allow 408*09467b48Spatrick // forwarding. 409*09467b48Spatrick if (const TargetRegisterClass *URC = 410*09467b48Spatrick UseI.getRegClassConstraint(UseIdx, TII, TRI)) 411*09467b48Spatrick return URC->contains(CopySrcReg); 412*09467b48Spatrick 413*09467b48Spatrick if (!UseI.isCopy()) 414*09467b48Spatrick return false; 415*09467b48Spatrick 416*09467b48Spatrick /// COPYs don't have register class constraints, so if the user instruction 417*09467b48Spatrick /// is a COPY, we just try to avoid introducing additional cross-class 418*09467b48Spatrick /// COPYs. For example: 419*09467b48Spatrick /// 420*09467b48Spatrick /// RegClassA = COPY RegClassB // Copy parameter 421*09467b48Spatrick /// ... 422*09467b48Spatrick /// RegClassB = COPY RegClassA // UseI parameter 423*09467b48Spatrick /// 424*09467b48Spatrick /// which after forwarding becomes 425*09467b48Spatrick /// 426*09467b48Spatrick /// RegClassA = COPY RegClassB 427*09467b48Spatrick /// ... 428*09467b48Spatrick /// RegClassB = COPY RegClassB 429*09467b48Spatrick /// 430*09467b48Spatrick /// so we have reduced the number of cross-class COPYs and potentially 431*09467b48Spatrick /// introduced a nop COPY that can be removed. 432*09467b48Spatrick const TargetRegisterClass *UseDstRC = 433*09467b48Spatrick TRI->getMinimalPhysRegClass(UseI.getOperand(0).getReg()); 434*09467b48Spatrick 435*09467b48Spatrick const TargetRegisterClass *SuperRC = UseDstRC; 436*09467b48Spatrick for (TargetRegisterClass::sc_iterator SuperRCI = UseDstRC->getSuperClasses(); 437*09467b48Spatrick SuperRC; SuperRC = *SuperRCI++) 438*09467b48Spatrick if (SuperRC->contains(CopySrcReg)) 439*09467b48Spatrick return true; 440*09467b48Spatrick 441*09467b48Spatrick return false; 442*09467b48Spatrick } 443*09467b48Spatrick 444*09467b48Spatrick /// Check that \p MI does not have implicit uses that overlap with it's \p Use 445*09467b48Spatrick /// operand (the register being replaced), since these can sometimes be 446*09467b48Spatrick /// implicitly tied to other operands. For example, on AMDGPU: 447*09467b48Spatrick /// 448*09467b48Spatrick /// V_MOVRELS_B32_e32 %VGPR2, %M0<imp-use>, %EXEC<imp-use>, %VGPR2_VGPR3_VGPR4_VGPR5<imp-use> 449*09467b48Spatrick /// 450*09467b48Spatrick /// the %VGPR2 is implicitly tied to the larger reg operand, but we have no 451*09467b48Spatrick /// way of knowing we need to update the latter when updating the former. 452*09467b48Spatrick bool MachineCopyPropagation::hasImplicitOverlap(const MachineInstr &MI, 453*09467b48Spatrick const MachineOperand &Use) { 454*09467b48Spatrick for (const MachineOperand &MIUse : MI.uses()) 455*09467b48Spatrick if (&MIUse != &Use && MIUse.isReg() && MIUse.isImplicit() && 456*09467b48Spatrick MIUse.isUse() && TRI->regsOverlap(Use.getReg(), MIUse.getReg())) 457*09467b48Spatrick return true; 458*09467b48Spatrick 459*09467b48Spatrick return false; 460*09467b48Spatrick } 461*09467b48Spatrick 462*09467b48Spatrick /// Look for available copies whose destination register is used by \p MI and 463*09467b48Spatrick /// replace the use in \p MI with the copy's source register. 464*09467b48Spatrick void MachineCopyPropagation::forwardUses(MachineInstr &MI) { 465*09467b48Spatrick if (!Tracker.hasAnyCopies()) 466*09467b48Spatrick return; 467*09467b48Spatrick 468*09467b48Spatrick // Look for non-tied explicit vreg uses that have an active COPY 469*09467b48Spatrick // instruction that defines the physical register allocated to them. 470*09467b48Spatrick // Replace the vreg with the source of the active COPY. 471*09467b48Spatrick for (unsigned OpIdx = 0, OpEnd = MI.getNumOperands(); OpIdx < OpEnd; 472*09467b48Spatrick ++OpIdx) { 473*09467b48Spatrick MachineOperand &MOUse = MI.getOperand(OpIdx); 474*09467b48Spatrick // Don't forward into undef use operands since doing so can cause problems 475*09467b48Spatrick // with the machine verifier, since it doesn't treat undef reads as reads, 476*09467b48Spatrick // so we can end up with a live range that ends on an undef read, leading to 477*09467b48Spatrick // an error that the live range doesn't end on a read of the live range 478*09467b48Spatrick // register. 479*09467b48Spatrick if (!MOUse.isReg() || MOUse.isTied() || MOUse.isUndef() || MOUse.isDef() || 480*09467b48Spatrick MOUse.isImplicit()) 481*09467b48Spatrick continue; 482*09467b48Spatrick 483*09467b48Spatrick if (!MOUse.getReg()) 484*09467b48Spatrick continue; 485*09467b48Spatrick 486*09467b48Spatrick // Check that the register is marked 'renamable' so we know it is safe to 487*09467b48Spatrick // rename it without violating any constraints that aren't expressed in the 488*09467b48Spatrick // IR (e.g. ABI or opcode requirements). 489*09467b48Spatrick if (!MOUse.isRenamable()) 490*09467b48Spatrick continue; 491*09467b48Spatrick 492*09467b48Spatrick MachineInstr *Copy = Tracker.findAvailCopy(MI, MOUse.getReg(), *TRI); 493*09467b48Spatrick if (!Copy) 494*09467b48Spatrick continue; 495*09467b48Spatrick 496*09467b48Spatrick Register CopyDstReg = Copy->getOperand(0).getReg(); 497*09467b48Spatrick const MachineOperand &CopySrc = Copy->getOperand(1); 498*09467b48Spatrick Register CopySrcReg = CopySrc.getReg(); 499*09467b48Spatrick 500*09467b48Spatrick // FIXME: Don't handle partial uses of wider COPYs yet. 501*09467b48Spatrick if (MOUse.getReg() != CopyDstReg) { 502*09467b48Spatrick LLVM_DEBUG( 503*09467b48Spatrick dbgs() << "MCP: FIXME! Not forwarding COPY to sub-register use:\n " 504*09467b48Spatrick << MI); 505*09467b48Spatrick continue; 506*09467b48Spatrick } 507*09467b48Spatrick 508*09467b48Spatrick // Don't forward COPYs of reserved regs unless they are constant. 509*09467b48Spatrick if (MRI->isReserved(CopySrcReg) && !MRI->isConstantPhysReg(CopySrcReg)) 510*09467b48Spatrick continue; 511*09467b48Spatrick 512*09467b48Spatrick if (!isForwardableRegClassCopy(*Copy, MI, OpIdx)) 513*09467b48Spatrick continue; 514*09467b48Spatrick 515*09467b48Spatrick if (hasImplicitOverlap(MI, MOUse)) 516*09467b48Spatrick continue; 517*09467b48Spatrick 518*09467b48Spatrick // Check that the instruction is not a copy that partially overwrites the 519*09467b48Spatrick // original copy source that we are about to use. The tracker mechanism 520*09467b48Spatrick // cannot cope with that. 521*09467b48Spatrick if (MI.isCopy() && MI.modifiesRegister(CopySrcReg, TRI) && 522*09467b48Spatrick !MI.definesRegister(CopySrcReg)) { 523*09467b48Spatrick LLVM_DEBUG(dbgs() << "MCP: Copy source overlap with dest in " << MI); 524*09467b48Spatrick continue; 525*09467b48Spatrick } 526*09467b48Spatrick 527*09467b48Spatrick if (!DebugCounter::shouldExecute(FwdCounter)) { 528*09467b48Spatrick LLVM_DEBUG(dbgs() << "MCP: Skipping forwarding due to debug counter:\n " 529*09467b48Spatrick << MI); 530*09467b48Spatrick continue; 531*09467b48Spatrick } 532*09467b48Spatrick 533*09467b48Spatrick LLVM_DEBUG(dbgs() << "MCP: Replacing " << printReg(MOUse.getReg(), TRI) 534*09467b48Spatrick << "\n with " << printReg(CopySrcReg, TRI) 535*09467b48Spatrick << "\n in " << MI << " from " << *Copy); 536*09467b48Spatrick 537*09467b48Spatrick MOUse.setReg(CopySrcReg); 538*09467b48Spatrick if (!CopySrc.isRenamable()) 539*09467b48Spatrick MOUse.setIsRenamable(false); 540*09467b48Spatrick 541*09467b48Spatrick LLVM_DEBUG(dbgs() << "MCP: After replacement: " << MI << "\n"); 542*09467b48Spatrick 543*09467b48Spatrick // Clear kill markers that may have been invalidated. 544*09467b48Spatrick for (MachineInstr &KMI : 545*09467b48Spatrick make_range(Copy->getIterator(), std::next(MI.getIterator()))) 546*09467b48Spatrick KMI.clearRegisterKills(CopySrcReg, TRI); 547*09467b48Spatrick 548*09467b48Spatrick ++NumCopyForwards; 549*09467b48Spatrick Changed = true; 550*09467b48Spatrick } 551*09467b48Spatrick } 552*09467b48Spatrick 553*09467b48Spatrick void MachineCopyPropagation::ForwardCopyPropagateBlock(MachineBasicBlock &MBB) { 554*09467b48Spatrick LLVM_DEBUG(dbgs() << "MCP: ForwardCopyPropagateBlock " << MBB.getName() 555*09467b48Spatrick << "\n"); 556*09467b48Spatrick 557*09467b48Spatrick for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end(); I != E; ) { 558*09467b48Spatrick MachineInstr *MI = &*I; 559*09467b48Spatrick ++I; 560*09467b48Spatrick 561*09467b48Spatrick // Analyze copies (which don't overlap themselves). 562*09467b48Spatrick if (MI->isCopy() && !TRI->regsOverlap(MI->getOperand(0).getReg(), 563*09467b48Spatrick MI->getOperand(1).getReg())) { 564*09467b48Spatrick Register Def = MI->getOperand(0).getReg(); 565*09467b48Spatrick Register Src = MI->getOperand(1).getReg(); 566*09467b48Spatrick 567*09467b48Spatrick assert(!Register::isVirtualRegister(Def) && 568*09467b48Spatrick !Register::isVirtualRegister(Src) && 569*09467b48Spatrick "MachineCopyPropagation should be run after register allocation!"); 570*09467b48Spatrick 571*09467b48Spatrick // The two copies cancel out and the source of the first copy 572*09467b48Spatrick // hasn't been overridden, eliminate the second one. e.g. 573*09467b48Spatrick // %ecx = COPY %eax 574*09467b48Spatrick // ... nothing clobbered eax. 575*09467b48Spatrick // %eax = COPY %ecx 576*09467b48Spatrick // => 577*09467b48Spatrick // %ecx = COPY %eax 578*09467b48Spatrick // 579*09467b48Spatrick // or 580*09467b48Spatrick // 581*09467b48Spatrick // %ecx = COPY %eax 582*09467b48Spatrick // ... nothing clobbered eax. 583*09467b48Spatrick // %ecx = COPY %eax 584*09467b48Spatrick // => 585*09467b48Spatrick // %ecx = COPY %eax 586*09467b48Spatrick if (eraseIfRedundant(*MI, Def, Src) || eraseIfRedundant(*MI, Src, Def)) 587*09467b48Spatrick continue; 588*09467b48Spatrick 589*09467b48Spatrick forwardUses(*MI); 590*09467b48Spatrick 591*09467b48Spatrick // Src may have been changed by forwardUses() 592*09467b48Spatrick Src = MI->getOperand(1).getReg(); 593*09467b48Spatrick 594*09467b48Spatrick // If Src is defined by a previous copy, the previous copy cannot be 595*09467b48Spatrick // eliminated. 596*09467b48Spatrick ReadRegister(Src, *MI, RegularUse); 597*09467b48Spatrick for (const MachineOperand &MO : MI->implicit_operands()) { 598*09467b48Spatrick if (!MO.isReg() || !MO.readsReg()) 599*09467b48Spatrick continue; 600*09467b48Spatrick Register Reg = MO.getReg(); 601*09467b48Spatrick if (!Reg) 602*09467b48Spatrick continue; 603*09467b48Spatrick ReadRegister(Reg, *MI, RegularUse); 604*09467b48Spatrick } 605*09467b48Spatrick 606*09467b48Spatrick LLVM_DEBUG(dbgs() << "MCP: Copy is a deletion candidate: "; MI->dump()); 607*09467b48Spatrick 608*09467b48Spatrick // Copy is now a candidate for deletion. 609*09467b48Spatrick if (!MRI->isReserved(Def)) 610*09467b48Spatrick MaybeDeadCopies.insert(MI); 611*09467b48Spatrick 612*09467b48Spatrick // If 'Def' is previously source of another copy, then this earlier copy's 613*09467b48Spatrick // source is no longer available. e.g. 614*09467b48Spatrick // %xmm9 = copy %xmm2 615*09467b48Spatrick // ... 616*09467b48Spatrick // %xmm2 = copy %xmm0 617*09467b48Spatrick // ... 618*09467b48Spatrick // %xmm2 = copy %xmm9 619*09467b48Spatrick Tracker.clobberRegister(Def, *TRI); 620*09467b48Spatrick for (const MachineOperand &MO : MI->implicit_operands()) { 621*09467b48Spatrick if (!MO.isReg() || !MO.isDef()) 622*09467b48Spatrick continue; 623*09467b48Spatrick Register Reg = MO.getReg(); 624*09467b48Spatrick if (!Reg) 625*09467b48Spatrick continue; 626*09467b48Spatrick Tracker.clobberRegister(Reg, *TRI); 627*09467b48Spatrick } 628*09467b48Spatrick 629*09467b48Spatrick Tracker.trackCopy(MI, *TRI); 630*09467b48Spatrick 631*09467b48Spatrick continue; 632*09467b48Spatrick } 633*09467b48Spatrick 634*09467b48Spatrick // Clobber any earlyclobber regs first. 635*09467b48Spatrick for (const MachineOperand &MO : MI->operands()) 636*09467b48Spatrick if (MO.isReg() && MO.isEarlyClobber()) { 637*09467b48Spatrick Register Reg = MO.getReg(); 638*09467b48Spatrick // If we have a tied earlyclobber, that means it is also read by this 639*09467b48Spatrick // instruction, so we need to make sure we don't remove it as dead 640*09467b48Spatrick // later. 641*09467b48Spatrick if (MO.isTied()) 642*09467b48Spatrick ReadRegister(Reg, *MI, RegularUse); 643*09467b48Spatrick Tracker.clobberRegister(Reg, *TRI); 644*09467b48Spatrick } 645*09467b48Spatrick 646*09467b48Spatrick forwardUses(*MI); 647*09467b48Spatrick 648*09467b48Spatrick // Not a copy. 649*09467b48Spatrick SmallVector<unsigned, 2> Defs; 650*09467b48Spatrick const MachineOperand *RegMask = nullptr; 651*09467b48Spatrick for (const MachineOperand &MO : MI->operands()) { 652*09467b48Spatrick if (MO.isRegMask()) 653*09467b48Spatrick RegMask = &MO; 654*09467b48Spatrick if (!MO.isReg()) 655*09467b48Spatrick continue; 656*09467b48Spatrick Register Reg = MO.getReg(); 657*09467b48Spatrick if (!Reg) 658*09467b48Spatrick continue; 659*09467b48Spatrick 660*09467b48Spatrick assert(!Register::isVirtualRegister(Reg) && 661*09467b48Spatrick "MachineCopyPropagation should be run after register allocation!"); 662*09467b48Spatrick 663*09467b48Spatrick if (MO.isDef() && !MO.isEarlyClobber()) { 664*09467b48Spatrick Defs.push_back(Reg); 665*09467b48Spatrick continue; 666*09467b48Spatrick } else if (MO.readsReg()) 667*09467b48Spatrick ReadRegister(Reg, *MI, MO.isDebug() ? DebugUse : RegularUse); 668*09467b48Spatrick } 669*09467b48Spatrick 670*09467b48Spatrick // The instruction has a register mask operand which means that it clobbers 671*09467b48Spatrick // a large set of registers. Treat clobbered registers the same way as 672*09467b48Spatrick // defined registers. 673*09467b48Spatrick if (RegMask) { 674*09467b48Spatrick // Erase any MaybeDeadCopies whose destination register is clobbered. 675*09467b48Spatrick for (SmallSetVector<MachineInstr *, 8>::iterator DI = 676*09467b48Spatrick MaybeDeadCopies.begin(); 677*09467b48Spatrick DI != MaybeDeadCopies.end();) { 678*09467b48Spatrick MachineInstr *MaybeDead = *DI; 679*09467b48Spatrick Register Reg = MaybeDead->getOperand(0).getReg(); 680*09467b48Spatrick assert(!MRI->isReserved(Reg)); 681*09467b48Spatrick 682*09467b48Spatrick if (!RegMask->clobbersPhysReg(Reg)) { 683*09467b48Spatrick ++DI; 684*09467b48Spatrick continue; 685*09467b48Spatrick } 686*09467b48Spatrick 687*09467b48Spatrick LLVM_DEBUG(dbgs() << "MCP: Removing copy due to regmask clobbering: "; 688*09467b48Spatrick MaybeDead->dump()); 689*09467b48Spatrick 690*09467b48Spatrick // Make sure we invalidate any entries in the copy maps before erasing 691*09467b48Spatrick // the instruction. 692*09467b48Spatrick Tracker.clobberRegister(Reg, *TRI); 693*09467b48Spatrick 694*09467b48Spatrick // erase() will return the next valid iterator pointing to the next 695*09467b48Spatrick // element after the erased one. 696*09467b48Spatrick DI = MaybeDeadCopies.erase(DI); 697*09467b48Spatrick MaybeDead->eraseFromParent(); 698*09467b48Spatrick Changed = true; 699*09467b48Spatrick ++NumDeletes; 700*09467b48Spatrick } 701*09467b48Spatrick } 702*09467b48Spatrick 703*09467b48Spatrick // Any previous copy definition or reading the Defs is no longer available. 704*09467b48Spatrick for (unsigned Reg : Defs) 705*09467b48Spatrick Tracker.clobberRegister(Reg, *TRI); 706*09467b48Spatrick } 707*09467b48Spatrick 708*09467b48Spatrick // If MBB doesn't have successors, delete the copies whose defs are not used. 709*09467b48Spatrick // If MBB does have successors, then conservative assume the defs are live-out 710*09467b48Spatrick // since we don't want to trust live-in lists. 711*09467b48Spatrick if (MBB.succ_empty()) { 712*09467b48Spatrick for (MachineInstr *MaybeDead : MaybeDeadCopies) { 713*09467b48Spatrick LLVM_DEBUG(dbgs() << "MCP: Removing copy due to no live-out succ: "; 714*09467b48Spatrick MaybeDead->dump()); 715*09467b48Spatrick assert(!MRI->isReserved(MaybeDead->getOperand(0).getReg())); 716*09467b48Spatrick 717*09467b48Spatrick // Update matching debug values, if any. 718*09467b48Spatrick assert(MaybeDead->isCopy()); 719*09467b48Spatrick unsigned SrcReg = MaybeDead->getOperand(1).getReg(); 720*09467b48Spatrick MRI->updateDbgUsersToReg(SrcReg, CopyDbgUsers[MaybeDead]); 721*09467b48Spatrick 722*09467b48Spatrick MaybeDead->eraseFromParent(); 723*09467b48Spatrick Changed = true; 724*09467b48Spatrick ++NumDeletes; 725*09467b48Spatrick } 726*09467b48Spatrick } 727*09467b48Spatrick 728*09467b48Spatrick MaybeDeadCopies.clear(); 729*09467b48Spatrick CopyDbgUsers.clear(); 730*09467b48Spatrick Tracker.clear(); 731*09467b48Spatrick } 732*09467b48Spatrick 733*09467b48Spatrick static bool isBackwardPropagatableCopy(MachineInstr &MI, 734*09467b48Spatrick const MachineRegisterInfo &MRI) { 735*09467b48Spatrick assert(MI.isCopy() && "MI is expected to be a COPY"); 736*09467b48Spatrick Register Def = MI.getOperand(0).getReg(); 737*09467b48Spatrick Register Src = MI.getOperand(1).getReg(); 738*09467b48Spatrick 739*09467b48Spatrick if (!Def || !Src) 740*09467b48Spatrick return false; 741*09467b48Spatrick 742*09467b48Spatrick if (MRI.isReserved(Def) || MRI.isReserved(Src)) 743*09467b48Spatrick return false; 744*09467b48Spatrick 745*09467b48Spatrick return MI.getOperand(1).isRenamable() && MI.getOperand(1).isKill(); 746*09467b48Spatrick } 747*09467b48Spatrick 748*09467b48Spatrick void MachineCopyPropagation::propagateDefs(MachineInstr &MI) { 749*09467b48Spatrick if (!Tracker.hasAnyCopies()) 750*09467b48Spatrick return; 751*09467b48Spatrick 752*09467b48Spatrick for (unsigned OpIdx = 0, OpEnd = MI.getNumOperands(); OpIdx != OpEnd; 753*09467b48Spatrick ++OpIdx) { 754*09467b48Spatrick MachineOperand &MODef = MI.getOperand(OpIdx); 755*09467b48Spatrick 756*09467b48Spatrick if (!MODef.isReg() || MODef.isUse()) 757*09467b48Spatrick continue; 758*09467b48Spatrick 759*09467b48Spatrick // Ignore non-trivial cases. 760*09467b48Spatrick if (MODef.isTied() || MODef.isUndef() || MODef.isImplicit()) 761*09467b48Spatrick continue; 762*09467b48Spatrick 763*09467b48Spatrick if (!MODef.getReg()) 764*09467b48Spatrick continue; 765*09467b48Spatrick 766*09467b48Spatrick // We only handle if the register comes from a vreg. 767*09467b48Spatrick if (!MODef.isRenamable()) 768*09467b48Spatrick continue; 769*09467b48Spatrick 770*09467b48Spatrick MachineInstr *Copy = 771*09467b48Spatrick Tracker.findAvailBackwardCopy(MI, MODef.getReg(), *TRI); 772*09467b48Spatrick if (!Copy) 773*09467b48Spatrick continue; 774*09467b48Spatrick 775*09467b48Spatrick Register Def = Copy->getOperand(0).getReg(); 776*09467b48Spatrick Register Src = Copy->getOperand(1).getReg(); 777*09467b48Spatrick 778*09467b48Spatrick if (MODef.getReg() != Src) 779*09467b48Spatrick continue; 780*09467b48Spatrick 781*09467b48Spatrick if (!isBackwardPropagatableRegClassCopy(*Copy, MI, OpIdx)) 782*09467b48Spatrick continue; 783*09467b48Spatrick 784*09467b48Spatrick if (hasImplicitOverlap(MI, MODef)) 785*09467b48Spatrick continue; 786*09467b48Spatrick 787*09467b48Spatrick LLVM_DEBUG(dbgs() << "MCP: Replacing " << printReg(MODef.getReg(), TRI) 788*09467b48Spatrick << "\n with " << printReg(Def, TRI) << "\n in " 789*09467b48Spatrick << MI << " from " << *Copy); 790*09467b48Spatrick 791*09467b48Spatrick MODef.setReg(Def); 792*09467b48Spatrick MODef.setIsRenamable(Copy->getOperand(0).isRenamable()); 793*09467b48Spatrick 794*09467b48Spatrick LLVM_DEBUG(dbgs() << "MCP: After replacement: " << MI << "\n"); 795*09467b48Spatrick MaybeDeadCopies.insert(Copy); 796*09467b48Spatrick Changed = true; 797*09467b48Spatrick ++NumCopyBackwardPropagated; 798*09467b48Spatrick } 799*09467b48Spatrick } 800*09467b48Spatrick 801*09467b48Spatrick void MachineCopyPropagation::BackwardCopyPropagateBlock( 802*09467b48Spatrick MachineBasicBlock &MBB) { 803*09467b48Spatrick LLVM_DEBUG(dbgs() << "MCP: BackwardCopyPropagateBlock " << MBB.getName() 804*09467b48Spatrick << "\n"); 805*09467b48Spatrick 806*09467b48Spatrick for (MachineBasicBlock::reverse_iterator I = MBB.rbegin(), E = MBB.rend(); 807*09467b48Spatrick I != E;) { 808*09467b48Spatrick MachineInstr *MI = &*I; 809*09467b48Spatrick ++I; 810*09467b48Spatrick 811*09467b48Spatrick // Ignore non-trivial COPYs. 812*09467b48Spatrick if (MI->isCopy() && MI->getNumOperands() == 2 && 813*09467b48Spatrick !TRI->regsOverlap(MI->getOperand(0).getReg(), 814*09467b48Spatrick MI->getOperand(1).getReg())) { 815*09467b48Spatrick 816*09467b48Spatrick Register Def = MI->getOperand(0).getReg(); 817*09467b48Spatrick Register Src = MI->getOperand(1).getReg(); 818*09467b48Spatrick 819*09467b48Spatrick // Unlike forward cp, we don't invoke propagateDefs here, 820*09467b48Spatrick // just let forward cp do COPY-to-COPY propagation. 821*09467b48Spatrick if (isBackwardPropagatableCopy(*MI, *MRI)) { 822*09467b48Spatrick Tracker.invalidateRegister(Src, *TRI); 823*09467b48Spatrick Tracker.invalidateRegister(Def, *TRI); 824*09467b48Spatrick Tracker.trackCopy(MI, *TRI); 825*09467b48Spatrick continue; 826*09467b48Spatrick } 827*09467b48Spatrick } 828*09467b48Spatrick 829*09467b48Spatrick // Invalidate any earlyclobber regs first. 830*09467b48Spatrick for (const MachineOperand &MO : MI->operands()) 831*09467b48Spatrick if (MO.isReg() && MO.isEarlyClobber()) { 832*09467b48Spatrick Register Reg = MO.getReg(); 833*09467b48Spatrick if (!Reg) 834*09467b48Spatrick continue; 835*09467b48Spatrick Tracker.invalidateRegister(Reg, *TRI); 836*09467b48Spatrick } 837*09467b48Spatrick 838*09467b48Spatrick propagateDefs(*MI); 839*09467b48Spatrick for (const MachineOperand &MO : MI->operands()) { 840*09467b48Spatrick if (!MO.isReg()) 841*09467b48Spatrick continue; 842*09467b48Spatrick 843*09467b48Spatrick if (!MO.getReg()) 844*09467b48Spatrick continue; 845*09467b48Spatrick 846*09467b48Spatrick if (MO.isDef()) 847*09467b48Spatrick Tracker.invalidateRegister(MO.getReg(), *TRI); 848*09467b48Spatrick 849*09467b48Spatrick if (MO.readsReg()) 850*09467b48Spatrick Tracker.invalidateRegister(MO.getReg(), *TRI); 851*09467b48Spatrick } 852*09467b48Spatrick } 853*09467b48Spatrick 854*09467b48Spatrick for (auto *Copy : MaybeDeadCopies) { 855*09467b48Spatrick Copy->eraseFromParent(); 856*09467b48Spatrick ++NumDeletes; 857*09467b48Spatrick } 858*09467b48Spatrick 859*09467b48Spatrick MaybeDeadCopies.clear(); 860*09467b48Spatrick CopyDbgUsers.clear(); 861*09467b48Spatrick Tracker.clear(); 862*09467b48Spatrick } 863*09467b48Spatrick 864*09467b48Spatrick bool MachineCopyPropagation::runOnMachineFunction(MachineFunction &MF) { 865*09467b48Spatrick if (skipFunction(MF.getFunction())) 866*09467b48Spatrick return false; 867*09467b48Spatrick 868*09467b48Spatrick Changed = false; 869*09467b48Spatrick 870*09467b48Spatrick TRI = MF.getSubtarget().getRegisterInfo(); 871*09467b48Spatrick TII = MF.getSubtarget().getInstrInfo(); 872*09467b48Spatrick MRI = &MF.getRegInfo(); 873*09467b48Spatrick 874*09467b48Spatrick for (MachineBasicBlock &MBB : MF) { 875*09467b48Spatrick BackwardCopyPropagateBlock(MBB); 876*09467b48Spatrick ForwardCopyPropagateBlock(MBB); 877*09467b48Spatrick } 878*09467b48Spatrick 879*09467b48Spatrick return Changed; 880*09467b48Spatrick } 881