@@ -23,6 +23,14 @@ case none
23
23
case some(T)
24
24
}
25
25
26
+ struct Wrapper1 {
27
+ var val1: Wrapper2
28
+ }
29
+
30
+ struct Wrapper2 {
31
+ var val2: Klass
32
+ }
33
+
26
34
sil [ossa] @$testtryapplyklassgen : $@convention(thin) () -> (@owned Klass, @error any Error)
27
35
sil [ossa] @$use_klass1 : $@convention(thin) (@owned Klass) -> ()
28
36
sil [ossa] @$use_klass2 : $@convention(thin) (@guaranteed Klass) -> ()
@@ -728,17 +736,10 @@ bb3(%original : @owned $Klass, %lifetime : @guaranteed $Klass):
728
736
729
737
// CHECK-LABEL: sil [ossa] @borrow_none : {{.*}} {
730
738
// CHECK: {{bb[0-9]+}}:
731
- // CHECK: [[INSTANCE:%[^,]+]] = enum $FakeOptional<Klass>, #FakeOptional.none!enumelt
732
- // CHECK: switch_enum [[INSTANCE]] : $FakeOptional<Klass>, case #FakeOptional.some!enumelt: [[WORK:bb[0-9]+]], case #FakeOptional.none!enumelt: [[TO_EXIT:bb[0-9]+]], forwarding: @guaranteed
733
- // CHECK: [[TO_EXIT]]:
734
- // CHECK: br [[EXIT:bb[0-9]+]]
735
- // CHECK: [[WORK]]([[PAYLOAD:%[^,]+]] : @guaranteed $Klass):
736
- // CHECK: [[LIFETIME:%[^,]+]] = begin_borrow [[PAYLOAD]]
737
- // CHECK: end_borrow [[LIFETIME]]
738
- // CHECK: br [[EXIT]]
739
+ // CHECK-NEXT: br [[EXIT:bb[0-9]+]]
739
740
// CHECK: [[EXIT]]:
740
- // CHECK: [[RETVAL:%[^,]+]] = tuple ()
741
- // CHECK: return [[RETVAL]] : $()
741
+ // CHECK-NEXT: [[RETVAL:%[^,]+]] = tuple ()
742
+ // CHECK-NEXT: return [[RETVAL]] : $()
742
743
// CHECK-LABEL: } // end sil function 'borrow_none'
743
744
sil [ossa] @borrow_none : $@convention(thin) () -> () {
744
745
entry:
@@ -810,8 +811,6 @@ exit(%outer_lifetime_3 : @guaranteed $Klass, %inner_lifetime_2 : @guaranteed $Kl
810
811
// CHECK: [[BORROW_EITHER:%[^,]+]] = begin_borrow [[EITHER]]
811
812
// CHECK: switch_enum [[BORROW_EITHER]] : $EitherNoneOrAnyObject, case #EitherNoneOrAnyObject.none!enumelt: [[NONE_BLOCK:bb[0-9]+]], case #EitherNoneOrAnyObject.any!enumelt: [[SOME_BLOCK:bb[0-9]+]]
812
813
// CHECK: [[SOME_BLOCK]]([[PAYLOAD:%[^,]+]] : @guaranteed $AnyObject):
813
- // CHECK: [[LIFETIME:%[^,]+]] = begin_borrow [[PAYLOAD]]
814
- // CHECK: end_borrow [[LIFETIME]]
815
814
// CHECK: end_borrow [[BORROW_EITHER]]
816
815
// CHECK: destroy_value [[EITHER]]
817
816
// CHECK: br [[EXIT:bb[0-9]+]]
@@ -845,6 +844,18 @@ exit:
845
844
return %retval : $()
846
845
}
847
846
847
+ sil [ossa] @reborrowed_guaranteed_phi3 : $@convention(thin) (@owned Klass) -> () {
848
+ entry(%instance : @owned $Klass):
849
+ %outer_lifetime_1 = begin_borrow %instance : $Klass
850
+ %inner_lifetime_1 = begin_borrow %outer_lifetime_1 : $Klass
851
+ br exit(%inner_lifetime_1 : $Klass)
852
+ exit(%inner_lifetime_2 : @guaranteed $Klass):
853
+ end_borrow %inner_lifetime_2 : $Klass
854
+ end_borrow %outer_lifetime_1 : $Klass
855
+ destroy_value %instance : $Klass
856
+ %retval = tuple ()
857
+ return %retval : $()
858
+ }
848
859
// CHECK-LABEL: sil [ossa] @reborrow_load_borrow : {{.*}} {
849
860
// CHECK: {{bb[0-9]+}}([[INSTANCE:%[^,]+]] : $*Klass):
850
861
// CHECK: [[LIFETIME:%[^,]+]] = load_borrow [[INSTANCE]]
@@ -998,3 +1009,50 @@ bb1(%21 : $@noescape @callee_guaranteed () -> (), %22 : @guaranteed $@callee_gua
998
1009
%28 = tuple ()
999
1010
return %28: $()
1000
1011
}
1012
+
1013
+ sil @use_klass : $@convention(thin) (@guaranteed Klass) -> ()
1014
+
1015
+ sil [ossa] @test_forwarded_phi4 : $@convention(thin) (@owned Wrapper1) -> () {
1016
+ bb0(%0 : @owned $Wrapper1):
1017
+ %outer = begin_borrow %0 : $Wrapper1
1018
+ br bb1
1019
+
1020
+ bb1:
1021
+ %ex1 = struct_extract %outer : $Wrapper1, #Wrapper1.val1
1022
+ br bb2(%ex1 : $Wrapper2, %outer : $Wrapper1)
1023
+
1024
+ bb2(%phi1 : @guaranteed $Wrapper2, %phi2 : @guaranteed $Wrapper1):
1025
+ %ex2 = struct_extract %phi1 : $Wrapper2, #Wrapper2.val2
1026
+ br bb3(%ex2 : $Klass, %phi2 : $Wrapper1)
1027
+
1028
+ bb3(%phi3 : @guaranteed $Klass, %phi4 : @guaranteed $Wrapper1):
1029
+ %f = function_ref @use_klass : $@convention(thin) (@guaranteed Klass) -> ()
1030
+ apply %f(%phi3) : $@convention(thin) (@guaranteed Klass) -> ()
1031
+ end_borrow %phi4 : $Wrapper1
1032
+ destroy_value %0 : $Wrapper1
1033
+ %9999 = tuple()
1034
+ return %9999 : $()
1035
+ }
1036
+
1037
+ sil [ossa] @test_loadborrow_dep : $@convention(thin) (@in Wrapper1) -> () {
1038
+ bb0(%0 : $*Wrapper1):
1039
+ %outer = load_borrow %0 : $*Wrapper1
1040
+ br bb1
1041
+
1042
+ bb1:
1043
+ %ex1 = struct_extract %outer : $Wrapper1, #Wrapper1.val1
1044
+ br bb2(%ex1 : $Wrapper2, %outer : $Wrapper1)
1045
+
1046
+ bb2(%phi1 : @guaranteed $Wrapper2, %phi2 : @guaranteed $Wrapper1):
1047
+ %ex2 = struct_extract %phi1 : $Wrapper2, #Wrapper2.val2
1048
+ br bb3(%ex2 : $Klass, %phi2 : $Wrapper1)
1049
+
1050
+ bb3(%phi3 : @guaranteed $Klass, %phi4 : @guaranteed $Wrapper1):
1051
+ %f = function_ref @use_klass : $@convention(thin) (@guaranteed Klass) -> ()
1052
+ apply %f(%phi3) : $@convention(thin) (@guaranteed Klass) -> ()
1053
+ end_borrow %phi4 : $Wrapper1
1054
+ destroy_addr %0 : $*Wrapper1
1055
+ %9999 = tuple()
1056
+ return %9999 : $()
1057
+ }
1058
+
0 commit comments