Home | History | Annotate | Download | only in CodeGen
      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"
     21 using namespace llvm;
     22 
     23 namespace llvm {
     24 #define MLB class LoopBase<MachineBasicBlock, MachineLoop>
     25 TEMPLATE_INSTANTIATION(MLB);
     26 #undef MLB
     27 #define MLIB class LoopInfoBase<MachineBasicBlock, MachineLoop>
     28 TEMPLATE_INSTANTIATION(MLIB);
     29 #undef MLIB
     30 }
     31 
     32 char MachineLoopInfo::ID = 0;
     33 INITIALIZE_PASS_BEGIN(MachineLoopInfo, "machine-loops",
     34                 "Machine Natural Loop Construction", true, true)
     35 INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree)
     36 INITIALIZE_PASS_END(MachineLoopInfo, "machine-loops",
     37                 "Machine Natural Loop Construction", true, true)
     38 
     39 char &llvm::MachineLoopInfoID = MachineLoopInfo::ID;
     40 
     41 bool MachineLoopInfo::runOnMachineFunction(MachineFunction &) {
     42   releaseMemory();
     43   LI.Calculate(getAnalysis<MachineDominatorTree>().getBase());    // Update
     44   return false;
     45 }
     46 
     47 void MachineLoopInfo::getAnalysisUsage(AnalysisUsage &AU) const {
     48   AU.setPreservesAll();
     49   AU.addRequired<MachineDominatorTree>();
     50   MachineFunctionPass::getAnalysisUsage(AU);
     51 }
     52 
     53 MachineBasicBlock *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 
     67 MachineBasicBlock *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 
     81 void MachineLoop::dump() const {
     82   print(dbgs());
     83 }
     84