My Project
Dominance.h
Go to the documentation of this file.
1 //===- Dominance.h - Dominator analysis for CFGs ----------------*- C++ -*-===//
2 //
3 // Part of the MLIR 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 #ifndef MLIR_ANALYSIS_DOMINANCE_H
10 #define MLIR_ANALYSIS_DOMINANCE_H
11 
13 #include "llvm/Support/GenericDomTree.h"
14 
15 extern template class llvm::DominatorTreeBase<mlir::Block, false>;
16 extern template class llvm::DominatorTreeBase<mlir::Block, true>;
17 
18 namespace mlir {
19 using DominanceInfoNode = llvm::DomTreeNodeBase<Block>;
20 class Operation;
21 
22 namespace detail {
23 template <bool IsPostDom> class DominanceInfoBase {
24  using base = llvm::DominatorTreeBase<Block, IsPostDom>;
25 
26 public:
27  DominanceInfoBase(Operation *op) { recalculate(op); }
29  DominanceInfoBase &operator=(DominanceInfoBase &&) = default;
30 
31  DominanceInfoBase(const DominanceInfoBase &) = delete;
32  DominanceInfoBase &operator=(const DominanceInfoBase &) = delete;
33 
35  void recalculate(Operation *op);
36 
39  assert(dominanceInfos.count(region) != 0);
40  return dominanceInfos[region]->getRootNode();
41  }
42 
43 protected:
45 
47  bool properlyDominates(Block *a, Block *b);
48 
51 };
52 } // end namespace detail
53 
55 class DominanceInfo : public detail::DominanceInfoBase</*IsPostDom=*/false> {
56 public:
57  using super::super;
58 
60  bool properlyDominates(Operation *a, Operation *b);
61 
63  bool dominates(Operation *a, Operation *b) {
64  return a == b || properlyDominates(a, b);
65  }
66 
68  bool properlyDominates(Value a, Operation *b);
69 
71  bool dominates(Value a, Operation *b) {
72  return (Operation *)a->getDefiningOp() == b || properlyDominates(a, b);
73  }
74 
76  bool dominates(Block *a, Block *b) {
77  return a == b || properlyDominates(a, b);
78  }
79 
81  bool properlyDominates(Block *a, Block *b) {
82  return super::properlyDominates(a, b);
83  }
84 
86  DominanceInfoNode *getNode(Block *a);
87 
89  void updateDFSNumbers();
90 };
91 
93 class PostDominanceInfo : public detail::DominanceInfoBase</*IsPostDom=*/true> {
94 public:
95  using super::super;
96 
98  bool properlyPostDominates(Operation *a, Operation *b);
99 
102  return a == b || properlyPostDominates(a, b);
103  }
104 
107  return super::properlyDominates(a, b);
108  }
109 
111  bool postDominates(Block *a, Block *b) {
112  return a == b || properlyPostDominates(a, b);
113  }
114 };
115 
116 } // end namespace mlir
117 
118 namespace llvm {
119 
122 template <> struct GraphTraits<mlir::DominanceInfoNode *> {
123  using ChildIteratorType = mlir::DominanceInfoNode::iterator;
125 
126  static NodeRef getEntryNode(NodeRef N) { return N; }
127  static inline ChildIteratorType child_begin(NodeRef N) { return N->begin(); }
128  static inline ChildIteratorType child_end(NodeRef N) { return N->end(); }
129 };
130 
131 template <> struct GraphTraits<const mlir::DominanceInfoNode *> {
132  using ChildIteratorType = mlir::DominanceInfoNode::const_iterator;
134 
135  static NodeRef getEntryNode(NodeRef N) { return N; }
136  static inline ChildIteratorType child_begin(NodeRef N) { return N->begin(); }
137  static inline ChildIteratorType child_end(NodeRef N) { return N->end(); }
138 };
139 
140 } // end namespace llvm
141 #endif
static ChildIteratorType child_end(NodeRef N)
Definition: Dominance.h:128
Definition: InferTypeOpInterface.cpp:20
Definition: Region.h:23
static NodeRef getEntryNode(NodeRef N)
Definition: Dominance.h:126
Definition: PassRegistry.cpp:413
Definition: Operation.h:27
DominanceInfoBase(Operation *op)
Definition: Dominance.h:27
Block represents an ordered list of Operations.
Definition: Block.h:21
Definition: LLVM.h:48
A class for computing basic dominance information.
Definition: Dominance.h:55
const mlir::DominanceInfoNode * NodeRef
Definition: Dominance.h:133
bool properlyPostDominates(Block *a, Block *b)
Return true if the specified block A properly postdominates block B.
Definition: Dominance.h:106
static ChildIteratorType child_begin(NodeRef N)
Definition: Dominance.h:127
mlir::DominanceInfoNode::const_iterator ChildIteratorType
Definition: Dominance.h:132
static NodeRef getEntryNode(NodeRef N)
Definition: Dominance.h:135
DenseMap< Region *, std::unique_ptr< base > > dominanceInfos
A mapping of regions to their base dominator tree.
Definition: Dominance.h:50
bool dominates(Operation *a, Operation *b)
Return true if operation A dominates operation B.
Definition: Dominance.h:63
DominanceInfoNode * getRootNode(Region *region)
Get the root dominance node of the given region.
Definition: Dominance.h:38
bool dominates(Block *a, Block *b)
Return true if the specified block A dominates block B.
Definition: Dominance.h:76
Definition: Value.h:38
bool properlyDominates(Block *a, Block *b)
Return true if the specified block A properly dominates block B.
Definition: Dominance.h:81
bool postDominates(Block *a, Block *b)
Return true if the specified block A postdominates block B.
Definition: Dominance.h:111
bool dominates(Value a, Operation *b)
Return true if operation A dominates operation B.
Definition: Dominance.h:71
mlir::DominanceInfoNode * NodeRef
Definition: Dominance.h:124
Definition: Dominance.h:23
Operation * getDefiningOp() const
Definition: Value.cpp:71
bool postDominates(Operation *a, Operation *b)
Return true if operation A postdominates operation B.
Definition: Dominance.h:101
static ChildIteratorType child_begin(NodeRef N)
Definition: Dominance.h:136
mlir::DominanceInfoNode::iterator ChildIteratorType
Definition: Dominance.h:123
static ChildIteratorType child_end(NodeRef N)
Definition: Dominance.h:137
A class for computing basic postdominance information.
Definition: Dominance.h:93
llvm::DomTreeNodeBase< Block > DominanceInfoNode
Definition: Dominance.h:19