@@ -144,23 +144,26 @@ class AvailabilityBoundaryVisitor {
144144 : value(value), allowLeaks(allowLeaks), starts(value->getFunction ()),
145145 region(value->getFunction ()) {}
146146
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:
147156 // / Region discovery.
148157 // /
149158 // / Forward CFG walk from non-lifetime-ending boundary to unreachable
150159 // / instructions.
151160 void computeRegion (const SSAPrunedLiveness &liveness);
152161
153- struct Result ;
154-
155162 // / Iterative dataflow to determine availability for each block in `region`.
156163 void propagateAvailablity (Result &result);
157164
158165 // / 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);
164167
165168 struct State {
166169 enum Value : uint8_t {
@@ -177,6 +180,7 @@ class AvailabilityBoundaryVisitor {
177180 }
178181 };
179182
183+ public:
180184 struct Result {
181185 BasicBlockBitfield states;
182186
@@ -205,6 +209,15 @@ class AvailabilityBoundaryVisitor {
205209 };
206210};
207211
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+
208221void AvailabilityBoundaryVisitor::computeRegion (
209222 const SSAPrunedLiveness &liveness) {
210223 // (1) Compute the complete liveness boundary.
@@ -344,14 +357,8 @@ void OSSALifetimeCompletion::visitAvailabilityBoundary(
344357 llvm::function_ref<void (SILInstruction *, LifetimeEnd end)> visit) {
345358
346359 AvailabilityBoundaryVisitor visitor (value, allowLeaks);
347-
348- visitor.computeRegion (liveness);
349-
350360 AvailabilityBoundaryVisitor::Result result (value->getFunction ());
351-
352- visitor.propagateAvailablity (result);
353-
354- visitor.visitAvailabilityBoundary (result, visit);
361+ visitor.visit (liveness, result, visit);
355362}
356363
357364static bool endLifetimeAtAvailabilityBoundary (
0 commit comments