File tree Expand file tree Collapse file tree 2 files changed +64
-0
lines changed
SwiftCompilerSources/Sources/Optimizer/Utilities
test/SILOptimizer/lifetime_dependence Expand file tree Collapse file tree 2 files changed +64
-0
lines changed Original file line number Diff line number Diff line change @@ -638,12 +638,34 @@ struct VariableIntroducerUseDefWalker : LifetimeDependenceUseDefWalker {
638
638
639
639
mutating func walkUp( address: Value ) -> WalkResult {
640
640
if let beginAccess = address. definingInstruction as? BeginAccessInst {
641
+ // Treat calls to unsafe[Mutable]Address like a projection of 'self' rather than a separate variable access.
642
+ if let addressorSelf = beginAccess. unsafeAddressorSelf {
643
+ return walkUp ( valueOrAddress: addressorSelf)
644
+ }
641
645
return introducer ( beginAccess, nil )
642
646
}
643
647
return walkUpDefault ( address: address)
644
648
}
645
649
}
646
650
651
+ private extension BeginAccessInst {
652
+ // Recognize an access scope for a unsafe addressor:
653
+ // %adr = pointer_to_address
654
+ // %md = mark_dependence %adr
655
+ // begin_access [unsafe] %md
656
+ var unsafeAddressorSelf : Value ? {
657
+ guard isUnsafe else {
658
+ return nil
659
+ }
660
+ let accessBaseAndScopes = address. accessBaseWithScopes
661
+ guard case . pointer = accessBaseAndScopes. base,
662
+ case let . dependence( markDep) = accessBaseAndScopes. scopes. first else {
663
+ return nil
664
+ }
665
+ return markDep. base
666
+ }
667
+ }
668
+
647
669
/// Walk up the lifetime dependence chain.
648
670
///
649
671
/// This finds the introducers of a dependence chain. which represent the value's "inherited" dependencies. This stops
Original file line number Diff line number Diff line change @@ -74,6 +74,34 @@ extension Array {
74
74
}
75
75
}
76
76
77
+ struct Inner {
78
+ var p : UnsafePointer < Int >
79
+
80
+ @lifetime ( borrow self)
81
+ borrowing func span( ) -> Span < Int > {
82
+ Span ( base: p, count: 1 )
83
+ }
84
+ }
85
+
86
+ struct Outer {
87
+ let inner : Inner
88
+ let fakePointer : UnsafePointer < Inner >
89
+
90
+ var innerAddress : Inner {
91
+ unsafeAddress {
92
+ fakePointer
93
+ }
94
+ }
95
+ /* TODO: rdar://137608270 Add Builtin.addressof() support for @addressable arguments
96
+ @addressableSelf
97
+ var innerAddress: Inner {
98
+ unsafeAddress {
99
+ Builtin.addressof(inner)
100
+ }
101
+ }
102
+ */
103
+ }
104
+
77
105
func parse( _ span: Span < Int > ) { }
78
106
79
107
// =============================================================================
@@ -172,3 +200,17 @@ func testTrivialScope<T>(a: Array<T>) -> Span<T> {
172
200
// expected-note @-3{{it depends on the lifetime of variable 'p'}}
173
201
// expected-note @-3{{this use causes the lifetime-dependent value to escape}}
174
202
}
203
+
204
+ // =============================================================================
205
+ // Scoped dependence on property access
206
+ // =============================================================================
207
+
208
+ @lifetime ( borrow outer)
209
+ func testBorrowComponent( outer: Outer ) -> Span < Int > {
210
+ outer. inner. span ( )
211
+ }
212
+
213
+ @lifetime ( borrow outer)
214
+ func testBorrowAddressComponent( outer: Outer ) -> Span < Int > {
215
+ outer. innerAddress. span ( )
216
+ }
You can’t perform that action at this time.
0 commit comments