LLVM API Documentation

MachineRegionInfo.h
Go to the documentation of this file.
00001 //===- llvm/CodeGen/MachineRegionInfo.h -------------------------*- C++ -*-===//
00002 //
00003 //                     The LLVM Compiler Infrastructure
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //
00008 //===----------------------------------------------------------------------===//
00009 
00010 #ifndef LLVM_CODEGEN_MACHINEREGIONINFO_H
00011 #define LLVM_CODEGEN_MACHINEREGIONINFO_H
00012 
00013 #include "llvm/Analysis/RegionInfo.h"
00014 #include "llvm/Analysis/RegionIterator.h"
00015 #include "llvm/CodeGen/MachineDominanceFrontier.h"
00016 #include "llvm/CodeGen/MachineDominators.h"
00017 #include "llvm/CodeGen/MachineFunction.h"
00018 #include "llvm/CodeGen/MachineFunctionPass.h"
00019 #include "llvm/CodeGen/MachineLoopInfo.h"
00020 
00021 
00022 namespace llvm {
00023 
00024 class MachineDominatorTree;
00025 struct MachinePostDominatorTree;
00026 class MachineRegion;
00027 class MachineRegionNode;
00028 class MachineRegionInfo;
00029 
00030 template<>
00031 struct RegionTraits<MachineFunction> {
00032   typedef MachineFunction FuncT;
00033   typedef MachineBasicBlock BlockT;
00034   typedef MachineRegion RegionT;
00035   typedef MachineRegionNode RegionNodeT;
00036   typedef MachineRegionInfo RegionInfoT;
00037   typedef MachineDominatorTree DomTreeT;
00038   typedef MachineDomTreeNode DomTreeNodeT;
00039   typedef MachinePostDominatorTree PostDomTreeT;
00040   typedef MachineDominanceFrontier DomFrontierT;
00041   typedef MachineInstr InstT;
00042   typedef MachineLoop LoopT;
00043   typedef MachineLoopInfo LoopInfoT;
00044 
00045   static unsigned getNumSuccessors(MachineBasicBlock *BB) {
00046     return BB->succ_size();
00047   }
00048 };
00049 
00050 
00051 class MachineRegionNode : public RegionNodeBase<RegionTraits<MachineFunction>> {
00052 public:
00053   inline MachineRegionNode(MachineRegion *Parent,
00054                            MachineBasicBlock *Entry,
00055                            bool isSubRegion = false)
00056     : RegionNodeBase<RegionTraits<MachineFunction>>(Parent, Entry, isSubRegion) {
00057 
00058   }
00059 
00060   ~MachineRegionNode() { }
00061 
00062   bool operator==(const MachineRegion &RN) const {
00063     return this == reinterpret_cast<const MachineRegionNode*>(&RN);
00064   }
00065 };
00066 
00067 class MachineRegion : public RegionBase<RegionTraits<MachineFunction>> {
00068 public:
00069   MachineRegion(MachineBasicBlock *Entry, MachineBasicBlock *Exit,
00070                 MachineRegionInfo* RI,
00071                 MachineDominatorTree *DT, MachineRegion *Parent = nullptr);
00072   ~MachineRegion();
00073 
00074   bool operator==(const MachineRegionNode &RN) const {
00075     return &RN == reinterpret_cast<const MachineRegionNode*>(this);
00076   }
00077 };
00078 
00079 class MachineRegionInfo : public RegionInfoBase<RegionTraits<MachineFunction>> {
00080 public:
00081   explicit MachineRegionInfo();
00082 
00083   virtual ~MachineRegionInfo();
00084 
00085   // updateStatistics - Update statistic about created regions.
00086   void updateStatistics(MachineRegion *R) final;
00087 
00088   void recalculate(MachineFunction &F,
00089                    MachineDominatorTree *DT,
00090                    MachinePostDominatorTree *PDT,
00091                    MachineDominanceFrontier *DF);
00092 };
00093 
00094 class MachineRegionInfoPass : public MachineFunctionPass {
00095   MachineRegionInfo RI;
00096 
00097 public:
00098   static char ID;
00099   explicit MachineRegionInfoPass();
00100 
00101   ~MachineRegionInfoPass();
00102 
00103   MachineRegionInfo &getRegionInfo() {
00104     return RI;
00105   }
00106 
00107   const MachineRegionInfo &getRegionInfo() const {
00108     return RI;
00109   }
00110 
00111   /// @name MachineFunctionPass interface
00112   //@{
00113   bool runOnMachineFunction(MachineFunction &F) override;
00114   void releaseMemory() override;
00115   void verifyAnalysis() const override;
00116   void getAnalysisUsage(AnalysisUsage &AU) const override;
00117   void print(raw_ostream &OS, const Module *) const override;
00118   void dump() const;
00119   //@}
00120 };
00121 
00122 
00123 template <>
00124 template <>
00125 inline MachineBasicBlock* RegionNodeBase<RegionTraits<MachineFunction>>::getNodeAs<MachineBasicBlock>() const {
00126   assert(!isSubRegion() && "This is not a MachineBasicBlock RegionNode!");
00127   return getEntry();
00128 }
00129 
00130 template<>
00131 template<>
00132 inline MachineRegion* RegionNodeBase<RegionTraits<MachineFunction>>::getNodeAs<MachineRegion>() const {
00133   assert(isSubRegion() && "This is not a subregion RegionNode!");
00134   auto Unconst = const_cast<RegionNodeBase<RegionTraits<MachineFunction>>*>(this);
00135   return reinterpret_cast<MachineRegion*>(Unconst);
00136 }
00137 
00138 
00139 RegionNodeGraphTraits(MachineRegionNode, MachineBasicBlock, MachineRegion);
00140 RegionNodeGraphTraits(const MachineRegionNode, MachineBasicBlock, MachineRegion);
00141 
00142 RegionGraphTraits(MachineRegion, MachineRegionNode);
00143 RegionGraphTraits(const MachineRegion, const MachineRegionNode);
00144 
00145 template <> struct GraphTraits<MachineRegionInfo*>
00146   : public GraphTraits<FlatIt<MachineRegionNode*> > {
00147   typedef df_iterator<NodeType*, SmallPtrSet<NodeType*, 8>, false,
00148                       GraphTraits<FlatIt<NodeType*> > > nodes_iterator;
00149 
00150   static NodeType *getEntryNode(MachineRegionInfo *RI) {
00151     return GraphTraits<FlatIt<MachineRegion*> >::getEntryNode(RI->getTopLevelRegion());
00152   }
00153   static nodes_iterator nodes_begin(MachineRegionInfo* RI) {
00154     return nodes_iterator::begin(getEntryNode(RI));
00155   }
00156   static nodes_iterator nodes_end(MachineRegionInfo *RI) {
00157     return nodes_iterator::end(getEntryNode(RI));
00158   }
00159 };
00160 
00161 template <> struct GraphTraits<MachineRegionInfoPass*>
00162   : public GraphTraits<MachineRegionInfo *> {
00163   typedef df_iterator<NodeType*, SmallPtrSet<NodeType*, 8>, false,
00164                       GraphTraits<FlatIt<NodeType*> > > nodes_iterator;
00165 
00166   static NodeType *getEntryNode(MachineRegionInfoPass *RI) {
00167     return GraphTraits<MachineRegionInfo*>::getEntryNode(&RI->getRegionInfo());
00168   }
00169   static nodes_iterator nodes_begin(MachineRegionInfoPass* RI) {
00170     return GraphTraits<MachineRegionInfo*>::nodes_begin(&RI->getRegionInfo());
00171   }
00172   static nodes_iterator nodes_end(MachineRegionInfoPass *RI) {
00173     return GraphTraits<MachineRegionInfo*>::nodes_end(&RI->getRegionInfo());
00174   }
00175 };
00176 
00177 EXTERN_TEMPLATE_INSTANTIATION(class RegionBase<RegionTraits<MachineFunction>>);
00178 EXTERN_TEMPLATE_INSTANTIATION(class RegionNodeBase<RegionTraits<MachineFunction>>);
00179 EXTERN_TEMPLATE_INSTANTIATION(class RegionInfoBase<RegionTraits<MachineFunction>>);
00180 
00181 }
00182 
00183 #endif