MachineLoopInfo.cpp revision cddc3e03e4ec99c0268c03a126195173e519ed58
1//===- MachineLoopInfo.cpp - Natural Loop Calculator ----------------------===// 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 file defines the MachineLoopInfo class that is used to identify natural 11// loops and determine the loop depth of various nodes of the CFG. Note that 12// the loops identified may actually be several natural loops that share the 13// same header node... not just a single natural loop. 14// 15//===----------------------------------------------------------------------===// 16 17#include "llvm/CodeGen/MachineLoopInfo.h" 18#include "llvm/Analysis/LoopInfoImpl.h" 19#include "llvm/CodeGen/MachineDominators.h" 20#include "llvm/CodeGen/Passes.h" 21#include "llvm/Support/Debug.h" 22#include "llvm/Support/raw_ostream.h" 23using namespace llvm; 24 25// Explicitly instantiate methods in LoopInfoImpl.h for MI-level Loops. 26template class llvm::LoopBase<MachineBasicBlock, MachineLoop>; 27template class llvm::LoopInfoBase<MachineBasicBlock, MachineLoop>; 28 29char MachineLoopInfo::ID = 0; 30INITIALIZE_PASS_BEGIN(MachineLoopInfo, "machine-loops", 31 "Machine Natural Loop Construction", true, true) 32INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree) 33INITIALIZE_PASS_END(MachineLoopInfo, "machine-loops", 34 "Machine Natural Loop Construction", true, true) 35 36char &llvm::MachineLoopInfoID = MachineLoopInfo::ID; 37 38bool MachineLoopInfo::runOnMachineFunction(MachineFunction &) { 39 releaseMemory(); 40 LI.analyze(getAnalysis<MachineDominatorTree>().getBase()); 41 return false; 42} 43 44void MachineLoopInfo::getAnalysisUsage(AnalysisUsage &AU) const { 45 AU.setPreservesAll(); 46 AU.addRequired<MachineDominatorTree>(); 47 MachineFunctionPass::getAnalysisUsage(AU); 48} 49 50MachineBasicBlock *MachineLoop::getTopBlock() { 51 MachineBasicBlock *TopMBB = getHeader(); 52 MachineFunction::iterator Begin = TopMBB->getParent()->begin(); 53 if (TopMBB != Begin) { 54 MachineBasicBlock *PriorMBB = &*std::prev(TopMBB->getIterator()); 55 while (contains(PriorMBB)) { 56 TopMBB = PriorMBB; 57 if (TopMBB == Begin) break; 58 PriorMBB = &*std::prev(TopMBB->getIterator()); 59 } 60 } 61 return TopMBB; 62} 63 64MachineBasicBlock *MachineLoop::getBottomBlock() { 65 MachineBasicBlock *BotMBB = getHeader(); 66 MachineFunction::iterator End = BotMBB->getParent()->end(); 67 if (BotMBB != std::prev(End)) { 68 MachineBasicBlock *NextMBB = &*std::next(BotMBB->getIterator()); 69 while (contains(NextMBB)) { 70 BotMBB = NextMBB; 71 if (BotMBB == &*std::next(BotMBB->getIterator())) 72 break; 73 NextMBB = &*std::next(BotMBB->getIterator()); 74 } 75 } 76 return BotMBB; 77} 78 79#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 80void MachineLoop::dump() const { 81 print(dbgs()); 82} 83#endif 84