1 //===-- MachineLICM.cpp - Machine Loop Invariant Code Motion 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 pass performs loop invariant code motion on machine instructions. We 11 // attempt to remove as much code from the body of a loop as possible. 12 // 13 // This pass does not attempt to throttle itself to limit register pressure. 14 // The register allocation phases are expected to perform rematerialization 15 // to recover when register pressure is high. 16 // 17 // This pass is not intended to be a replacement or a complete alternative 18 // for the LLVM-IR-level LICM pass. It is only designed to hoist simple 19 // constructs that are not exposed before lowering and instruction selection. 20 // 21 //===----------------------------------------------------------------------===// 22 23 #define DEBUG_TYPE "machine-licm" 24 #include "llvm/CodeGen/Passes.h" 25 #include "llvm/CodeGen/MachineDominators.h" 26 #include "llvm/CodeGen/MachineLoopInfo.h" 27 #include "llvm/CodeGen/MachineRegisterInfo.h" 28 #include "llvm/Target/TargetRegisterInfo.h" 29 #include "llvm/Target/TargetInstrInfo.h" 30 #include "llvm/Target/TargetMachine.h" 31 #include "llvm/ADT/DenseMap.h" 32 #include "llvm/ADT/Statistic.h" 33 #include "llvm/Support/CommandLine.h" 34 #include "llvm/Support/Compiler.h" 35 #include "llvm/Support/Debug.h" 36 #include "llvm/Support/raw_ostream.h" 37 38 using namespace llvm; 39 40 STATISTIC(NumHoisted, "Number of machine instructions hoisted out of loops"); 41 STATISTIC(NumCSEed, "Number of hoisted machine instructions CSEed"); 42 43 namespace { 44 class VISIBILITY_HIDDEN MachineLICM : public MachineFunctionPass { 45 const TargetMachine *TM; 46 const TargetInstrInfo *TII; 47 48 // Various analyses that we use... 49 MachineLoopInfo *LI; // Current MachineLoopInfo 50 MachineDominatorTree *DT; // Machine dominator tree for the cur loop 51 MachineRegisterInfo *RegInfo; // Machine register information 52 53 // State that is updated as we process loops 54 bool Changed; // True if a loop is changed. 55 MachineLoop *CurLoop; // The current loop we are working on. 56 MachineBasicBlock *CurPreheader; // The preheader for CurLoop. 57 58 // For each BB and opcode pair, keep a list of hoisted instructions. 59 DenseMap<std::pair<unsigned, unsigned>, 60 std::vector<const MachineInstr*> > CSEMap; 61 public: 62 static char ID; // Pass identification, replacement for typeid 63 MachineLICM() : MachineFunctionPass(&ID) {} 64 65 virtual bool runOnMachineFunction(MachineFunction &MF); 66 67 const char *getPassName() const { return "Machine Instruction LICM"; } 68 69 // FIXME: Loop preheaders? 70 virtual void getAnalysisUsage(AnalysisUsage &AU) const { 71 AU.setPreservesCFG(); 72 AU.addRequired<MachineLoopInfo>(); 73 AU.addRequired<MachineDominatorTree>(); 74 AU.addPreserved<MachineLoopInfo>(); 75 AU.addPreserved<MachineDominatorTree>(); 76 MachineFunctionPass::getAnalysisUsage(AU); 77 } 78 79 virtual void releaseMemory() { 80 CSEMap.clear(); 81 } 82 83 private: 84 /// IsLoopInvariantInst - Returns true if the instruction is loop 85 /// invariant. I.e., all virtual register operands are defined outside of 86 /// the loop, physical registers aren't accessed (explicitly or implicitly), 87 /// and the instruction is hoistable. 88 /// 89 bool IsLoopInvariantInst(MachineInstr &I); 90 91 /// IsProfitableToHoist - Return true if it is potentially profitable to 92 /// hoist the given loop invariant. 93 bool IsProfitableToHoist(MachineInstr &MI); 94 95 /// HoistRegion - Walk the specified region of the CFG (defined by all 96 /// blocks dominated by the specified block, and that are in the current 97 /// loop) in depth first order w.r.t the DominatorTree. This allows us to 98 /// visit definitions before uses, allowing us to hoist a loop body in one 99 /// pass without iteration. 100 /// 101 void HoistRegion(MachineDomTreeNode *N); 102 103 /// Hoist - When an instruction is found to only use loop invariant operands 104 /// that is safe to hoist, this instruction is called to do the dirty work. 105 /// 106 void Hoist(MachineInstr &MI); 107 }; 108 } // end anonymous namespace 109 110 char MachineLICM::ID = 0; 111 static RegisterPass<MachineLICM> 112 X("machinelicm", "Machine Loop Invariant Code Motion"); 113 114 FunctionPass *llvm::createMachineLICMPass() { return new MachineLICM(); } 115 116 /// LoopIsOuterMostWithPreheader - Test if the given loop is the outer-most 117 /// loop that has a preheader. 118 static bool LoopIsOuterMostWithPreheader(MachineLoop *CurLoop) { 119 for (MachineLoop *L = CurLoop->getParentLoop(); L; L = L->getParentLoop()) 120 if (L->getLoopPreheader()) 121 return false; 122 return true; 123 } 124 125 /// Hoist expressions out of the specified loop. Note, alias info for inner loop 126 /// is not preserved so it is not a good idea to run LICM multiple times on one 127 /// loop. 128 /// 129 bool MachineLICM::runOnMachineFunction(MachineFunction &MF) { 130 const Function *F = MF.getFunction(); 131 if (F->hasFnAttr(Attribute::OptimizeForSize)) 132 return false; 133 134 DOUT << "******** Machine LICM ********\n"; 135 136 Changed = false; 137 TM = &MF.getTarget(); 138 TII = TM->getInstrInfo(); 139 RegInfo = &MF.getRegInfo(); 140 141 // Get our Loop information... 142 LI = &getAnalysis<MachineLoopInfo>(); 143 DT = &getAnalysis<MachineDominatorTree>(); 144 145 for (MachineLoopInfo::iterator 146 I = LI->begin(), E = LI->end(); I != E; ++I) { 147 CurLoop = *I; 148 149 // Only visit outer-most preheader-sporting loops. 150 if (!LoopIsOuterMostWithPreheader(CurLoop)) 151 continue; 152 153 // Determine the block to which to hoist instructions. If we can't find a 154 // suitable loop preheader, we can't do any hoisting. 155 // 156 // FIXME: We are only hoisting if the basic block coming into this loop 157 // has only one successor. This isn't the case in general because we haven't 158 // broken critical edges or added preheaders. 159 CurPreheader = CurLoop->getLoopPreheader(); 160 if (!CurPreheader) 161 continue; 162 163 HoistRegion(DT->getNode(CurLoop->getHeader())); 164 } 165 166 return Changed; 167 } 168 169 /// HoistRegion - Walk the specified region of the CFG (defined by all blocks 170 /// dominated by the specified block, and that are in the current loop) in depth 171 /// first order w.r.t the DominatorTree. This allows us to visit definitions 172 /// before uses, allowing us to hoist a loop body in one pass without iteration. 173 /// 174 void MachineLICM::HoistRegion(MachineDomTreeNode *N) { 175 assert(N != 0 && "Null dominator tree node?"); 176 MachineBasicBlock *BB = N->getBlock(); 177 178 // If this subregion is not in the top level loop at all, exit. 179 if (!CurLoop->contains(BB)) return; 180 181 for (MachineBasicBlock::iterator 182 MII = BB->begin(), E = BB->end(); MII != E; ) { 183 MachineBasicBlock::iterator NextMII = MII; ++NextMII; 184 MachineInstr &MI = *MII; 185 186 Hoist(MI); 187 188 MII = NextMII; 189 } 190 191 const std::vector<MachineDomTreeNode*> &Children = N->getChildren(); 192 193 for (unsigned I = 0, E = Children.size(); I != E; ++I) 194 HoistRegion(Children[I]); 195 } 196 197 /// IsLoopInvariantInst - Returns true if the instruction is loop 198 /// invariant. I.e., all virtual register operands are defined outside of the 199 /// loop, physical registers aren't accessed explicitly, and there are no side 200 /// effects that aren't captured by the operands or other flags. 201 /// 202 bool MachineLICM::IsLoopInvariantInst(MachineInstr &I) { 203 const TargetInstrDesc &TID = I.getDesc(); 204 205 // Ignore stuff that we obviously can't hoist. 206 if (TID.mayStore() || TID.isCall() || TID.isTerminator() || 207 TID.hasUnmodeledSideEffects()) 208 return false; 209 210 if (TID.mayLoad()) { 211 // Okay, this instruction does a load. As a refinement, we allow the target 212 // to decide whether the loaded value is actually a constant. If so, we can 213 // actually use it as a load. 214 if (!TII->isInvariantLoad(&I)) 215 // FIXME: we should be able to sink loads with no other side effects if 216 // there is nothing that can change memory from here until the end of 217 // block. This is a trivial form of alias analysis. 218 return false; 219 } 220 221 DEBUG({ 222 DOUT << "--- Checking if we can hoist " << I; 223 if (I.getDesc().getImplicitUses()) { 224 DOUT << " * Instruction has implicit uses:\n"; 225 226 const TargetRegisterInfo *TRI = TM->getRegisterInfo(); 227 for (const unsigned *ImpUses = I.getDesc().getImplicitUses(); 228 *ImpUses; ++ImpUses) 229 DOUT << " -> " << TRI->getName(*ImpUses) << "\n"; 230 } 231 232 if (I.getDesc().getImplicitDefs()) { 233 DOUT << " * Instruction has implicit defines:\n"; 234 235 const TargetRegisterInfo *TRI = TM->getRegisterInfo(); 236 for (const unsigned *ImpDefs = I.getDesc().getImplicitDefs(); 237 *ImpDefs; ++ImpDefs) 238 DOUT << " -> " << TRI->getName(*ImpDefs) << "\n"; 239 } 240 }); 241 242 if (I.getDesc().getImplicitDefs() || I.getDesc().getImplicitUses()) { 243 DOUT << "Cannot hoist with implicit defines or uses\n"; 244 return false; 245 } 246 247 // The instruction is loop invariant if all of its operands are. 248 for (unsigned i = 0, e = I.getNumOperands(); i != e; ++i) { 249 const MachineOperand &MO = I.getOperand(i); 250 251 if (!MO.isReg()) 252 continue; 253 254 unsigned Reg = MO.getReg(); 255 if (Reg == 0) continue; 256 257 // Don't hoist an instruction that uses or defines a physical register. 258 if (TargetRegisterInfo::isPhysicalRegister(Reg)) 259 return false; 260 261 if (!MO.isUse()) 262 continue; 263 264 assert(RegInfo->getVRegDef(Reg) && 265 "Machine instr not mapped for this vreg?!"); 266 267 // If the loop contains the definition of an operand, then the instruction 268 // isn't loop invariant. 269 if (CurLoop->contains(RegInfo->getVRegDef(Reg)->getParent())) 270 return false; 271 } 272 273 // If we got this far, the instruction is loop invariant! 274 return true; 275 } 276 277 278 /// HasPHIUses - Return true if the specified register has any PHI use. 279 static bool HasPHIUses(unsigned Reg, MachineRegisterInfo *RegInfo) { 280 for (MachineRegisterInfo::use_iterator UI = RegInfo->use_begin(Reg), 281 UE = RegInfo->use_end(); UI != UE; ++UI) { 282 MachineInstr *UseMI = &*UI; 283 if (UseMI->getOpcode() == TargetInstrInfo::PHI) 284 return true; 285 } 286 return false; 287 } 288 289 /// IsProfitableToHoist - Return true if it is potentially profitable to hoist 290 /// the given loop invariant. 291 bool MachineLICM::IsProfitableToHoist(MachineInstr &MI) { 292 if (MI.getOpcode() == TargetInstrInfo::IMPLICIT_DEF) 293 return false; 294 295 const TargetInstrDesc &TID = MI.getDesc(); 296 297 // FIXME: For now, only hoist re-materilizable instructions. LICM will 298 // increase register pressure. We want to make sure it doesn't increase 299 // spilling. 300 if (!TID.mayLoad() && (!TID.isRematerializable() || 301 !TII->isTriviallyReMaterializable(&MI))) 302 return false; 303 304 // If result(s) of this instruction is used by PHIs, then don't hoist it. 305 // The presence of joins makes it difficult for current register allocator 306 // implementation to perform remat. 307 for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) { 308 const MachineOperand &MO = MI.getOperand(i); 309 if (!MO.isReg() || !MO.isDef()) 310 continue; 311 if (HasPHIUses(MO.getReg(), RegInfo)) 312 return false; 313 } 314 315 return true; 316 } 317 318 static const MachineInstr *LookForDuplicate(const MachineInstr *MI, 319 std::vector<const MachineInstr*> &PrevMIs, 320 MachineRegisterInfo *RegInfo) { 321 unsigned NumOps = MI->getNumOperands(); 322 for (unsigned i = 0, e = PrevMIs.size(); i != e; ++i) { 323 const MachineInstr *PrevMI = PrevMIs[i]; 324 unsigned NumOps2 = PrevMI->getNumOperands(); 325 if (NumOps != NumOps2) 326 continue; 327 bool IsSame = true; 328 for (unsigned j = 0; j != NumOps; ++j) { 329 const MachineOperand &MO = MI->getOperand(j); 330 if (MO.isReg() && MO.isDef()) { 331 if (RegInfo->getRegClass(MO.getReg()) != 332 RegInfo->getRegClass(PrevMI->getOperand(j).getReg())) { 333 IsSame = false; 334 break; 335 } 336 continue; 337 } 338 if (!MO.isIdenticalTo(PrevMI->getOperand(j))) { 339 IsSame = false; 340 break; 341 } 342 } 343 if (IsSame) 344 return PrevMI; 345 } 346 return 0; 347 } 348 349 /// Hoist - When an instruction is found to use only loop invariant operands 350 /// that are safe to hoist, this instruction is called to do the dirty work. 351 /// 352 void MachineLICM::Hoist(MachineInstr &MI) { 353 if (!IsLoopInvariantInst(MI)) return; 354 if (!IsProfitableToHoist(MI)) return; 355 356 // Now move the instructions to the predecessor, inserting it before any 357 // terminator instructions. 358 DEBUG({ 359 errs() << "Hoisting " << MI; 360 if (CurPreheader->getBasicBlock()) 361 errs() << " to MachineBasicBlock " 362 << CurPreheader->getBasicBlock()->getName(); 363 if (MI.getParent()->getBasicBlock()) 364 errs() << " from MachineBasicBlock " 365 << MI.getParent()->getBasicBlock()->getName(); 366 errs() << "\n"; 367 }); 368 369 // Look for opportunity to CSE the hoisted instruction. 370 std::pair<unsigned, unsigned> BBOpcPair = 371 std::make_pair(CurPreheader->getNumber(), MI.getOpcode()); 372 DenseMap<std::pair<unsigned, unsigned>, 373 std::vector<const MachineInstr*> >::iterator CI = CSEMap.find(BBOpcPair); 374 bool DoneCSE = false; 375 if (CI != CSEMap.end()) { 376 const MachineInstr *Dup = LookForDuplicate(&MI, CI->second, RegInfo); 377 if (Dup) { 378 DOUT << "CSEing " << MI; 379 DOUT << " with " << *Dup; 380 for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) { 381 const MachineOperand &MO = MI.getOperand(i); 382 if (MO.isReg() && MO.isDef()) 383 RegInfo->replaceRegWith(MO.getReg(), Dup->getOperand(i).getReg()); 384 } 385 MI.eraseFromParent(); 386 DoneCSE = true; 387 ++NumCSEed; 388 } 389 } 390 391 // Otherwise, splice the instruction to the preheader. 392 if (!DoneCSE) { 393 CurPreheader->splice(CurPreheader->getFirstTerminator(), 394 MI.getParent(), &MI); 395 // Add to the CSE map. 396 if (CI != CSEMap.end()) 397 CI->second.push_back(&MI); 398 else { 399 std::vector<const MachineInstr*> CSEMIs; 400 CSEMIs.push_back(&MI); 401 CSEMap.insert(std::make_pair(BBOpcPair, CSEMIs)); 402 } 403 } 404 405 ++NumHoisted; 406 Changed = true; 407 } 408