Movatterモバイル変換


[0]ホーム

URL:


LLVM 20.0.0git
GenericDomTreeUpdater.h
Go to the documentation of this file.
1//===- GenericDomTreeUpdater.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 defines the GenericDomTreeUpdater class, which provides a uniform
10// way to update dominator tree related data structures.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_ANALYSIS_GENERICDOMTREEUPDATER_H
15#define LLVM_ANALYSIS_GENERICDOMTREEUPDATER_H
16
17#include "llvm/ADT/ArrayRef.h"
18#include "llvm/ADT/SmallSet.h"
19#include "llvm/Support/Compiler.h"
20
21namespacellvm {
22
23template <typename DerivedT,typename DomTreeT,typename PostDomTreeT>
24classGenericDomTreeUpdater {
25 DerivedT &derived() {return *static_cast<DerivedT *>(this); }
26const DerivedT &derived() const{
27return *static_cast<constDerivedT *>(this);
28 }
29
30public:
31enum classUpdateStrategy :unsignedchar {Eager = 0,Lazy = 1 };
32usingBasicBlockT =typename DomTreeT::NodeType;
33usingUpdateT =typename DomTreeT::UpdateType;
34
35explicitGenericDomTreeUpdater(UpdateStrategy Strategy_)
36 :Strategy(Strategy_) {}
37GenericDomTreeUpdater(DomTreeT &DT_,UpdateStrategy Strategy_)
38 :DT(&DT_),Strategy(Strategy_) {}
39GenericDomTreeUpdater(DomTreeT *DT_,UpdateStrategy Strategy_)
40 :DT(DT_),Strategy(Strategy_) {}
41GenericDomTreeUpdater(PostDomTreeT &PDT_,UpdateStrategy Strategy_)
42 :PDT(&PDT_),Strategy(Strategy_) {}
43GenericDomTreeUpdater(PostDomTreeT *PDT_,UpdateStrategy Strategy_)
44 :PDT(PDT_),Strategy(Strategy_) {}
45GenericDomTreeUpdater(DomTreeT &DT_, PostDomTreeT &PDT_,
46UpdateStrategy Strategy_)
47 :DT(&DT_),PDT(&PDT_),Strategy(Strategy_) {}
48GenericDomTreeUpdater(DomTreeT *DT_, PostDomTreeT *PDT_,
49UpdateStrategy Strategy_)
50 :DT(DT_),PDT(PDT_),Strategy(Strategy_) {}
51
52~GenericDomTreeUpdater() {
53// We cannot call into derived() here as it will already be destroyed.
54assert(!hasPendingUpdates() &&
55"Pending updates were not flushed by derived class.");
56 }
57
58 /// Returns true if the current strategy is Lazy.
59boolisLazy() const{returnStrategy ==UpdateStrategy::Lazy; }
60
61 /// Returns true if the current strategy is Eager.
62boolisEager() const{returnStrategy ==UpdateStrategy::Eager; }
63
64 /// Returns true if it holds a DomTreeT.
65boolhasDomTree() const{returnDT !=nullptr; }
66
67 /// Returns true if it holds a PostDomTreeT.
68boolhasPostDomTree() const{returnPDT !=nullptr; }
69
70 /// Returns true if there is BasicBlockT awaiting deletion.
71 /// The deletion will only happen until a flush event and
72 /// all available trees are up-to-date.
73 /// Returns false under Eager UpdateStrategy.
74boolhasPendingDeletedBB() const{return !DeletedBBs.empty(); }
75
76 /// Returns true if DelBB is awaiting deletion.
77 /// Returns false under Eager UpdateStrategy.
78boolisBBPendingDeletion(BasicBlockT *DelBB) const{
79if (Strategy ==UpdateStrategy::Eager ||DeletedBBs.empty())
80returnfalse;
81returnDeletedBBs.contains(DelBB);
82 }
83
84 /// Returns true if either of DT or PDT is valid and the tree has at
85 /// least one update pending. If DT or PDT is nullptr it is treated
86 /// as having no pending updates. This function does not check
87 /// whether there is MachineBasicBlock awaiting deletion.
88 /// Returns false under Eager UpdateStrategy.
89boolhasPendingUpdates() const{
90returnhasPendingDomTreeUpdates() ||hasPendingPostDomTreeUpdates();
91 }
92
93 /// Returns true if there are DomTreeT updates queued.
94 /// Returns false under Eager UpdateStrategy or DT is nullptr.
95boolhasPendingDomTreeUpdates() const{
96if (!DT)
97returnfalse;
98returnPendUpdates.size() !=PendDTUpdateIndex;
99 }
100
101 /// Returns true if there are PostDomTreeT updates queued.
102 /// Returns false under Eager UpdateStrategy or PDT is nullptr.
103boolhasPendingPostDomTreeUpdates() const{
104if (!PDT)
105returnfalse;
106returnPendUpdates.size() !=PendPDTUpdateIndex;
107 }
108
109 ///@{
110 /// \name Mutation APIs
111 ///
112 /// These methods provide APIs for submitting updates to the DomTreeT and
113 /// the PostDominatorTree.
114 ///
115 /// Note: There are two strategies to update the DomTreeT and the
116 /// PostDominatorTree:
117 /// 1. Eager UpdateStrategy: Updates are submitted and then flushed
118 /// immediately.
119 /// 2. Lazy UpdateStrategy: Updates are submitted but only flushed when you
120 /// explicitly call Flush APIs. It is recommended to use this update strategy
121 /// when you submit a bunch of updates multiple times which can then
122 /// add up to a large number of updates between two queries on the
123 /// DomTreeT. The incremental updater can reschedule the updates or
124 /// decide to recalculate the dominator tree in order to speedup the updating
125 /// process depending on the number of updates.
126 ///
127 /// Although GenericDomTree provides several update primitives,
128 /// it is not encouraged to use these APIs directly.
129
130 /// Notify DTU that the entry block was replaced.
131 /// Recalculate all available trees and flush all BasicBlocks
132 /// awaiting deletion immediately.
133template <typename FuncT>voidrecalculate(FuncT &F);
134
135 /// Submit updates to all available trees.
136 /// The Eager Strategy flushes updates immediately while the Lazy Strategy
137 /// queues the updates.
138 ///
139 /// Note: The "existence" of an edge in a CFG refers to the CFG which DTU is
140 /// in sync with + all updates before that single update.
141 ///
142 /// CAUTION!
143 /// 1. It is required for the state of the LLVM IR to be updated
144 /// *before* submitting the updates because the internal update routine will
145 /// analyze the current state of the CFG to determine whether an update
146 /// is valid.
147 /// 2. It is illegal to submit any update that has already been submitted,
148 /// i.e., you are supposed not to insert an existent edge or delete a
149 /// nonexistent edge.
150voidapplyUpdates(ArrayRef<UpdateT> Updates);
151
152 /// Apply updates that the critical edge (FromBB, ToBB) has been
153 /// split with NewBB.
154voidsplitCriticalEdge(BasicBlockT *FromBB,BasicBlockT *ToBB,
155BasicBlockT *NewBB);
156
157 /// Submit updates to all available trees. It will also
158 /// 1. discard duplicated updates,
159 /// 2. remove invalid updates. (Invalid updates means deletion of an edge that
160 /// still exists or insertion of an edge that does not exist.)
161 /// The Eager Strategy flushes updates immediately while the Lazy Strategy
162 /// queues the updates.
163 ///
164 /// Note: The "existence" of an edge in a CFG refers to the CFG which DTU is
165 /// in sync with + all updates before that single update.
166 ///
167 /// CAUTION!
168 /// 1. It is required for the state of the LLVM IR to be updated
169 /// *before* submitting the updates because the internal update routine will
170 /// analyze the current state of the CFG to determine whether an update
171 /// is valid.
172 /// 2. It is illegal to submit any update that has already been submitted,
173 /// i.e., you are supposed not to insert an existent edge or delete a
174 /// nonexistent edge.
175 /// 3. It is only legal to submit updates to an edge in the order CFG changes
176 /// are made. The order you submit updates on different edges is not
177 /// restricted.
178voidapplyUpdatesPermissive(ArrayRef<UpdateT> Updates);
179
180 ///@}
181
182 ///@{
183 /// \name Flush APIs
184 ///
185 /// CAUTION! By the moment these flush APIs are called, the current CFG needs
186 /// to be the same as the CFG which DTU is in sync with + all updates
187 /// submitted.
188
189 /// Flush DomTree updates and return DomTree.
190 /// It flushes Deleted BBs if both trees are up-to-date.
191 /// It must only be called when it has a DomTree.
192 DomTreeT &getDomTree();
193
194 /// Flush PostDomTree updates and return PostDomTree.
195 /// It flushes Deleted BBs if both trees are up-to-date.
196 /// It must only be called when it has a PostDomTree.
197 PostDomTreeT &getPostDomTree();
198
199 /// Apply all pending updates to available trees and flush all BasicBlocks
200 /// awaiting deletion.
201
202voidflush() {
203applyDomTreeUpdates();
204applyPostDomTreeUpdates();
205dropOutOfDateUpdates();
206 }
207
208 ///@}
209
210 /// Debug method to help view the internal state of this class.
211LLVM_DUMP_METHODvoiddump()const;
212
213protected:
214 /// Helper structure used to hold all the basic blocks
215 /// involved in the split of a critical edge.
216structCriticalEdge {
217BasicBlockT *FromBB;
218BasicBlockT *ToBB;
219BasicBlockT *NewBB;
220 };
221
222structDomTreeUpdate {
223boolIsCriticalEdgeSplit =false;
224union{
225UpdateTUpdate;
226CriticalEdgeEdgeSplit;
227 };
228DomTreeUpdate(UpdateTUpdate) :Update(Update) {}
229DomTreeUpdate(CriticalEdgeE) :IsCriticalEdgeSplit(true),EdgeSplit(E) {}
230 };
231
232SmallVector<DomTreeUpdate, 16>PendUpdates;
233size_tPendDTUpdateIndex = 0;
234size_tPendPDTUpdateIndex = 0;
235 DomTreeT *DT =nullptr;
236 PostDomTreeT *PDT =nullptr;
237constUpdateStrategyStrategy;
238SmallPtrSet<BasicBlockT *, 8>DeletedBBs;
239boolIsRecalculatingDomTree =false;
240boolIsRecalculatingPostDomTree =false;
241
242 /// Returns true if the update is self dominance.
243boolisSelfDominance(UpdateT Update) const{
244// Won't affect DomTree and PostDomTree.
245return Update.getFrom() == Update.getTo();
246 }
247
248 /// Helper function to apply all pending DomTree updates.
249voidapplyDomTreeUpdates() { applyUpdatesImpl<true>(); }
250
251 /// Helper function to apply all pending PostDomTree updates.
252voidapplyPostDomTreeUpdates() { applyUpdatesImpl<false>(); }
253
254 /// Returns true if the update appears in the LLVM IR.
255 /// It is used to check whether an update is valid in
256 /// insertEdge/deleteEdge or is unnecessary in the batch update.
257boolisUpdateValid(UpdateT Update)const;
258
259 /// Erase Basic Block node before it is unlinked from Function
260 /// in the DomTree and PostDomTree.
261voideraseDelBBNode(BasicBlockT *DelBB);
262
263 /// Helper function to flush deleted BasicBlocks if all available
264 /// trees are up-to-date.
265voidtryFlushDeletedBB();
266
267 /// Drop all updates applied by all available trees and delete BasicBlocks if
268 /// all available trees are up-to-date.
269voiddropOutOfDateUpdates();
270
271private:
272void splitDTCriticalEdges(ArrayRef<CriticalEdge> Updates);
273void splitPDTCriticalEdges(ArrayRef<CriticalEdge> Updates);
274template <bool IsForward>void applyUpdatesImpl();
275};
276
277}// namespace llvm
278
279#endif// LLVM_ANALYSIS_GENERICDOMTREEUPDATER_H
ArrayRef.h
true
basic Basic Alias true
Definition:BasicAliasAnalysis.cpp:1981
E
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
Compiler.h
LLVM_DUMP_METHOD
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Definition:Compiler.h:622
F
#define F(x, y, z)
Definition:MD5.cpp:55
assert
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
SmallSet.h
This file defines the SmallSet class.
llvm::ArrayRef
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition:ArrayRef.h:41
llvm::GenericDomTreeUpdater
Definition:GenericDomTreeUpdater.h:24
llvm::GenericDomTreeUpdater::DeletedBBs
SmallPtrSet< BasicBlockT *, 8 > DeletedBBs
Definition:GenericDomTreeUpdater.h:238
llvm::GenericDomTreeUpdater::getDomTree
DomTreeT & getDomTree()
Flush DomTree updates and return DomTree.
Definition:GenericDomTreeUpdaterImpl.h:153
llvm::GenericDomTreeUpdater::getPostDomTree
PostDomTreeT & getPostDomTree()
Flush PostDomTree updates and return PostDomTree.
Definition:GenericDomTreeUpdaterImpl.h:162
llvm::GenericDomTreeUpdater::isEager
bool isEager() const
Returns true if the current strategy is Eager.
Definition:GenericDomTreeUpdater.h:62
llvm::GenericDomTreeUpdater::UpdateStrategy
UpdateStrategy
Definition:GenericDomTreeUpdater.h:31
llvm::GenericDomTreeUpdater::UpdateStrategy::Lazy
@ Lazy
llvm::GenericDomTreeUpdater::UpdateStrategy::Eager
@ Eager
llvm::GenericDomTreeUpdater::applyPostDomTreeUpdates
void applyPostDomTreeUpdates()
Helper function to apply all pending PostDomTree updates.
Definition:GenericDomTreeUpdater.h:252
llvm::GenericDomTreeUpdater::applyUpdatesPermissive
void applyUpdatesPermissive(ArrayRef< UpdateT > Updates)
Submit updates to all available trees.
Definition:GenericDomTreeUpdaterImpl.h:81
llvm::GenericDomTreeUpdater::GenericDomTreeUpdater
GenericDomTreeUpdater(PostDomTreeT &PDT_, UpdateStrategy Strategy_)
Definition:GenericDomTreeUpdater.h:41
llvm::GenericDomTreeUpdater::applyUpdates
void applyUpdates(ArrayRef< UpdateT > Updates)
Submit updates to all available trees.
Definition:GenericDomTreeUpdaterImpl.h:59
llvm::GenericDomTreeUpdater::IsRecalculatingPostDomTree
bool IsRecalculatingPostDomTree
Definition:GenericDomTreeUpdater.h:240
llvm::GenericDomTreeUpdater::eraseDelBBNode
void eraseDelBBNode(BasicBlockT *DelBB)
Erase Basic Block node before it is unlinked from Function in the DomTree and PostDomTree.
Definition:GenericDomTreeUpdaterImpl.h:331
llvm::GenericDomTreeUpdater::flush
void flush()
Apply all pending updates to available trees and flush all BasicBlocks awaiting deletion.
Definition:GenericDomTreeUpdater.h:202
llvm::GenericDomTreeUpdater::hasPendingUpdates
bool hasPendingUpdates() const
Returns true if either of DT or PDT is valid and the tree has at least one update pending.
Definition:GenericDomTreeUpdater.h:89
llvm::GenericDomTreeUpdater::hasDomTree
bool hasDomTree() const
Returns true if it holds a DomTreeT.
Definition:GenericDomTreeUpdater.h:65
llvm::GenericDomTreeUpdater::isSelfDominance
bool isSelfDominance(UpdateT Update) const
Returns true if the update is self dominance.
Definition:GenericDomTreeUpdater.h:243
llvm::GenericDomTreeUpdater::Strategy
const UpdateStrategy Strategy
Definition:GenericDomTreeUpdater.h:237
llvm::GenericDomTreeUpdater::UpdateT
typename DomTreeT::UpdateType UpdateT
Definition:GenericDomTreeUpdater.h:33
llvm::GenericDomTreeUpdater::hasPostDomTree
bool hasPostDomTree() const
Returns true if it holds a PostDomTreeT.
Definition:GenericDomTreeUpdater.h:68
llvm::GenericDomTreeUpdater::BasicBlockT
typename DomTreeT::NodeType BasicBlockT
Definition:GenericDomTreeUpdater.h:32
llvm::GenericDomTreeUpdater::GenericDomTreeUpdater
GenericDomTreeUpdater(DomTreeT &DT_, UpdateStrategy Strategy_)
Definition:GenericDomTreeUpdater.h:37
llvm::GenericDomTreeUpdater::tryFlushDeletedBB
void tryFlushDeletedBB()
Helper function to flush deleted BasicBlocks if all available trees are up-to-date.
Definition:GenericDomTreeUpdaterImpl.h:344
llvm::GenericDomTreeUpdater::isBBPendingDeletion
bool isBBPendingDeletion(BasicBlockT *DelBB) const
Returns true if DelBB is awaiting deletion.
Definition:GenericDomTreeUpdater.h:78
llvm::GenericDomTreeUpdater::PDT
PostDomTreeT * PDT
Definition:GenericDomTreeUpdater.h:236
llvm::GenericDomTreeUpdater::GenericDomTreeUpdater
GenericDomTreeUpdater(DomTreeT *DT_, PostDomTreeT *PDT_, UpdateStrategy Strategy_)
Definition:GenericDomTreeUpdater.h:48
llvm::GenericDomTreeUpdater::dropOutOfDateUpdates
void dropOutOfDateUpdates()
Drop all updates applied by all available trees and delete BasicBlocks if all available trees are up-...
Definition:GenericDomTreeUpdaterImpl.h:351
llvm::GenericDomTreeUpdater::IsRecalculatingDomTree
bool IsRecalculatingDomTree
Definition:GenericDomTreeUpdater.h:239
llvm::GenericDomTreeUpdater::hasPendingPostDomTreeUpdates
bool hasPendingPostDomTreeUpdates() const
Returns true if there are PostDomTreeT updates queued.
Definition:GenericDomTreeUpdater.h:103
llvm::GenericDomTreeUpdater::PendPDTUpdateIndex
size_t PendPDTUpdateIndex
Definition:GenericDomTreeUpdater.h:234
llvm::GenericDomTreeUpdater::recalculate
void recalculate(FuncT &F)
Notify DTU that the entry block was replaced.
Definition:GenericDomTreeUpdaterImpl.h:28
llvm::GenericDomTreeUpdater::splitCriticalEdge
void splitCriticalEdge(BasicBlockT *FromBB, BasicBlockT *ToBB, BasicBlockT *NewBB)
Apply updates that the critical edge (FromBB, ToBB) has been split with NewBB.
Definition:GenericDomTreeUpdaterImpl.h:134
llvm::GenericDomTreeUpdater::applyDomTreeUpdates
void applyDomTreeUpdates()
Helper function to apply all pending DomTree updates.
Definition:GenericDomTreeUpdater.h:249
llvm::GenericDomTreeUpdater::GenericDomTreeUpdater
GenericDomTreeUpdater(UpdateStrategy Strategy_)
Definition:GenericDomTreeUpdater.h:35
llvm::GenericDomTreeUpdater::GenericDomTreeUpdater
GenericDomTreeUpdater(DomTreeT &DT_, PostDomTreeT &PDT_, UpdateStrategy Strategy_)
Definition:GenericDomTreeUpdater.h:45
llvm::GenericDomTreeUpdater::GenericDomTreeUpdater
GenericDomTreeUpdater(PostDomTreeT *PDT_, UpdateStrategy Strategy_)
Definition:GenericDomTreeUpdater.h:43
llvm::GenericDomTreeUpdater::isUpdateValid
bool isUpdateValid(UpdateT Update) const
Returns true if the update appears in the LLVM IR.
Definition:GenericDomTreeUpdaterImpl.h:304
llvm::GenericDomTreeUpdater::PendUpdates
SmallVector< DomTreeUpdate, 16 > PendUpdates
Definition:GenericDomTreeUpdater.h:232
llvm::GenericDomTreeUpdater::DT
DomTreeT * DT
Definition:GenericDomTreeUpdater.h:235
llvm::GenericDomTreeUpdater::PendDTUpdateIndex
size_t PendDTUpdateIndex
Definition:GenericDomTreeUpdater.h:233
llvm::GenericDomTreeUpdater::~GenericDomTreeUpdater
~GenericDomTreeUpdater()
Definition:GenericDomTreeUpdater.h:52
llvm::GenericDomTreeUpdater::hasPendingDeletedBB
bool hasPendingDeletedBB() const
Returns true if there is BasicBlockT awaiting deletion.
Definition:GenericDomTreeUpdater.h:74
llvm::GenericDomTreeUpdater::dump
LLVM_DUMP_METHOD void dump() const
Debug method to help view the internal state of this class.
Definition:GenericDomTreeUpdaterImpl.h:171
llvm::GenericDomTreeUpdater::hasPendingDomTreeUpdates
bool hasPendingDomTreeUpdates() const
Returns true if there are DomTreeT updates queued.
Definition:GenericDomTreeUpdater.h:95
llvm::GenericDomTreeUpdater::GenericDomTreeUpdater
GenericDomTreeUpdater(DomTreeT *DT_, UpdateStrategy Strategy_)
Definition:GenericDomTreeUpdater.h:39
llvm::GenericDomTreeUpdater::isLazy
bool isLazy() const
Returns true if the current strategy is Lazy.
Definition:GenericDomTreeUpdater.h:59
llvm::SmallPtrSetImplBase::empty
bool empty() const
Definition:SmallPtrSet.h:93
llvm::SmallPtrSetImpl::contains
bool contains(ConstPtrType Ptr) const
Definition:SmallPtrSet.h:458
llvm::SmallPtrSet
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition:SmallPtrSet.h:519
llvm::SmallVector
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition:SmallVector.h:1196
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition:AddressRanges.h:18
llvm::GenericDomTreeUpdater::CriticalEdge
Helper structure used to hold all the basic blocks involved in the split of a critical edge.
Definition:GenericDomTreeUpdater.h:216
llvm::GenericDomTreeUpdater::CriticalEdge::NewBB
BasicBlockT * NewBB
Definition:GenericDomTreeUpdater.h:219
llvm::GenericDomTreeUpdater::CriticalEdge::ToBB
BasicBlockT * ToBB
Definition:GenericDomTreeUpdater.h:218
llvm::GenericDomTreeUpdater::CriticalEdge::FromBB
BasicBlockT * FromBB
Definition:GenericDomTreeUpdater.h:217
llvm::GenericDomTreeUpdater::DomTreeUpdate
Definition:GenericDomTreeUpdater.h:222
llvm::GenericDomTreeUpdater::DomTreeUpdate::IsCriticalEdgeSplit
bool IsCriticalEdgeSplit
Definition:GenericDomTreeUpdater.h:223
llvm::GenericDomTreeUpdater::DomTreeUpdate::DomTreeUpdate
DomTreeUpdate(CriticalEdge E)
Definition:GenericDomTreeUpdater.h:229
llvm::GenericDomTreeUpdater::DomTreeUpdate::DomTreeUpdate
DomTreeUpdate(UpdateT Update)
Definition:GenericDomTreeUpdater.h:228
llvm::GenericDomTreeUpdater::DomTreeUpdate::Update
UpdateT Update
Definition:GenericDomTreeUpdater.h:225
llvm::GenericDomTreeUpdater::DomTreeUpdate::EdgeSplit
CriticalEdge EdgeSplit
Definition:GenericDomTreeUpdater.h:226

Generated on Thu Jul 17 2025 08:31:00 for LLVM by doxygen 1.9.6
[8]ページ先頭

©2009-2025 Movatter.jp