MachineLoopInfo.cpp revision 02dd53e1c5b941ca5f60fca1b95ebcaf9ccd1dfc
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(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.Calculate(getAnalysis<MachineDominatorTree>().getBase()); // Update 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 = prior(MachineFunction::iterator(TopMBB)); 55 while (contains(PriorMBB)) { 56 TopMBB = PriorMBB; 57 if (TopMBB == Begin) break; 58 PriorMBB = prior(MachineFunction::iterator(TopMBB)); 59 } 60 } 61 return TopMBB; 62} 63 64MachineBasicBlock *MachineLoop::getBottomBlock() { 65 MachineBasicBlock *BotMBB = getHeader(); 66 MachineFunction::iterator End = BotMBB->getParent()->end(); 67 if (BotMBB != prior(End)) { 68 MachineBasicBlock *NextMBB = llvm::next(MachineFunction::iterator(BotMBB)); 69 while (contains(NextMBB)) { 70 BotMBB = NextMBB; 71 if (BotMBB == llvm::next(MachineFunction::iterator(BotMBB))) break; 72 NextMBB = llvm::next(MachineFunction::iterator(BotMBB)); 73 } 74 } 75 return BotMBB; 76} 77 78void MachineLoop::dump() const { 79 print(dbgs()); 80} 81