|
9 | 9 | // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors |
10 | 10 | // |
11 | 11 | //===----------------------------------------------------------------------===// |
12 | | -/// |
13 | | -/// Terminology: |
14 | | -/// |
15 | | -/// Simple liveness: |
16 | | -/// - Ends at lifetime-ending operations. |
17 | | -/// - Transitively follows guaranteed forwarding operations and address uses |
18 | | -/// within the current scope. |
19 | | -/// - Assumes inner scopes are complete, including borrow and address scopes |
20 | | -/// - Rarely returns AddressUseKind::PointerEscape. |
21 | | -/// - Per-definition dominance holds |
22 | | -/// - Insulates outer scopes from inner scope details. Maintains the |
23 | | -/// invariant that inlining cannot pessimize optimization. |
24 | | -/// |
25 | | -/// Transitive liveness |
26 | | -/// - Transitively follows uses within inner scopes, including forwarding |
27 | | -/// operations and address uses. |
28 | | -/// - Much more likely to returns AddressUseKind::PointerEscape |
29 | | -/// - Per-definition dominance holds |
30 | | -/// - Does not assume that any scopes are complete. |
31 | | -/// |
32 | | -/// Extended liveness (copy-extension and reborrow-extension) |
33 | | -/// - Extends a live range across lifetime-ending operations |
34 | | -/// - Depending on context: owned values are extended across copies or |
35 | | -/// guaranteed values are extended across reborrows |
36 | | -/// - Copy-extension is used to canonicalize an OSSA lifetime |
37 | | -/// - Reborrow-extension is used to check borrow scopes relative to its inner |
38 | | -/// uses and outer lifetime |
39 | | -/// - Per-definition dominance does not hold |
40 | | -/// |
41 | | -//===----------------------------------------------------------------------===// |
42 | 12 |
|
43 | 13 | #ifndef SWIFT_SIL_OWNERSHIPUTILS_H |
44 | 14 | #define SWIFT_SIL_OWNERSHIPUTILS_H |
@@ -255,6 +225,10 @@ bool findUsesOfSimpleValue(SILValue value, |
255 | 225 | bool visitGuaranteedForwardingPhisForSSAValue( |
256 | 226 | SILValue value, function_ref<bool(Operand *)> func); |
257 | 227 |
|
| 228 | +//===----------------------------------------------------------------------===// |
| 229 | +// Abstractions |
| 230 | +//===----------------------------------------------------------------------===// |
| 231 | + |
258 | 232 | /// An operand that forwards ownership to one or more results. |
259 | 233 | class ForwardingOperand { |
260 | 234 | Operand *use = nullptr; |
@@ -1312,13 +1286,16 @@ void visitExtendedGuaranteedForwardingPhiBaseValuePairs( |
1312 | 1286 | bool visitForwardedGuaranteedOperands( |
1313 | 1287 | SILValue value, function_ref<void(Operand *)> visitOperand); |
1314 | 1288 |
|
1315 | | -/// Visit the phis in the same block as \p phi which are reborrows of a borrow |
1316 | | -/// of one of the values reaching \p phi. |
| 1289 | + |
| 1290 | +/// Return true of the lifetime of \p innerPhiVal depends on \p outerPhiVal. |
| 1291 | +bool isInnerAdjacentPhi(SILArgument *innerPhiVal, SILArgument *outerPhiVal); |
| 1292 | + |
| 1293 | +/// Visit the phis in the same block as \p phi whose lifetime depends on \p phi. |
1317 | 1294 | /// |
1318 | 1295 | /// If the visitor returns false, stops visiting and returns false. Otherwise, |
1319 | 1296 | /// returns true. |
1320 | | -bool visitAdjacentReborrowsOfPhi(SILPhiArgument *phi, |
1321 | | - function_ref<bool(SILPhiArgument *)> visitor); |
| 1297 | +bool visitInnerAdjacentPhis(SILArgument *phi, |
| 1298 | + function_ref<bool(SILArgument *)> visitor); |
1322 | 1299 |
|
1323 | 1300 | /// Visit each definition of a scope that immediately encloses a guaranteed |
1324 | 1301 | /// value. The guaranteed value effectively keeps these scopes alive. |
|
0 commit comments