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