|
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