MachineCopyPropagation.cpp revision d9eb1d77979f10d0237af22d87789803162044fa
1//===- MachineCopyPropagation.cpp - Machine Copy Propagation Pass ---------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This is an extremely simple MachineInstr-level copy propagation pass. 11// 12//===----------------------------------------------------------------------===// 13 14#define DEBUG_TYPE "codegen-cp" 15#include "llvm/CodeGen/Passes.h" 16#include "llvm/Pass.h" 17#include "llvm/CodeGen/MachineFunction.h" 18#include "llvm/CodeGen/MachineFunctionPass.h" 19#include "llvm/Target/TargetRegisterInfo.h" 20#include "llvm/Support/Debug.h" 21#include "llvm/Support/ErrorHandling.h" 22#include "llvm/Support/raw_ostream.h" 23#include "llvm/ADT/BitVector.h" 24#include "llvm/ADT/DenseMap.h" 25#include "llvm/ADT/DenseSet.h" 26#include "llvm/ADT/SetVector.h" 27#include "llvm/ADT/SmallVector.h" 28#include "llvm/ADT/Statistic.h" 29using namespace llvm; 30 31STATISTIC(NumDeletes, "Number of dead copies deleted"); 32 33namespace { 34 class MachineCopyPropagation : public MachineFunctionPass { 35 const TargetRegisterInfo *TRI; 36 BitVector ReservedRegs; 37 38 public: 39 static char ID; // Pass identification, replacement for typeid 40 MachineCopyPropagation() : MachineFunctionPass(ID) { 41 initializeMachineCopyPropagationPass(*PassRegistry::getPassRegistry()); 42 } 43 44 virtual bool runOnMachineFunction(MachineFunction &MF); 45 46 private: 47 void SourceNoLongerAvailable(unsigned Reg, 48 DenseMap<unsigned, DenseSet<unsigned> > &SrcMap, 49 DenseMap<unsigned, MachineInstr*> &AvailCopyMap); 50 bool CopyPropagateBlock(MachineBasicBlock &MBB); 51 }; 52} 53char MachineCopyPropagation::ID = 0; 54char &llvm::MachineCopyPropagationID = MachineCopyPropagation::ID; 55 56INITIALIZE_PASS(MachineCopyPropagation, "machine-cp", 57 "Machine Copy Propagation Pass", false, false) 58 59void 60MachineCopyPropagation::SourceNoLongerAvailable(unsigned Reg, 61 DenseMap<unsigned, DenseSet<unsigned> > &SrcMap, 62 DenseMap<unsigned, MachineInstr*> &AvailCopyMap) { 63 DenseMap<unsigned, DenseSet<unsigned> >::iterator SI = SrcMap.find(Reg); 64 if (SI != SrcMap.end()) { 65 const DenseSet<unsigned>& Defs = SI->second; 66 for (DenseSet<unsigned>::const_iterator I = Defs.begin(), E = Defs.end(); 67 I != E; ++I) { 68 unsigned MappedDef = *I; 69 // Source of copy is no longer available for propagation. 70 if (AvailCopyMap.erase(MappedDef)) { 71 for (const uint16_t *SR = TRI->getSubRegisters(MappedDef); *SR; ++SR) 72 AvailCopyMap.erase(*SR); 73 } 74 } 75 } 76 for (const uint16_t *AS = TRI->getAliasSet(Reg); *AS; ++AS) { 77 SI = SrcMap.find(*AS); 78 if (SI != SrcMap.end()) { 79 const DenseSet<unsigned>& Defs = SI->second; 80 for (DenseSet<unsigned>::const_iterator I = Defs.begin(), E = Defs.end(); 81 I != E; ++I) { 82 unsigned MappedDef = *I; 83 if (AvailCopyMap.erase(MappedDef)) { 84 for (const uint16_t *SR = TRI->getSubRegisters(MappedDef); *SR; ++SR) 85 AvailCopyMap.erase(*SR); 86 } 87 } 88 } 89 } 90} 91 92static bool NoInterveningSideEffect(const MachineInstr *CopyMI, 93 const MachineInstr *MI) { 94 const MachineBasicBlock *MBB = CopyMI->getParent(); 95 if (MI->getParent() != MBB) 96 return false; 97 MachineBasicBlock::const_iterator I = CopyMI; 98 MachineBasicBlock::const_iterator E = MBB->end(); 99 MachineBasicBlock::const_iterator E2 = MI; 100 101 ++I; 102 while (I != E && I != E2) { 103 if (I->hasUnmodeledSideEffects() || I->isCall() || 104 I->isTerminator()) 105 return false; 106 ++I; 107 } 108 return true; 109} 110 111/// isNopCopy - Return true if the specified copy is really a nop. That is 112/// if the source of the copy is the same of the definition of the copy that 113/// supplied the source. If the source of the copy is a sub-register than it 114/// must check the sub-indices match. e.g. 115/// ecx = mov eax 116/// al = mov cl 117/// But not 118/// ecx = mov eax 119/// al = mov ch 120static bool isNopCopy(MachineInstr *CopyMI, unsigned Def, unsigned Src, 121 const TargetRegisterInfo *TRI) { 122 unsigned SrcSrc = CopyMI->getOperand(1).getReg(); 123 if (Def == SrcSrc) 124 return true; 125 if (TRI->isSubRegister(SrcSrc, Def)) { 126 unsigned SrcDef = CopyMI->getOperand(0).getReg(); 127 unsigned SubIdx = TRI->getSubRegIndex(SrcSrc, Def); 128 if (!SubIdx) 129 return false; 130 return SubIdx == TRI->getSubRegIndex(SrcDef, Src); 131 } 132 133 return false; 134} 135 136bool MachineCopyPropagation::CopyPropagateBlock(MachineBasicBlock &MBB) { 137 SmallSetVector<MachineInstr*, 8> MaybeDeadCopies; // Candidates for deletion 138 DenseMap<unsigned, MachineInstr*> AvailCopyMap; // Def -> available copies map 139 DenseMap<unsigned, MachineInstr*> CopyMap; // Def -> copies map 140 DenseMap<unsigned, DenseSet<unsigned> > SrcMap; // Src -> Def map 141 142 bool Changed = false; 143 for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end(); I != E; ) { 144 MachineInstr *MI = &*I; 145 ++I; 146 147 if (MI->isCopy()) { 148 unsigned Def = MI->getOperand(0).getReg(); 149 unsigned Src = MI->getOperand(1).getReg(); 150 151 if (TargetRegisterInfo::isVirtualRegister(Def) || 152 TargetRegisterInfo::isVirtualRegister(Src)) 153 report_fatal_error("MachineCopyPropagation should be run after" 154 " register allocation!"); 155 156 DenseMap<unsigned, MachineInstr*>::iterator CI = AvailCopyMap.find(Src); 157 if (CI != AvailCopyMap.end()) { 158 MachineInstr *CopyMI = CI->second; 159 if (!ReservedRegs.test(Def) && 160 (!ReservedRegs.test(Src) || NoInterveningSideEffect(CopyMI, MI)) && 161 isNopCopy(CopyMI, Def, Src, TRI)) { 162 // The two copies cancel out and the source of the first copy 163 // hasn't been overridden, eliminate the second one. e.g. 164 // %ECX<def> = COPY %EAX<kill> 165 // ... nothing clobbered EAX. 166 // %EAX<def> = COPY %ECX 167 // => 168 // %ECX<def> = COPY %EAX 169 // 170 // Also avoid eliminating a copy from reserved registers unless the 171 // definition is proven not clobbered. e.g. 172 // %RSP<def> = COPY %RAX 173 // CALL 174 // %RAX<def> = COPY %RSP 175 176 // Clear any kills of Def between CopyMI and MI. This extends the 177 // live range. 178 for (MachineBasicBlock::iterator I = CopyMI, E = MI; I != E; ++I) 179 I->clearRegisterKills(Def, TRI); 180 181 MI->eraseFromParent(); 182 Changed = true; 183 ++NumDeletes; 184 continue; 185 } 186 } 187 188 // If Src is defined by a previous copy, it cannot be eliminated. 189 CI = CopyMap.find(Src); 190 if (CI != CopyMap.end()) 191 MaybeDeadCopies.remove(CI->second); 192 for (const uint16_t *AS = TRI->getAliasSet(Src); *AS; ++AS) { 193 CI = CopyMap.find(*AS); 194 if (CI != CopyMap.end()) 195 MaybeDeadCopies.remove(CI->second); 196 } 197 198 // Copy is now a candidate for deletion. 199 MaybeDeadCopies.insert(MI); 200 201 // If 'Src' is previously source of another copy, then this earlier copy's 202 // source is no longer available. e.g. 203 // %xmm9<def> = copy %xmm2 204 // ... 205 // %xmm2<def> = copy %xmm0 206 // ... 207 // %xmm2<def> = copy %xmm9 208 SourceNoLongerAvailable(Def, SrcMap, AvailCopyMap); 209 210 // Remember Def is defined by the copy. 211 // ... Make sure to clear the def maps of aliases first. 212 for (const uint16_t *AS = TRI->getAliasSet(Def); *AS; ++AS) { 213 CopyMap.erase(*AS); 214 AvailCopyMap.erase(*AS); 215 } 216 CopyMap[Def] = MI; 217 AvailCopyMap[Def] = MI; 218 for (const uint16_t *SR = TRI->getSubRegisters(Def); *SR; ++SR) { 219 CopyMap[*SR] = MI; 220 AvailCopyMap[*SR] = MI; 221 } 222 223 // Remember source that's copied to Def. Once it's clobbered, then 224 // it's no longer available for copy propagation. 225 SrcMap[Src].insert(Def); 226 227 continue; 228 } 229 230 // Not a copy. 231 SmallVector<unsigned, 2> Defs; 232 int RegMaskOpNum = -1; 233 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 234 MachineOperand &MO = MI->getOperand(i); 235 if (MO.isRegMask()) 236 RegMaskOpNum = i; 237 if (!MO.isReg()) 238 continue; 239 unsigned Reg = MO.getReg(); 240 if (!Reg) 241 continue; 242 243 if (TargetRegisterInfo::isVirtualRegister(Reg)) 244 report_fatal_error("MachineCopyPropagation should be run after" 245 " register allocation!"); 246 247 if (MO.isDef()) { 248 Defs.push_back(Reg); 249 continue; 250 } 251 252 // If 'Reg' is defined by a copy, the copy is no longer a candidate 253 // for elimination. 254 DenseMap<unsigned, MachineInstr*>::iterator CI = CopyMap.find(Reg); 255 if (CI != CopyMap.end()) 256 MaybeDeadCopies.remove(CI->second); 257 for (const uint16_t *AS = TRI->getAliasSet(Reg); *AS; ++AS) { 258 CI = CopyMap.find(*AS); 259 if (CI != CopyMap.end()) 260 MaybeDeadCopies.remove(CI->second); 261 } 262 } 263 264 // The instruction has a register mask operand which means that it clobbers 265 // a large set of registers. It is possible to use the register mask to 266 // prune the available copies, but treat it like a basic block boundary for 267 // now. 268 if (RegMaskOpNum >= 0) { 269 // Erase any MaybeDeadCopies whose destination register is clobbered. 270 const MachineOperand &MaskMO = MI->getOperand(RegMaskOpNum); 271 for (SmallSetVector<MachineInstr*, 8>::iterator 272 DI = MaybeDeadCopies.begin(), DE = MaybeDeadCopies.end(); 273 DI != DE; ++DI) { 274 unsigned Reg = (*DI)->getOperand(0).getReg(); 275 if (ReservedRegs.test(Reg) || !MaskMO.clobbersPhysReg(Reg)) 276 continue; 277 (*DI)->eraseFromParent(); 278 Changed = true; 279 ++NumDeletes; 280 } 281 282 // Clear all data structures as if we were beginning a new basic block. 283 MaybeDeadCopies.clear(); 284 AvailCopyMap.clear(); 285 CopyMap.clear(); 286 SrcMap.clear(); 287 continue; 288 } 289 290 for (unsigned i = 0, e = Defs.size(); i != e; ++i) { 291 unsigned Reg = Defs[i]; 292 293 // No longer defined by a copy. 294 CopyMap.erase(Reg); 295 AvailCopyMap.erase(Reg); 296 for (const uint16_t *AS = TRI->getAliasSet(Reg); *AS; ++AS) { 297 CopyMap.erase(*AS); 298 AvailCopyMap.erase(*AS); 299 } 300 301 // If 'Reg' is previously source of a copy, it is no longer available for 302 // copy propagation. 303 SourceNoLongerAvailable(Reg, SrcMap, AvailCopyMap); 304 } 305 } 306 307 // If MBB doesn't have successors, delete the copies whose defs are not used. 308 // If MBB does have successors, then conservative assume the defs are live-out 309 // since we don't want to trust live-in lists. 310 if (MBB.succ_empty()) { 311 for (SmallSetVector<MachineInstr*, 8>::iterator 312 DI = MaybeDeadCopies.begin(), DE = MaybeDeadCopies.end(); 313 DI != DE; ++DI) { 314 if (!ReservedRegs.test((*DI)->getOperand(0).getReg())) { 315 (*DI)->eraseFromParent(); 316 Changed = true; 317 ++NumDeletes; 318 } 319 } 320 } 321 322 return Changed; 323} 324 325bool MachineCopyPropagation::runOnMachineFunction(MachineFunction &MF) { 326 bool Changed = false; 327 328 TRI = MF.getTarget().getRegisterInfo(); 329 ReservedRegs = TRI->getReservedRegs(MF); 330 331 for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) 332 Changed |= CopyPropagateBlock(*I); 333 334 return Changed; 335} 336