//===- llvm/CodeGen/MachinePostDominators.h ----------------------*- C++ -*-==// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file exposes interfaces to post dominance information for // target-specific code. // //===----------------------------------------------------------------------===// #ifndef LLVM_CODEGEN_MACHINEPOSTDOMINATORS_H #define LLVM_CODEGEN_MACHINEPOSTDOMINATORS_H #include "llvm/CodeGen/MachineDominators.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include namespace llvm { /// /// MachinePostDominatorTree - an analysis pass wrapper for DominatorTree /// used to compute the post-dominator tree for MachineFunctions. /// class MachinePostDominatorTree : public MachineFunctionPass { using PostDomTreeT = PostDomTreeBase; std::unique_ptr PDT; public: static char ID; MachinePostDominatorTree(); PostDomTreeT &getBase() { if (!PDT) PDT.reset(new PostDomTreeT()); return *PDT; } FunctionPass *createMachinePostDominatorTreePass(); MachineDomTreeNode *getRootNode() const { return PDT->getRootNode(); } MachineDomTreeNode *operator[](MachineBasicBlock *BB) const { return PDT->getNode(BB); } MachineDomTreeNode *getNode(MachineBasicBlock *BB) const { return PDT->getNode(BB); } bool dominates(const MachineDomTreeNode *A, const MachineDomTreeNode *B) const { return PDT->dominates(A, B); } bool dominates(const MachineBasicBlock *A, const MachineBasicBlock *B) const { return PDT->dominates(A, B); } bool properlyDominates(const MachineDomTreeNode *A, const MachineDomTreeNode *B) const { return PDT->properlyDominates(A, B); } bool properlyDominates(const MachineBasicBlock *A, const MachineBasicBlock *B) const { return PDT->properlyDominates(A, B); } bool isVirtualRoot(const MachineDomTreeNode *Node) const { return PDT->isVirtualRoot(Node); } MachineBasicBlock *findNearestCommonDominator(MachineBasicBlock *A, MachineBasicBlock *B) const { return PDT->findNearestCommonDominator(A, B); } /// Returns the nearest common dominator of the given blocks. /// If that tree node is a virtual root, a nullptr will be returned. MachineBasicBlock * findNearestCommonDominator(ArrayRef Blocks) const; bool runOnMachineFunction(MachineFunction &MF) override; void getAnalysisUsage(AnalysisUsage &AU) const override; void releaseMemory() override { PDT.reset(nullptr); } void verifyAnalysis() const override; void print(llvm::raw_ostream &OS, const Module *M = nullptr) const override; }; } //end of namespace llvm #endif