xref: /freebsd/contrib/llvm-project/llvm/include/llvm/CodeGen/MachinePostDominators.h (revision 700637cbb5e582861067a11aaca4d053546871d2)
1 //===- llvm/CodeGen/MachinePostDominators.h ----------------------*- C++ -*-==//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file exposes interfaces to post dominance information for
10 // target-specific code.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_CODEGEN_MACHINEPOSTDOMINATORS_H
15 #define LLVM_CODEGEN_MACHINEPOSTDOMINATORS_H
16 
17 #include "llvm/CodeGen/MachineDominators.h"
18 #include "llvm/Support/Compiler.h"
19 
20 namespace llvm {
21 
22 extern template class LLVM_TEMPLATE_ABI
23     DominatorTreeBase<MachineBasicBlock, true>; // PostDomTree
24 
25 namespace DomTreeBuilder {
26 using MBBPostDomTree = PostDomTreeBase<MachineBasicBlock>;
27 using MBBPostDomTreeGraphDiff = GraphDiff<MachineBasicBlock *, true>;
28 
29 extern template LLVM_TEMPLATE_ABI void
30 Calculate<MBBPostDomTree>(MBBPostDomTree &DT);
31 extern template LLVM_TEMPLATE_ABI void
32 InsertEdge<MBBPostDomTree>(MBBPostDomTree &DT, MachineBasicBlock *From,
33                            MachineBasicBlock *To);
34 extern template LLVM_TEMPLATE_ABI void
35 DeleteEdge<MBBPostDomTree>(MBBPostDomTree &DT, MachineBasicBlock *From,
36                            MachineBasicBlock *To);
37 extern template LLVM_TEMPLATE_ABI void
38 ApplyUpdates<MBBPostDomTree>(MBBPostDomTree &DT, MBBPostDomTreeGraphDiff &,
39                              MBBPostDomTreeGraphDiff *);
40 extern template LLVM_TEMPLATE_ABI bool
41 Verify<MBBPostDomTree>(const MBBPostDomTree &DT,
42                        MBBPostDomTree::VerificationLevel VL);
43 } // namespace DomTreeBuilder
44 
45 ///
46 /// MachinePostDominatorTree - an analysis pass wrapper for DominatorTree
47 /// used to compute the post-dominator tree for MachineFunctions.
48 ///
49 class MachinePostDominatorTree : public PostDomTreeBase<MachineBasicBlock> {
50   using Base = PostDomTreeBase<MachineBasicBlock>;
51 
52 public:
53   MachinePostDominatorTree() = default;
54 
MachinePostDominatorTree(MachineFunction & MF)55   explicit MachinePostDominatorTree(MachineFunction &MF) { recalculate(MF); }
56 
57   /// Handle invalidation explicitly.
58   LLVM_ABI bool invalidate(MachineFunction &, const PreservedAnalyses &PA,
59                            MachineFunctionAnalysisManager::Invalidator &);
60 
61   /// Make findNearestCommonDominator(const NodeT *A, const NodeT *B) available.
62   using Base::findNearestCommonDominator;
63 
64   /// Returns the nearest common dominator of the given blocks.
65   /// If that tree node is a virtual root, a nullptr will be returned.
66   LLVM_ABI MachineBasicBlock *
67   findNearestCommonDominator(ArrayRef<MachineBasicBlock *> Blocks) const;
68 };
69 
70 class MachinePostDominatorTreeAnalysis
71     : public AnalysisInfoMixin<MachinePostDominatorTreeAnalysis> {
72   friend AnalysisInfoMixin<MachinePostDominatorTreeAnalysis>;
73 
74   LLVM_ABI static AnalysisKey Key;
75 
76 public:
77   using Result = MachinePostDominatorTree;
78 
79   LLVM_ABI Result run(MachineFunction &MF,
80                       MachineFunctionAnalysisManager &MFAM);
81 };
82 
83 class MachinePostDominatorTreePrinterPass
84     : public PassInfoMixin<MachinePostDominatorTreePrinterPass> {
85   raw_ostream &OS;
86 
87 public:
MachinePostDominatorTreePrinterPass(raw_ostream & OS)88   explicit MachinePostDominatorTreePrinterPass(raw_ostream &OS) : OS(OS) {}
89   LLVM_ABI PreservedAnalyses run(MachineFunction &MF,
90                                  MachineFunctionAnalysisManager &MFAM);
isRequired()91   static bool isRequired() { return true; }
92 };
93 
94 class LLVM_ABI MachinePostDominatorTreeWrapperPass
95     : public MachineFunctionPass {
96   std::optional<MachinePostDominatorTree> PDT;
97 
98 public:
99   static char ID;
100 
101   MachinePostDominatorTreeWrapperPass();
102 
getPostDomTree()103   MachinePostDominatorTree &getPostDomTree() { return *PDT; }
getPostDomTree()104   const MachinePostDominatorTree &getPostDomTree() const { return *PDT; }
105 
106   bool runOnMachineFunction(MachineFunction &MF) override;
107   void getAnalysisUsage(AnalysisUsage &AU) const override;
releaseMemory()108   void releaseMemory() override { PDT.reset(); }
109   void verifyAnalysis() const override;
110   void print(llvm::raw_ostream &OS, const Module *M = nullptr) const override;
111 };
112 } //end of namespace llvm
113 
114 #endif
115