MachineCopyPropagation.cpp revision 977679d6034791fd48a344e5b990503ba50fc242
1977679d6034791fd48a344e5b990503ba50fc242Evan Cheng//===- MachineCopyPropagation.cpp - Machine Copy Propagation Pass ---------===// 2977679d6034791fd48a344e5b990503ba50fc242Evan Cheng// 3977679d6034791fd48a344e5b990503ba50fc242Evan Cheng// The LLVM Compiler Infrastructure 4977679d6034791fd48a344e5b990503ba50fc242Evan Cheng// 5977679d6034791fd48a344e5b990503ba50fc242Evan Cheng// This file is distributed under the University of Illinois Open Source 6977679d6034791fd48a344e5b990503ba50fc242Evan Cheng// License. See LICENSE.TXT for details. 7977679d6034791fd48a344e5b990503ba50fc242Evan Cheng// 8977679d6034791fd48a344e5b990503ba50fc242Evan Cheng//===----------------------------------------------------------------------===// 9977679d6034791fd48a344e5b990503ba50fc242Evan Cheng// 10977679d6034791fd48a344e5b990503ba50fc242Evan Cheng// This is an extremely simple MachineInstr-level copy propagation pass. 11977679d6034791fd48a344e5b990503ba50fc242Evan Cheng// 12977679d6034791fd48a344e5b990503ba50fc242Evan Cheng//===----------------------------------------------------------------------===// 13977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 14977679d6034791fd48a344e5b990503ba50fc242Evan Cheng#define DEBUG_TYPE "codegen-cp" 15977679d6034791fd48a344e5b990503ba50fc242Evan Cheng#include "llvm/CodeGen/Passes.h" 16977679d6034791fd48a344e5b990503ba50fc242Evan Cheng#include "llvm/Pass.h" 17977679d6034791fd48a344e5b990503ba50fc242Evan Cheng#include "llvm/CodeGen/MachineFunction.h" 18977679d6034791fd48a344e5b990503ba50fc242Evan Cheng#include "llvm/CodeGen/MachineFunctionPass.h" 19977679d6034791fd48a344e5b990503ba50fc242Evan Cheng#include "llvm/Target/TargetRegisterInfo.h" 20977679d6034791fd48a344e5b990503ba50fc242Evan Cheng#include "llvm/Support/Debug.h" 21977679d6034791fd48a344e5b990503ba50fc242Evan Cheng#include "llvm/Support/ErrorHandling.h" 22977679d6034791fd48a344e5b990503ba50fc242Evan Cheng#include "llvm/Support/raw_ostream.h" 23977679d6034791fd48a344e5b990503ba50fc242Evan Cheng#include "llvm/ADT/BitVector.h" 24977679d6034791fd48a344e5b990503ba50fc242Evan Cheng#include "llvm/ADT/DenseMap.h" 25977679d6034791fd48a344e5b990503ba50fc242Evan Cheng#include "llvm/ADT/SetVector.h" 26977679d6034791fd48a344e5b990503ba50fc242Evan Cheng#include "llvm/ADT/SmallVector.h" 27977679d6034791fd48a344e5b990503ba50fc242Evan Cheng#include "llvm/ADT/Statistic.h" 28977679d6034791fd48a344e5b990503ba50fc242Evan Chengusing namespace llvm; 29977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 30977679d6034791fd48a344e5b990503ba50fc242Evan ChengSTATISTIC(NumDeletes, "Number of dead copies deleted"); 31977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 32977679d6034791fd48a344e5b990503ba50fc242Evan Chengnamespace { 33977679d6034791fd48a344e5b990503ba50fc242Evan Cheng class MachineCopyPropagation : public MachineFunctionPass { 34977679d6034791fd48a344e5b990503ba50fc242Evan Cheng const TargetRegisterInfo *TRI; 35977679d6034791fd48a344e5b990503ba50fc242Evan Cheng BitVector ReservedRegs; 36977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 37977679d6034791fd48a344e5b990503ba50fc242Evan Cheng public: 38977679d6034791fd48a344e5b990503ba50fc242Evan Cheng static char ID; // Pass identification, replacement for typeid 39977679d6034791fd48a344e5b990503ba50fc242Evan Cheng MachineCopyPropagation() : MachineFunctionPass(ID) { 40977679d6034791fd48a344e5b990503ba50fc242Evan Cheng initializeMachineCopyPropagationPass(*PassRegistry::getPassRegistry()); 41977679d6034791fd48a344e5b990503ba50fc242Evan Cheng } 42977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 43977679d6034791fd48a344e5b990503ba50fc242Evan Cheng virtual bool runOnMachineFunction(MachineFunction &MF); 44977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 45977679d6034791fd48a344e5b990503ba50fc242Evan Cheng private: 46977679d6034791fd48a344e5b990503ba50fc242Evan Cheng void SourceNoLongerAvailable(unsigned Reg, 47977679d6034791fd48a344e5b990503ba50fc242Evan Cheng DenseMap<unsigned, unsigned> &SrcMap, 48977679d6034791fd48a344e5b990503ba50fc242Evan Cheng DenseMap<unsigned, MachineInstr*> &AvailCopyMap); 49977679d6034791fd48a344e5b990503ba50fc242Evan Cheng bool CopyPropagateBlock(MachineBasicBlock &MBB); 50977679d6034791fd48a344e5b990503ba50fc242Evan Cheng }; 51977679d6034791fd48a344e5b990503ba50fc242Evan Cheng} 52977679d6034791fd48a344e5b990503ba50fc242Evan Chengchar MachineCopyPropagation::ID = 0; 53977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 54977679d6034791fd48a344e5b990503ba50fc242Evan ChengINITIALIZE_PASS(MachineCopyPropagation, "machine-cp", 55977679d6034791fd48a344e5b990503ba50fc242Evan Cheng "Machine Copy Propagation Pass", false, false) 56977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 57977679d6034791fd48a344e5b990503ba50fc242Evan ChengFunctionPass *llvm::createMachineCopyPropagationPass() { 58977679d6034791fd48a344e5b990503ba50fc242Evan Cheng return new MachineCopyPropagation(); 59977679d6034791fd48a344e5b990503ba50fc242Evan Cheng} 60977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 61977679d6034791fd48a344e5b990503ba50fc242Evan Chengvoid 62977679d6034791fd48a344e5b990503ba50fc242Evan ChengMachineCopyPropagation::SourceNoLongerAvailable(unsigned Reg, 63977679d6034791fd48a344e5b990503ba50fc242Evan Cheng DenseMap<unsigned, unsigned> &SrcMap, 64977679d6034791fd48a344e5b990503ba50fc242Evan Cheng DenseMap<unsigned, MachineInstr*> &AvailCopyMap) { 65977679d6034791fd48a344e5b990503ba50fc242Evan Cheng DenseMap<unsigned, unsigned>::iterator SI = SrcMap.find(Reg); 66977679d6034791fd48a344e5b990503ba50fc242Evan Cheng if (SI != SrcMap.end()) { 67977679d6034791fd48a344e5b990503ba50fc242Evan Cheng unsigned MappedDef = SI->second; 68977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // Source of copy is no longer available for propagation. 69977679d6034791fd48a344e5b990503ba50fc242Evan Cheng if (AvailCopyMap.erase(MappedDef)) { 70977679d6034791fd48a344e5b990503ba50fc242Evan Cheng for (const unsigned *SR = TRI->getSubRegisters(MappedDef); *SR; ++SR) 71977679d6034791fd48a344e5b990503ba50fc242Evan Cheng AvailCopyMap.erase(*SR); 72977679d6034791fd48a344e5b990503ba50fc242Evan Cheng } 73977679d6034791fd48a344e5b990503ba50fc242Evan Cheng } 74977679d6034791fd48a344e5b990503ba50fc242Evan Cheng for (const unsigned *AS = TRI->getAliasSet(Reg); *AS; ++AS) { 75977679d6034791fd48a344e5b990503ba50fc242Evan Cheng SI = SrcMap.find(*AS); 76977679d6034791fd48a344e5b990503ba50fc242Evan Cheng if (SI != SrcMap.end()) { 77977679d6034791fd48a344e5b990503ba50fc242Evan Cheng unsigned MappedDef = SI->second; 78977679d6034791fd48a344e5b990503ba50fc242Evan Cheng if (AvailCopyMap.erase(MappedDef)) { 79977679d6034791fd48a344e5b990503ba50fc242Evan Cheng for (const unsigned *SR = TRI->getSubRegisters(MappedDef); *SR; ++SR) 80977679d6034791fd48a344e5b990503ba50fc242Evan Cheng AvailCopyMap.erase(*SR); 81977679d6034791fd48a344e5b990503ba50fc242Evan Cheng } 82977679d6034791fd48a344e5b990503ba50fc242Evan Cheng } 83977679d6034791fd48a344e5b990503ba50fc242Evan Cheng } 84977679d6034791fd48a344e5b990503ba50fc242Evan Cheng} 85977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 86977679d6034791fd48a344e5b990503ba50fc242Evan Chengbool MachineCopyPropagation::CopyPropagateBlock(MachineBasicBlock &MBB) { 87977679d6034791fd48a344e5b990503ba50fc242Evan Cheng SmallSetVector<MachineInstr*, 8> MaybeDeadCopies; // Candidates for deletion 88977679d6034791fd48a344e5b990503ba50fc242Evan Cheng DenseMap<unsigned, MachineInstr*> AvailCopyMap; // Def -> available copies map 89977679d6034791fd48a344e5b990503ba50fc242Evan Cheng DenseMap<unsigned, MachineInstr*> CopyMap; // Def -> copies map 90977679d6034791fd48a344e5b990503ba50fc242Evan Cheng DenseMap<unsigned, unsigned> SrcMap; // Src -> Def map 91977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 92977679d6034791fd48a344e5b990503ba50fc242Evan Cheng bool Changed = false; 93977679d6034791fd48a344e5b990503ba50fc242Evan Cheng for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end(); I != E; ) { 94977679d6034791fd48a344e5b990503ba50fc242Evan Cheng MachineInstr *MI = &*I; 95977679d6034791fd48a344e5b990503ba50fc242Evan Cheng ++I; 96977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 97977679d6034791fd48a344e5b990503ba50fc242Evan Cheng if (MI->isCopy()) { 98977679d6034791fd48a344e5b990503ba50fc242Evan Cheng unsigned Def = MI->getOperand(0).getReg(); 99977679d6034791fd48a344e5b990503ba50fc242Evan Cheng unsigned Src = MI->getOperand(1).getReg(); 100977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 101977679d6034791fd48a344e5b990503ba50fc242Evan Cheng if (TargetRegisterInfo::isVirtualRegister(Def) || 102977679d6034791fd48a344e5b990503ba50fc242Evan Cheng TargetRegisterInfo::isVirtualRegister(Src)) 103977679d6034791fd48a344e5b990503ba50fc242Evan Cheng report_fatal_error("MachineCopyPropagation should be run after" 104977679d6034791fd48a344e5b990503ba50fc242Evan Cheng " register allocation!"); 105977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 106977679d6034791fd48a344e5b990503ba50fc242Evan Cheng DenseMap<unsigned, MachineInstr*>::iterator CI = AvailCopyMap.find(Src); 107977679d6034791fd48a344e5b990503ba50fc242Evan Cheng if (CI != AvailCopyMap.end()) { 108977679d6034791fd48a344e5b990503ba50fc242Evan Cheng MachineInstr *CopyMI = CI->second; 109977679d6034791fd48a344e5b990503ba50fc242Evan Cheng unsigned SrcSrc = CopyMI->getOperand(1).getReg(); 110977679d6034791fd48a344e5b990503ba50fc242Evan Cheng if (!ReservedRegs.test(Def) && 111977679d6034791fd48a344e5b990503ba50fc242Evan Cheng (SrcSrc == Def || TRI->isSubRegister(SrcSrc, Def))) { 112977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // The two copies cancel out and the source of the first copy 113977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // hasn't been overridden, eliminate the second one. e.g. 114977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // %ECX<def> = COPY %EAX<kill> 115977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // ... nothing clobbered EAX. 116977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // %EAX<def> = COPY %ECX 117977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // => 118977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // %ECX<def> = COPY %EAX 119977679d6034791fd48a344e5b990503ba50fc242Evan Cheng CopyMI->getOperand(1).setIsKill(false); 120977679d6034791fd48a344e5b990503ba50fc242Evan Cheng MI->eraseFromParent(); 121977679d6034791fd48a344e5b990503ba50fc242Evan Cheng Changed = true; 122977679d6034791fd48a344e5b990503ba50fc242Evan Cheng ++NumDeletes; 123977679d6034791fd48a344e5b990503ba50fc242Evan Cheng continue; 124977679d6034791fd48a344e5b990503ba50fc242Evan Cheng } 125977679d6034791fd48a344e5b990503ba50fc242Evan Cheng } 126977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 127977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // If Src is defined by a previous copy, it cannot be eliminated. 128977679d6034791fd48a344e5b990503ba50fc242Evan Cheng CI = CopyMap.find(Src); 129977679d6034791fd48a344e5b990503ba50fc242Evan Cheng if (CI != CopyMap.end()) 130977679d6034791fd48a344e5b990503ba50fc242Evan Cheng MaybeDeadCopies.remove(CI->second); 131977679d6034791fd48a344e5b990503ba50fc242Evan Cheng for (const unsigned *AS = TRI->getAliasSet(Src); *AS; ++AS) { 132977679d6034791fd48a344e5b990503ba50fc242Evan Cheng CI = CopyMap.find(*AS); 133977679d6034791fd48a344e5b990503ba50fc242Evan Cheng if (CI != CopyMap.end()) 134977679d6034791fd48a344e5b990503ba50fc242Evan Cheng MaybeDeadCopies.remove(CI->second); 135977679d6034791fd48a344e5b990503ba50fc242Evan Cheng } 136977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 137977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // Copy is now a candidate for deletion. 138977679d6034791fd48a344e5b990503ba50fc242Evan Cheng MaybeDeadCopies.insert(MI); 139977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 140977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // If 'Src' is previously source of another copy, then this earlier copy's 141977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // source is no longer available. e.g. 142977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // %xmm9<def> = copy %xmm2 143977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // ... 144977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // %xmm2<def> = copy %xmm0 145977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // ... 146977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // %xmm2<def> = copy %xmm9 147977679d6034791fd48a344e5b990503ba50fc242Evan Cheng SourceNoLongerAvailable(Def, SrcMap, AvailCopyMap); 148977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 149977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // Remember Def is defined by the copy. 150977679d6034791fd48a344e5b990503ba50fc242Evan Cheng CopyMap[Def] = MI; 151977679d6034791fd48a344e5b990503ba50fc242Evan Cheng AvailCopyMap[Def] = MI; 152977679d6034791fd48a344e5b990503ba50fc242Evan Cheng for (const unsigned *SR = TRI->getSubRegisters(Def); *SR; ++SR) { 153977679d6034791fd48a344e5b990503ba50fc242Evan Cheng CopyMap[*SR] = MI; 154977679d6034791fd48a344e5b990503ba50fc242Evan Cheng AvailCopyMap[*SR] = MI; 155977679d6034791fd48a344e5b990503ba50fc242Evan Cheng } 156977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 157977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // Remember source that's copied to Def. Once it's clobbered, then 158977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // it's no longer available for copy propagation. 159977679d6034791fd48a344e5b990503ba50fc242Evan Cheng SrcMap[Src] = Def; 160977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 161977679d6034791fd48a344e5b990503ba50fc242Evan Cheng continue; 162977679d6034791fd48a344e5b990503ba50fc242Evan Cheng } 163977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 164977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // Not a copy. 165977679d6034791fd48a344e5b990503ba50fc242Evan Cheng SmallVector<unsigned, 2> Defs; 166977679d6034791fd48a344e5b990503ba50fc242Evan Cheng for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 167977679d6034791fd48a344e5b990503ba50fc242Evan Cheng MachineOperand &MO = MI->getOperand(i); 168977679d6034791fd48a344e5b990503ba50fc242Evan Cheng if (!MO.isReg()) 169977679d6034791fd48a344e5b990503ba50fc242Evan Cheng continue; 170977679d6034791fd48a344e5b990503ba50fc242Evan Cheng unsigned Reg = MO.getReg(); 171977679d6034791fd48a344e5b990503ba50fc242Evan Cheng if (!Reg) 172977679d6034791fd48a344e5b990503ba50fc242Evan Cheng continue; 173977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 174977679d6034791fd48a344e5b990503ba50fc242Evan Cheng if (TargetRegisterInfo::isVirtualRegister(Reg)) 175977679d6034791fd48a344e5b990503ba50fc242Evan Cheng report_fatal_error("MachineCopyPropagation should be run after" 176977679d6034791fd48a344e5b990503ba50fc242Evan Cheng " register allocation!"); 177977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 178977679d6034791fd48a344e5b990503ba50fc242Evan Cheng if (MO.isDef()) { 179977679d6034791fd48a344e5b990503ba50fc242Evan Cheng Defs.push_back(Reg); 180977679d6034791fd48a344e5b990503ba50fc242Evan Cheng continue; 181977679d6034791fd48a344e5b990503ba50fc242Evan Cheng } 182977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 183977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // If 'Reg' is defined by a copy, the copy is no longer a candidate 184977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // for elimination. 185977679d6034791fd48a344e5b990503ba50fc242Evan Cheng DenseMap<unsigned, MachineInstr*>::iterator CI = CopyMap.find(Reg); 186977679d6034791fd48a344e5b990503ba50fc242Evan Cheng if (CI != CopyMap.end()) 187977679d6034791fd48a344e5b990503ba50fc242Evan Cheng MaybeDeadCopies.remove(CI->second); 188977679d6034791fd48a344e5b990503ba50fc242Evan Cheng for (const unsigned *AS = TRI->getAliasSet(Reg); *AS; ++AS) { 189977679d6034791fd48a344e5b990503ba50fc242Evan Cheng CI = CopyMap.find(*AS); 190977679d6034791fd48a344e5b990503ba50fc242Evan Cheng if (CI != CopyMap.end()) 191977679d6034791fd48a344e5b990503ba50fc242Evan Cheng MaybeDeadCopies.remove(CI->second); 192977679d6034791fd48a344e5b990503ba50fc242Evan Cheng } 193977679d6034791fd48a344e5b990503ba50fc242Evan Cheng } 194977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 195977679d6034791fd48a344e5b990503ba50fc242Evan Cheng for (unsigned i = 0, e = Defs.size(); i != e; ++i) { 196977679d6034791fd48a344e5b990503ba50fc242Evan Cheng unsigned Reg = Defs[i]; 197977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 198977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // No longer defined by a copy. 199977679d6034791fd48a344e5b990503ba50fc242Evan Cheng CopyMap.erase(Reg); 200977679d6034791fd48a344e5b990503ba50fc242Evan Cheng AvailCopyMap.erase(Reg); 201977679d6034791fd48a344e5b990503ba50fc242Evan Cheng for (const unsigned *AS = TRI->getAliasSet(Reg); *AS; ++AS) { 202977679d6034791fd48a344e5b990503ba50fc242Evan Cheng CopyMap.erase(*AS); 203977679d6034791fd48a344e5b990503ba50fc242Evan Cheng AvailCopyMap.erase(*AS); 204977679d6034791fd48a344e5b990503ba50fc242Evan Cheng } 205977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 206977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // If 'Reg' is previously source of a copy, it is no longer available for 207977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // copy propagation. 208977679d6034791fd48a344e5b990503ba50fc242Evan Cheng SourceNoLongerAvailable(Reg, SrcMap, AvailCopyMap); 209977679d6034791fd48a344e5b990503ba50fc242Evan Cheng } 210977679d6034791fd48a344e5b990503ba50fc242Evan Cheng } 211977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 212977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // If MBB doesn't have successors, delete the copies whose defs are not used. 213977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // If MBB does have successors, then conservative assume the defs are live-out 214977679d6034791fd48a344e5b990503ba50fc242Evan Cheng // since we don't want to trust live-in lists. 215977679d6034791fd48a344e5b990503ba50fc242Evan Cheng if (MBB.succ_empty()) { 216977679d6034791fd48a344e5b990503ba50fc242Evan Cheng for (SmallSetVector<MachineInstr*, 8>::iterator 217977679d6034791fd48a344e5b990503ba50fc242Evan Cheng DI = MaybeDeadCopies.begin(), DE = MaybeDeadCopies.end(); 218977679d6034791fd48a344e5b990503ba50fc242Evan Cheng DI != DE; ++DI) { 219977679d6034791fd48a344e5b990503ba50fc242Evan Cheng if (!ReservedRegs.test((*DI)->getOperand(0).getReg())) { 220977679d6034791fd48a344e5b990503ba50fc242Evan Cheng (*DI)->eraseFromParent(); 221977679d6034791fd48a344e5b990503ba50fc242Evan Cheng Changed = true; 222977679d6034791fd48a344e5b990503ba50fc242Evan Cheng ++NumDeletes; 223977679d6034791fd48a344e5b990503ba50fc242Evan Cheng } 224977679d6034791fd48a344e5b990503ba50fc242Evan Cheng } 225977679d6034791fd48a344e5b990503ba50fc242Evan Cheng } 226977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 227977679d6034791fd48a344e5b990503ba50fc242Evan Cheng return Changed; 228977679d6034791fd48a344e5b990503ba50fc242Evan Cheng} 229977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 230977679d6034791fd48a344e5b990503ba50fc242Evan Chengbool MachineCopyPropagation::runOnMachineFunction(MachineFunction &MF) { 231977679d6034791fd48a344e5b990503ba50fc242Evan Cheng bool Changed = false; 232977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 233977679d6034791fd48a344e5b990503ba50fc242Evan Cheng TRI = MF.getTarget().getRegisterInfo(); 234977679d6034791fd48a344e5b990503ba50fc242Evan Cheng ReservedRegs = TRI->getReservedRegs(MF); 235977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 236977679d6034791fd48a344e5b990503ba50fc242Evan Cheng for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) 237977679d6034791fd48a344e5b990503ba50fc242Evan Cheng Changed |= CopyPropagateBlock(*I); 238977679d6034791fd48a344e5b990503ba50fc242Evan Cheng 239977679d6034791fd48a344e5b990503ba50fc242Evan Cheng return Changed; 240977679d6034791fd48a344e5b990503ba50fc242Evan Cheng} 241