1193323Sed//===- MachineLoopInfo.cpp - Natural Loop Calculator ----------------------===// 2193323Sed// 3193323Sed// The LLVM Compiler Infrastructure 4193323Sed// 5193323Sed// This file is distributed under the University of Illinois Open Source 6193323Sed// License. See LICENSE.TXT for details. 7193323Sed// 8193323Sed//===----------------------------------------------------------------------===// 9193323Sed// 10193323Sed// This file defines the MachineLoopInfo class that is used to identify natural 11193323Sed// loops and determine the loop depth of various nodes of the CFG. Note that 12239462Sdim// the loops identified may actually be several natural loops that share the 13193323Sed// same header node... not just a single natural loop. 14193323Sed// 15193323Sed//===----------------------------------------------------------------------===// 16193323Sed 17193323Sed#include "llvm/CodeGen/MachineLoopInfo.h" 18249423Sdim#include "llvm/Analysis/LoopInfoImpl.h" 19193323Sed#include "llvm/CodeGen/MachineDominators.h" 20193323Sed#include "llvm/CodeGen/Passes.h" 21202375Srdivacky#include "llvm/Support/Debug.h" 22193323Sedusing namespace llvm; 23193323Sed 24239462Sdim// Explicitly instantiate methods in LoopInfoImpl.h for MI-level Loops. 25239462Sdimtemplate class llvm::LoopBase<MachineBasicBlock, MachineLoop>; 26239462Sdimtemplate class llvm::LoopInfoBase<MachineBasicBlock, MachineLoop>; 27193323Sed 28193323Sedchar MachineLoopInfo::ID = 0; 29218893SdimINITIALIZE_PASS_BEGIN(MachineLoopInfo, "machine-loops", 30218893Sdim "Machine Natural Loop Construction", true, true) 31218893SdimINITIALIZE_PASS_DEPENDENCY(MachineDominatorTree) 32218893SdimINITIALIZE_PASS_END(MachineLoopInfo, "machine-loops", 33218893Sdim "Machine Natural Loop Construction", true, true) 34193323Sed 35212904Sdimchar &llvm::MachineLoopInfoID = MachineLoopInfo::ID; 36193323Sed 37193323Sedbool MachineLoopInfo::runOnMachineFunction(MachineFunction &) { 38193323Sed releaseMemory(); 39239462Sdim LI.Analyze(getAnalysis<MachineDominatorTree>().getBase()); 40193323Sed return false; 41193323Sed} 42193323Sed 43193323Sedvoid MachineLoopInfo::getAnalysisUsage(AnalysisUsage &AU) const { 44193323Sed AU.setPreservesAll(); 45193323Sed AU.addRequired<MachineDominatorTree>(); 46198090Srdivacky MachineFunctionPass::getAnalysisUsage(AU); 47193323Sed} 48198396Srdivacky 49198396SrdivackyMachineBasicBlock *MachineLoop::getTopBlock() { 50198396Srdivacky MachineBasicBlock *TopMBB = getHeader(); 51198396Srdivacky MachineFunction::iterator Begin = TopMBB->getParent()->begin(); 52198396Srdivacky if (TopMBB != Begin) { 53198396Srdivacky MachineBasicBlock *PriorMBB = prior(MachineFunction::iterator(TopMBB)); 54198396Srdivacky while (contains(PriorMBB)) { 55198396Srdivacky TopMBB = PriorMBB; 56198396Srdivacky if (TopMBB == Begin) break; 57198396Srdivacky PriorMBB = prior(MachineFunction::iterator(TopMBB)); 58198396Srdivacky } 59198396Srdivacky } 60198396Srdivacky return TopMBB; 61198396Srdivacky} 62198396Srdivacky 63198396SrdivackyMachineBasicBlock *MachineLoop::getBottomBlock() { 64198396Srdivacky MachineBasicBlock *BotMBB = getHeader(); 65198396Srdivacky MachineFunction::iterator End = BotMBB->getParent()->end(); 66198396Srdivacky if (BotMBB != prior(End)) { 67200581Srdivacky MachineBasicBlock *NextMBB = llvm::next(MachineFunction::iterator(BotMBB)); 68198396Srdivacky while (contains(NextMBB)) { 69198396Srdivacky BotMBB = NextMBB; 70200581Srdivacky if (BotMBB == llvm::next(MachineFunction::iterator(BotMBB))) break; 71200581Srdivacky NextMBB = llvm::next(MachineFunction::iterator(BotMBB)); 72198396Srdivacky } 73198396Srdivacky } 74198396Srdivacky return BotMBB; 75198396Srdivacky} 76202375Srdivacky 77243830Sdim#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 78202375Srdivackyvoid MachineLoop::dump() const { 79202375Srdivacky print(dbgs()); 80202375Srdivacky} 81243830Sdim#endif 82