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