ProcessImplicitDefs.cpp revision 0cafa139c01aa9d5072b185d686a05b9d8ab1ee7
1//===---------------------- ProcessImplicitDefs.cpp -----------------------===// 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#define DEBUG_TYPE "processimplicitdefs" 11 12#include "llvm/ADT/DepthFirstIterator.h" 13#include "llvm/ADT/SmallSet.h" 14#include "llvm/Analysis/AliasAnalysis.h" 15#include "llvm/CodeGen/LiveVariables.h" 16#include "llvm/CodeGen/MachineFunctionPass.h" 17#include "llvm/CodeGen/MachineInstr.h" 18#include "llvm/CodeGen/MachineRegisterInfo.h" 19#include "llvm/CodeGen/Passes.h" 20#include "llvm/Support/Debug.h" 21#include "llvm/Target/TargetInstrInfo.h" 22#include "llvm/Target/TargetRegisterInfo.h" 23 24 25using namespace llvm; 26 27namespace { 28/// Process IMPLICIT_DEF instructions and make sure there is one implicit_def 29/// for each use. Add isUndef marker to implicit_def defs and their uses. 30class ProcessImplicitDefs : public MachineFunctionPass { 31 const TargetInstrInfo *TII; 32 const TargetRegisterInfo *TRI; 33 MachineRegisterInfo *MRI; 34 LiveVariables *LV; 35 36 bool CanTurnIntoImplicitDef(MachineInstr *MI, unsigned Reg, 37 unsigned OpIdx, 38 SmallSet<unsigned, 8> &ImpDefRegs); 39 40public: 41 static char ID; 42 43 ProcessImplicitDefs() : MachineFunctionPass(ID) { 44 initializeProcessImplicitDefsPass(*PassRegistry::getPassRegistry()); 45 } 46 47 virtual void getAnalysisUsage(AnalysisUsage &au) const; 48 49 virtual bool runOnMachineFunction(MachineFunction &fn); 50}; 51} // end anonymous namespace 52 53char ProcessImplicitDefs::ID = 0; 54char &llvm::ProcessImplicitDefsID = ProcessImplicitDefs::ID; 55 56INITIALIZE_PASS_BEGIN(ProcessImplicitDefs, "processimpdefs", 57 "Process Implicit Definitions", false, false) 58INITIALIZE_PASS_DEPENDENCY(LiveVariables) 59INITIALIZE_PASS_END(ProcessImplicitDefs, "processimpdefs", 60 "Process Implicit Definitions", false, false) 61 62void ProcessImplicitDefs::getAnalysisUsage(AnalysisUsage &AU) const { 63 AU.setPreservesCFG(); 64 AU.addPreserved<AliasAnalysis>(); 65 AU.addPreserved<LiveVariables>(); 66 AU.addPreservedID(MachineLoopInfoID); 67 AU.addPreservedID(MachineDominatorsID); 68 AU.addPreservedID(TwoAddressInstructionPassID); 69 AU.addPreservedID(PHIEliminationID); 70 MachineFunctionPass::getAnalysisUsage(AU); 71} 72 73bool 74ProcessImplicitDefs::CanTurnIntoImplicitDef(MachineInstr *MI, 75 unsigned Reg, unsigned OpIdx, 76 SmallSet<unsigned, 8> &ImpDefRegs) { 77 switch(OpIdx) { 78 case 1: 79 return MI->isCopy() && (!MI->getOperand(0).readsReg() || 80 ImpDefRegs.count(MI->getOperand(0).getReg())); 81 case 2: 82 return MI->isSubregToReg() && (!MI->getOperand(0).readsReg() || 83 ImpDefRegs.count(MI->getOperand(0).getReg())); 84 default: return false; 85 } 86} 87 88static bool isUndefCopy(MachineInstr *MI, unsigned Reg, 89 SmallSet<unsigned, 8> &ImpDefRegs) { 90 if (MI->isCopy()) { 91 MachineOperand &MO0 = MI->getOperand(0); 92 MachineOperand &MO1 = MI->getOperand(1); 93 if (MO1.getReg() != Reg) 94 return false; 95 if (!MO0.readsReg() || ImpDefRegs.count(MO0.getReg())) 96 return true; 97 return false; 98 } 99 return false; 100} 101 102/// processImplicitDefs - Process IMPLICIT_DEF instructions and make sure 103/// there is one implicit_def for each use. Add isUndef marker to 104/// implicit_def defs and their uses. 105bool ProcessImplicitDefs::runOnMachineFunction(MachineFunction &fn) { 106 107 DEBUG(dbgs() << "********** PROCESS IMPLICIT DEFS **********\n" 108 << "********** Function: " 109 << ((Value*)fn.getFunction())->getName() << '\n'); 110 111 bool Changed = false; 112 113 TII = fn.getTarget().getInstrInfo(); 114 TRI = fn.getTarget().getRegisterInfo(); 115 MRI = &fn.getRegInfo(); 116 LV = getAnalysisIfAvailable<LiveVariables>(); 117 118 SmallSet<unsigned, 8> ImpDefRegs; 119 SmallVector<MachineInstr*, 8> ImpDefMIs; 120 SmallVector<MachineInstr*, 4> RUses; 121 SmallPtrSet<MachineBasicBlock*,16> Visited; 122 SmallPtrSet<MachineInstr*, 8> ModInsts; 123 124 MachineBasicBlock *Entry = fn.begin(); 125 for (df_ext_iterator<MachineBasicBlock*, SmallPtrSet<MachineBasicBlock*,16> > 126 DFI = df_ext_begin(Entry, Visited), E = df_ext_end(Entry, Visited); 127 DFI != E; ++DFI) { 128 MachineBasicBlock *MBB = *DFI; 129 for (MachineBasicBlock::iterator I = MBB->begin(), E = MBB->end(); 130 I != E; ) { 131 MachineInstr *MI = &*I; 132 ++I; 133 if (MI->isImplicitDef()) { 134 ImpDefMIs.push_back(MI); 135 // Is this a sub-register read-modify-write? 136 if (MI->getOperand(0).readsReg()) 137 continue; 138 unsigned Reg = MI->getOperand(0).getReg(); 139 ImpDefRegs.insert(Reg); 140 if (TargetRegisterInfo::isPhysicalRegister(Reg)) { 141 for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) 142 ImpDefRegs.insert(*SubRegs); 143 } 144 continue; 145 } 146 147 // Eliminate %reg1032:sub<def> = COPY undef. 148 if (MI->isCopy() && MI->getOperand(0).readsReg()) { 149 MachineOperand &MO = MI->getOperand(1); 150 if (MO.isUndef() || ImpDefRegs.count(MO.getReg())) { 151 if (LV && MO.isKill()) { 152 LiveVariables::VarInfo& vi = LV->getVarInfo(MO.getReg()); 153 vi.removeKill(MI); 154 } 155 unsigned Reg = MI->getOperand(0).getReg(); 156 MI->eraseFromParent(); 157 Changed = true; 158 159 // A REG_SEQUENCE may have been expanded into partial definitions. 160 // If this was the last one, mark Reg as implicitly defined. 161 if (TargetRegisterInfo::isVirtualRegister(Reg) && MRI->def_empty(Reg)) 162 ImpDefRegs.insert(Reg); 163 continue; 164 } 165 } 166 167 bool ChangedToImpDef = false; 168 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 169 MachineOperand& MO = MI->getOperand(i); 170 if (!MO.isReg() || !MO.readsReg()) 171 continue; 172 unsigned Reg = MO.getReg(); 173 if (!Reg) 174 continue; 175 if (!ImpDefRegs.count(Reg)) 176 continue; 177 // Use is a copy, just turn it into an implicit_def. 178 if (CanTurnIntoImplicitDef(MI, Reg, i, ImpDefRegs)) { 179 bool isKill = MO.isKill(); 180 MI->setDesc(TII->get(TargetOpcode::IMPLICIT_DEF)); 181 for (int j = MI->getNumOperands() - 1, ee = 0; j > ee; --j) 182 MI->RemoveOperand(j); 183 if (isKill) { 184 ImpDefRegs.erase(Reg); 185 if (LV) { 186 LiveVariables::VarInfo& vi = LV->getVarInfo(Reg); 187 vi.removeKill(MI); 188 } 189 } 190 ChangedToImpDef = true; 191 Changed = true; 192 break; 193 } 194 195 Changed = true; 196 MO.setIsUndef(); 197 // This is a partial register redef of an implicit def. 198 // Make sure the whole register is defined by the instruction. 199 if (MO.isDef()) { 200 MI->addRegisterDefined(Reg); 201 continue; 202 } 203 if (MO.isKill() || MI->isRegTiedToDefOperand(i)) { 204 // Make sure other reads of Reg are also marked <undef>. 205 for (unsigned j = i+1; j != e; ++j) { 206 MachineOperand &MOJ = MI->getOperand(j); 207 if (MOJ.isReg() && MOJ.getReg() == Reg && MOJ.readsReg()) 208 MOJ.setIsUndef(); 209 } 210 ImpDefRegs.erase(Reg); 211 } 212 } 213 214 if (ChangedToImpDef) { 215 // Backtrack to process this new implicit_def. 216 --I; 217 } else { 218 for (unsigned i = 0; i != MI->getNumOperands(); ++i) { 219 MachineOperand& MO = MI->getOperand(i); 220 if (!MO.isReg() || !MO.isDef()) 221 continue; 222 ImpDefRegs.erase(MO.getReg()); 223 } 224 } 225 } 226 227 // Any outstanding liveout implicit_def's? 228 for (unsigned i = 0, e = ImpDefMIs.size(); i != e; ++i) { 229 MachineInstr *MI = ImpDefMIs[i]; 230 unsigned Reg = MI->getOperand(0).getReg(); 231 if (TargetRegisterInfo::isPhysicalRegister(Reg) || 232 !ImpDefRegs.count(Reg)) { 233 // Delete all "local" implicit_def's. That include those which define 234 // physical registers since they cannot be liveout. 235 MI->eraseFromParent(); 236 Changed = true; 237 continue; 238 } 239 240 // If there are multiple defs of the same register and at least one 241 // is not an implicit_def, do not insert implicit_def's before the 242 // uses. 243 bool Skip = false; 244 SmallVector<MachineInstr*, 4> DeadImpDefs; 245 for (MachineRegisterInfo::def_iterator DI = MRI->def_begin(Reg), 246 DE = MRI->def_end(); DI != DE; ++DI) { 247 MachineInstr *DeadImpDef = &*DI; 248 if (!DeadImpDef->isImplicitDef()) { 249 Skip = true; 250 break; 251 } 252 DeadImpDefs.push_back(DeadImpDef); 253 } 254 if (Skip) 255 continue; 256 257 // The only implicit_def which we want to keep are those that are live 258 // out of its block. 259 for (unsigned j = 0, ee = DeadImpDefs.size(); j != ee; ++j) 260 DeadImpDefs[j]->eraseFromParent(); 261 Changed = true; 262 263 // Process each use instruction once. 264 for (MachineRegisterInfo::use_iterator UI = MRI->use_begin(Reg), 265 UE = MRI->use_end(); UI != UE; ++UI) { 266 if (UI.getOperand().isUndef()) 267 continue; 268 MachineInstr *RMI = &*UI; 269 if (ModInsts.insert(RMI)) 270 RUses.push_back(RMI); 271 } 272 273 for (unsigned i = 0, e = RUses.size(); i != e; ++i) { 274 MachineInstr *RMI = RUses[i]; 275 276 // Turn a copy use into an implicit_def. 277 if (isUndefCopy(RMI, Reg, ImpDefRegs)) { 278 RMI->setDesc(TII->get(TargetOpcode::IMPLICIT_DEF)); 279 280 bool isKill = false; 281 SmallVector<unsigned, 4> Ops; 282 for (unsigned j = 0, ee = RMI->getNumOperands(); j != ee; ++j) { 283 MachineOperand &RRMO = RMI->getOperand(j); 284 if (RRMO.isReg() && RRMO.getReg() == Reg) { 285 Ops.push_back(j); 286 if (RRMO.isKill()) 287 isKill = true; 288 } 289 } 290 // Leave the other operands along. 291 for (unsigned j = 0, ee = Ops.size(); j != ee; ++j) { 292 unsigned OpIdx = Ops[j]; 293 RMI->RemoveOperand(OpIdx-j); 294 } 295 296 // Update LiveVariables varinfo if the instruction is a kill. 297 if (LV && isKill) { 298 LiveVariables::VarInfo& vi = LV->getVarInfo(Reg); 299 vi.removeKill(RMI); 300 } 301 continue; 302 } 303 304 // Replace Reg with a new vreg that's marked implicit. 305 const TargetRegisterClass* RC = MRI->getRegClass(Reg); 306 unsigned NewVReg = MRI->createVirtualRegister(RC); 307 bool isKill = true; 308 for (unsigned j = 0, ee = RMI->getNumOperands(); j != ee; ++j) { 309 MachineOperand &RRMO = RMI->getOperand(j); 310 if (RRMO.isReg() && RRMO.getReg() == Reg) { 311 RRMO.setReg(NewVReg); 312 RRMO.setIsUndef(); 313 if (isKill) { 314 // Only the first operand of NewVReg is marked kill. 315 RRMO.setIsKill(); 316 isKill = false; 317 } 318 } 319 } 320 } 321 RUses.clear(); 322 ModInsts.clear(); 323 } 324 ImpDefRegs.clear(); 325 ImpDefMIs.clear(); 326 } 327 328 return Changed; 329} 330 331