@@ -144,23 +144,26 @@ class AvailabilityBoundaryVisitor {
144
144
: value(value), allowLeaks(allowLeaks), starts(value->getFunction ()),
145
145
region(value->getFunction ()) {}
146
146
147
+ using Visit = llvm::function_ref<void (SILInstruction *,
148
+ OSSALifetimeCompletion::LifetimeEnd)>;
149
+
150
+ struct Result ;
151
+
152
+ // / Do all three steps at once.
153
+ void visit (const SSAPrunedLiveness &liveness, Result &result, Visit visit);
154
+
155
+ private:
147
156
// / Region discovery.
148
157
// /
149
158
// / Forward CFG walk from non-lifetime-ending boundary to unreachable
150
159
// / instructions.
151
160
void computeRegion (const SSAPrunedLiveness &liveness);
152
161
153
- struct Result ;
154
-
155
162
// / Iterative dataflow to determine availability for each block in `region`.
156
163
void propagateAvailablity (Result &result);
157
164
158
165
// / Visit the terminators of blocks on the boundary of availability.
159
- void visitAvailabilityBoundary (
160
- Result const &result,
161
- llvm::function_ref<void (SILInstruction *,
162
- OSSALifetimeCompletion::LifetimeEnd)>
163
- visit);
166
+ void visitAvailabilityBoundary (Result const &result, Visit visit);
164
167
165
168
struct State {
166
169
enum Value : uint8_t {
@@ -177,6 +180,7 @@ class AvailabilityBoundaryVisitor {
177
180
}
178
181
};
179
182
183
+ public:
180
184
struct Result {
181
185
BasicBlockBitfield states;
182
186
@@ -205,6 +209,15 @@ class AvailabilityBoundaryVisitor {
205
209
};
206
210
};
207
211
212
+ void AvailabilityBoundaryVisitor::visit (const SSAPrunedLiveness &liveness,
213
+ Result &result, Visit visit) {
214
+ computeRegion (liveness);
215
+
216
+ propagateAvailablity (result);
217
+
218
+ visitAvailabilityBoundary (result, visit);
219
+ }
220
+
208
221
void AvailabilityBoundaryVisitor::computeRegion (
209
222
const SSAPrunedLiveness &liveness) {
210
223
// (1) Compute the complete liveness boundary.
@@ -344,14 +357,8 @@ void OSSALifetimeCompletion::visitAvailabilityBoundary(
344
357
llvm::function_ref<void (SILInstruction *, LifetimeEnd end)> visit) {
345
358
346
359
AvailabilityBoundaryVisitor visitor (value, allowLeaks);
347
-
348
- visitor.computeRegion (liveness);
349
-
350
360
AvailabilityBoundaryVisitor::Result result (value->getFunction ());
351
-
352
- visitor.propagateAvailablity (result);
353
-
354
- visitor.visitAvailabilityBoundary (result, visit);
361
+ visitor.visit (liveness, result, visit);
355
362
}
356
363
357
364
static bool endLifetimeAtAvailabilityBoundary (
0 commit comments