1//===- llvm/CodeGen/MachineDominanceFrontier.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#ifndef LLVM_CODEGEN_MACHINEDOMINANCEFRONTIER_H 11#define LLVM_CODEGEN_MACHINEDOMINANCEFRONTIER_H 12 13#include "llvm/Analysis/DominanceFrontier.h" 14#include "llvm/Analysis/DominanceFrontierImpl.h" 15#include "llvm/CodeGen/MachineBasicBlock.h" 16#include "llvm/CodeGen/MachineFunctionPass.h" 17#include "llvm/Support/GenericDomTree.h" 18#include <vector> 19 20namespace llvm { 21 22class MachineDominanceFrontier : public MachineFunctionPass { 23 ForwardDominanceFrontierBase<MachineBasicBlock> Base; 24 25public: 26 using DomTreeT = DomTreeBase<MachineBasicBlock>; 27 using DomTreeNodeT = DomTreeNodeBase<MachineBasicBlock>; 28 using DomSetType = DominanceFrontierBase<MachineBasicBlock, false>::DomSetType; 29 using iterator = DominanceFrontierBase<MachineBasicBlock, false>::iterator; 30 using const_iterator = 31 DominanceFrontierBase<MachineBasicBlock, false>::const_iterator; 32 33 MachineDominanceFrontier(const MachineDominanceFrontier &) = delete; 34 MachineDominanceFrontier &operator=(const MachineDominanceFrontier &) = delete; 35 36 static char ID; 37 38 MachineDominanceFrontier(); 39 40 DominanceFrontierBase<MachineBasicBlock, false> &getBase() { return Base; } 41 42 const SmallVectorImpl<MachineBasicBlock *> &getRoots() const { 43 return Base.getRoots(); 44 } 45 46 MachineBasicBlock *getRoot() const { 47 return Base.getRoot(); 48 } 49 50 bool isPostDominator() const { 51 return Base.isPostDominator(); 52 } 53 54 iterator begin() { 55 return Base.begin(); 56 } 57 58 const_iterator begin() const { 59 return Base.begin(); 60 } 61 62 iterator end() { 63 return Base.end(); 64 } 65 66 const_iterator end() const { 67 return Base.end(); 68 } 69 70 iterator find(MachineBasicBlock *B) { 71 return Base.find(B); 72 } 73 74 const_iterator find(MachineBasicBlock *B) const { 75 return Base.find(B); 76 } 77 78 iterator addBasicBlock(MachineBasicBlock *BB, const DomSetType &frontier) { 79 return Base.addBasicBlock(BB, frontier); 80 } 81 82 void removeBlock(MachineBasicBlock *BB) { 83 return Base.removeBlock(BB); 84 } 85 86 void addToFrontier(iterator I, MachineBasicBlock *Node) { 87 return Base.addToFrontier(I, Node); 88 } 89 90 void removeFromFrontier(iterator I, MachineBasicBlock *Node) { 91 return Base.removeFromFrontier(I, Node); 92 } 93 94 bool compareDomSet(DomSetType &DS1, const DomSetType &DS2) const { 95 return Base.compareDomSet(DS1, DS2); 96 } 97 98 bool compare(DominanceFrontierBase<MachineBasicBlock, false> &Other) const { 99 return Base.compare(Other); 100 } 101 102 bool runOnMachineFunction(MachineFunction &F) override; 103 104 void releaseMemory() override; 105 106 void getAnalysisUsage(AnalysisUsage &AU) const override; 107}; 108 109} // end namespace llvm 110 111#endif // LLVM_CODEGEN_MACHINEDOMINANCEFRONTIER_H 112