File tree Expand file tree Collapse file tree 2 files changed +60
-0
lines changed
SwiftCompilerSources/Sources/SIL/Utilities Expand file tree Collapse file tree 2 files changed +60
-0
lines changed Original file line number Diff line number Diff line change @@ -535,6 +535,9 @@ public final class EnclosingValueIterator : IteratorProtocol {
535
535
// Recurse through guaranteed forwarding non-phi instructions.
536
536
let ops = forwardingInst. forwardedOperands
537
537
worklist. pushIfNotVisited ( contentsOf: ops. lazy. map { $0. value } )
538
+ } else if value. isGuaranteedApplyResult {
539
+ let selfArgument = ( value as! ApplyInst ) . arguments. last!
540
+ worklist. pushIfNotVisited ( selfArgument)
538
541
} else {
539
542
fatalError ( " cannot get borrow introducers for unknown guaranteed value " )
540
543
}
@@ -617,6 +620,19 @@ extension Value {
617
620
}
618
621
return self
619
622
}
623
+
624
+ public var isGuaranteedApplyResult : Bool {
625
+ guard let definingInstruction = self . definingInstruction else {
626
+ return false
627
+ }
628
+ guard let apply = definingInstruction as? ApplyInst else {
629
+ return false
630
+ }
631
+ guard apply. singleDirectResult != nil else {
632
+ return false
633
+ }
634
+ return apply. functionConvention. results [ 0 ] . convention == . guaranteed
635
+ }
620
636
}
621
637
622
638
extension Phi {
Original file line number Diff line number Diff line change @@ -300,3 +300,47 @@ bb2(%5 : @guaranteed $C):
300
300
return %0 : $C
301
301
}
302
302
303
+ class Klass {}
304
+
305
+ public struct Wrapper {
306
+ @_hasStorage var _k: Klass { get set }
307
+ var k: Klass
308
+ }
309
+
310
+ public struct GenWrapper<T> {
311
+ @_hasStorage var _prop: T { get set }
312
+ public var prop: T
313
+ }
314
+
315
+ // CHECK-LABEL: sil [ossa] @borrow_loadable_prop : $@convention(method) (@guaranteed Wrapper) -> @guaranteed Klass {
316
+ sil [ossa] @borrow_loadable_prop : $@convention(method) (@guaranteed Wrapper) -> @guaranteed Klass {
317
+ bb0(%0 : @guaranteed $Wrapper):
318
+ %2 = struct_extract %0, #Wrapper._k
319
+ return %2
320
+ }
321
+
322
+ // CHECK-LABEL: sil [ossa] @test_borrow_accessor :
323
+ // CHECK: bb3([[PHI:%.*]] : @guaranteed $Klass):
324
+ // CHECK: [[B:%.*]] = borrowed [[PHI]] : $Klass from (%1 : $Wrapper)
325
+ // CHECK-LABEL: } // end sil function 'test_borrow_accessor'
326
+ sil [ossa] @test_borrow_accessor : $@convention(thin) (@owned Wrapper) -> () {
327
+ bb0(%0 : @owned $Wrapper):
328
+ %1 = begin_borrow %0
329
+ %2 = function_ref @borrow_loadable_prop : $@convention(method) (@guaranteed Wrapper) -> @guaranteed Klass
330
+ cond_br undef, bb1, bb2
331
+
332
+ bb1:
333
+ %3 = apply %2(%1) : $@convention(method) (@guaranteed Wrapper) -> @guaranteed Klass
334
+ br bb3(%3)
335
+
336
+ bb2:
337
+ %5 = apply %2(%1) : $@convention(method) (@guaranteed Wrapper) -> @guaranteed Klass
338
+ br bb3(%5)
339
+
340
+ bb3(%7 : @guaranteed $Klass):
341
+ end_borrow %1
342
+ destroy_value %0
343
+ %t = tuple ()
344
+ return %t
345
+ }
346
+
You can’t perform that action at this time.
0 commit comments