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