MachineLoopInfo.cpp revision cdb0c03397e05fb01ed67a7caaa5f82ec993c564
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/CodeGen/MachineDominators.h" 19#include "llvm/CodeGen/Passes.h" 20#include "llvm/Support/Debug.h" 21using namespace llvm; 22 23namespace llvm { 24#define MLB class LoopBase<MachineBasicBlock, MachineLoop> 25TEMPLATE_INSTANTIATION(MLB); 26#undef MLB 27#define MLIB class LoopInfoBase<MachineBasicBlock, MachineLoop> 28TEMPLATE_INSTANTIATION(MLIB); 29#undef MLIB 30} 31 32char MachineLoopInfo::ID = 0; 33INITIALIZE_PASS_BEGIN(MachineLoopInfo, "machine-loops", 34 "Machine Natural Loop Construction", true, true) 35INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree) 36INITIALIZE_PASS_END(MachineLoopInfo, "machine-loops", 37 "Machine Natural Loop Construction", true, true) 38 39char &llvm::MachineLoopInfoID = MachineLoopInfo::ID; 40 41bool MachineLoopInfo::runOnMachineFunction(MachineFunction &) { 42 releaseMemory(); 43 LI.Calculate(getAnalysis<MachineDominatorTree>().getBase()); // Update 44 return false; 45} 46 47void MachineLoopInfo::getAnalysisUsage(AnalysisUsage &AU) const { 48 AU.setPreservesAll(); 49 AU.addRequired<MachineDominatorTree>(); 50 MachineFunctionPass::getAnalysisUsage(AU); 51} 52 53MachineBasicBlock *MachineLoop::getTopBlock() { 54 MachineBasicBlock *TopMBB = getHeader(); 55 MachineFunction::iterator Begin = TopMBB->getParent()->begin(); 56 if (TopMBB != Begin) { 57 MachineBasicBlock *PriorMBB = prior(MachineFunction::iterator(TopMBB)); 58 while (contains(PriorMBB)) { 59 TopMBB = PriorMBB; 60 if (TopMBB == Begin) break; 61 PriorMBB = prior(MachineFunction::iterator(TopMBB)); 62 } 63 } 64 return TopMBB; 65} 66 67MachineBasicBlock *MachineLoop::getBottomBlock() { 68 MachineBasicBlock *BotMBB = getHeader(); 69 MachineFunction::iterator End = BotMBB->getParent()->end(); 70 if (BotMBB != prior(End)) { 71 MachineBasicBlock *NextMBB = llvm::next(MachineFunction::iterator(BotMBB)); 72 while (contains(NextMBB)) { 73 BotMBB = NextMBB; 74 if (BotMBB == llvm::next(MachineFunction::iterator(BotMBB))) break; 75 NextMBB = llvm::next(MachineFunction::iterator(BotMBB)); 76 } 77 } 78 return BotMBB; 79} 80 81void MachineLoop::dump() const { 82 print(dbgs()); 83} 84