1//=- llvm/CodeGen/MachineDominators.h ----------------------------*- C++ -*-==// 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 exposes interfaces to post dominance information for 11// target-specific code. 12// 13//===----------------------------------------------------------------------===// 14 15#ifndef LLVM_CODEGEN_MACHINEPOSTDOMINATORS_H 16#define LLVM_CODEGEN_MACHINEPOSTDOMINATORS_H 17 18#include "llvm/Analysis/Dominators.h" 19#include "llvm/CodeGen/MachineDominators.h" 20#include "llvm/CodeGen/MachineFunctionPass.h" 21 22namespace llvm { 23 24/// 25/// PostDominatorTree Class - Concrete subclass of DominatorTree that is used 26/// to compute the a post-dominator tree. 27/// 28struct MachinePostDominatorTree : public MachineFunctionPass { 29private: 30 DominatorTreeBase<MachineBasicBlock> *DT; 31 32public: 33 static char ID; 34 35 MachinePostDominatorTree(); 36 37 ~MachinePostDominatorTree(); 38 39 FunctionPass *createMachinePostDominatorTreePass(); 40 41 const std::vector<MachineBasicBlock *> &getRoots() const { 42 return DT->getRoots(); 43 } 44 45 MachineDomTreeNode *getRootNode() const { 46 return DT->getRootNode(); 47 } 48 49 MachineDomTreeNode *operator[](MachineBasicBlock *BB) const { 50 return DT->getNode(BB); 51 } 52 53 MachineDomTreeNode *getNode(MachineBasicBlock *BB) const { 54 return DT->getNode(BB); 55 } 56 57 bool dominates(const MachineDomTreeNode *A, 58 const MachineDomTreeNode *B) const { 59 return DT->dominates(A, B); 60 } 61 62 bool dominates(const MachineBasicBlock *A, const MachineBasicBlock *B) const { 63 return DT->dominates(A, B); 64 } 65 66 bool properlyDominates(const MachineDomTreeNode *A, 67 const MachineDomTreeNode *B) const { 68 return DT->properlyDominates(A, B); 69 } 70 71 bool properlyDominates(const MachineBasicBlock *A, 72 const MachineBasicBlock *B) const { 73 return DT->properlyDominates(A, B); 74 } 75 76 MachineBasicBlock *findNearestCommonDominator(MachineBasicBlock *A, 77 MachineBasicBlock *B) { 78 return DT->findNearestCommonDominator(A, B); 79 } 80 81 virtual bool runOnMachineFunction(MachineFunction &MF); 82 virtual void getAnalysisUsage(AnalysisUsage &AU) const; 83 virtual void print(llvm::raw_ostream &OS, const Module *M = 0) const; 84}; 85} //end of namespace llvm 86 87#endif 88