@@ -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,23 @@ exit:
845
844
return %retval : $()
846
845
}
847
846
847
+ // CHECK-LABEL: sil [ossa] @reborrowed_guaranteed_phi3 :
848
+ // CHECK: begin_borrow
849
+ // CHECK-NOT: begin_borrow
850
+ // CHECK-LABEL: } // end sil function 'reborrowed_guaranteed_phi3'
851
+ sil [ossa] @reborrowed_guaranteed_phi3 : $@convention(thin) (@owned Klass) -> () {
852
+ entry(%instance : @owned $Klass):
853
+ %outer_lifetime_1 = begin_borrow %instance : $Klass
854
+ %inner_lifetime_1 = begin_borrow %outer_lifetime_1 : $Klass
855
+ br exit(%inner_lifetime_1 : $Klass)
856
+ exit(%inner_lifetime_2 : @guaranteed $Klass):
857
+ end_borrow %inner_lifetime_2 : $Klass
858
+ end_borrow %outer_lifetime_1 : $Klass
859
+ destroy_value %instance : $Klass
860
+ %retval = tuple ()
861
+ return %retval : $()
862
+ }
863
+
848
864
// CHECK-LABEL: sil [ossa] @reborrow_load_borrow : {{.*}} {
849
865
// CHECK: {{bb[0-9]+}}([[INSTANCE:%[^,]+]] : $*Klass):
850
866
// CHECK: [[LIFETIME:%[^,]+]] = load_borrow [[INSTANCE]]
@@ -890,13 +906,7 @@ bb1(%4 : @guaranteed $Klass, %5 : @guaranteed $Klass):
890
906
891
907
// CHECK-LABEL: sil [ossa] @borrow_guaranteed_tuple : {{.*}} {
892
908
// CHECK: {{bb[0-9]+}}([[INSTANCE_1:%[^,]+]] : @owned $Klass, [[INSTANCE_2:%[^,]+]] : @owned $Klass):
893
- // CHECK: [[LIFETIME_1_1:%[^,]+]] = begin_borrow [[INSTANCE_1]]
894
- // CHECK: [[LIFETIME_2_1:%[^,]+]] = begin_borrow [[INSTANCE_2]]
895
- // CHECK: br [[EXIT:bb[0-9]+]]([[LIFETIME_1_1]] : $Klass, [[LIFETIME_2_1]] : $Klass)
896
- // CHECK: [[EXIT]]([[LIFETIME_1_2:%[^,]+]] : @guaranteed $Klass, [[LIFETIME_2_2:%[^,]+]] : @guaranteed $Klass):
897
- // CHECK: end_borrow [[LIFETIME_2_2]]
898
909
// CHECK: destroy_value [[INSTANCE_2]]
899
- // CHECK: end_borrow [[LIFETIME_1_2]]
900
910
// CHECK: destroy_value [[INSTANCE_1]]
901
911
// CHECK: [[RETVAL:%[^,]+]] = tuple ()
902
912
// CHECK: return [[RETVAL]] : $()
@@ -906,10 +916,8 @@ entry(%instance_1 : @owned $Klass, %instance_2 : @owned $Klass):
906
916
%lifetime_1_1 = begin_borrow %instance_1 : $Klass
907
917
%lifetime_2_1 = begin_borrow %instance_2 : $Klass
908
918
%tuple = tuple $(Klass, Klass) (%lifetime_1_1, %lifetime_2_1)
909
- %tuple_lifetime_1 = begin_borrow %tuple : $(Klass, Klass)
910
- br exit(%lifetime_1_1 : $Klass, %lifetime_2_1 : $Klass, %tuple_lifetime_1 : $(Klass, Klass))
911
- exit(%lifetime_1_2 : @guaranteed $Klass, %lifetime_2_2 : @guaranteed $Klass, %tuple_lifetime_2 : @guaranteed $(Klass, Klass)):
912
- end_borrow %tuple_lifetime_2 : $(Klass, Klass)
919
+ br exit(%lifetime_1_1 : $Klass, %lifetime_2_1 : $Klass, %tuple : $(Klass, Klass))
920
+ exit(%lifetime_1_2 : @guaranteed $Klass, %lifetime_2_2 : @guaranteed $Klass, %tuple_2 : @guaranteed $(Klass, Klass)):
913
921
end_borrow %lifetime_2_2 : $Klass
914
922
destroy_value %instance_2 : $Klass
915
923
end_borrow %lifetime_1_2 : $Klass
@@ -920,10 +928,6 @@ exit(%lifetime_1_2 : @guaranteed $Klass, %lifetime_2_2 : @guaranteed $Klass, %tu
920
928
921
929
// CHECK-LABEL: sil [ossa] @borrow_guaranteed_struct : {{.*}} {
922
930
// CHECK: {{bb[0-9]+}}([[INSTANCE:%[^,]+]] : @owned $Klass):
923
- // CHECK: [[LIFETIME:%[^,]+]] = begin_borrow [[INSTANCE]]
924
- // CHECK: br bb1([[LIFETIME]] : $Klass)
925
- // CHECK: bb1([[LIFETIME_2:%[^,]+]] : @guaranteed $Klass):
926
- // CHECK: end_borrow [[LIFETIME_2]]
927
931
// CHECK: destroy_value [[INSTANCE]]
928
932
// CHECK: [[RETVAL:%[^,]+]] = tuple ()
929
933
// CHECK: return [[RETVAL]] : $()
@@ -932,10 +936,8 @@ sil [ossa] @borrow_guaranteed_struct : $@convention(thin) (@owned Klass) -> () {
932
936
entry(%instance_1 : @owned $Klass):
933
937
%lifetime_1 = begin_borrow %instance_1 : $Klass
934
938
%struct = struct $NonTrivialStruct (%lifetime_1 : $Klass)
935
- %struct_lifetime_1 = begin_borrow %struct : $NonTrivialStruct
936
- br exit(%lifetime_1 : $Klass, %struct_lifetime_1 : $NonTrivialStruct)
937
- exit(%lifetime_2 : @guaranteed $Klass, %struct_lifetime_2 : @guaranteed $NonTrivialStruct):
938
- end_borrow %struct_lifetime_2 : $NonTrivialStruct
939
+ br exit(%lifetime_1 : $Klass, %struct : $NonTrivialStruct)
940
+ exit(%lifetime_2 : @guaranteed $Klass, %struct_2 : @guaranteed $NonTrivialStruct):
939
941
end_borrow %lifetime_2 : $Klass
940
942
destroy_value %instance_1 : $Klass
941
943
%retval = tuple ()
@@ -998,3 +1000,50 @@ bb1(%21 : $@noescape @callee_guaranteed () -> (), %22 : @guaranteed $@callee_gua
998
1000
%28 = tuple ()
999
1001
return %28: $()
1000
1002
}
1003
+
1004
+ sil @use_klass : $@convention(thin) (@guaranteed Klass) -> ()
1005
+
1006
+ sil [ossa] @test_forwarded_phi4 : $@convention(thin) (@owned Wrapper1) -> () {
1007
+ bb0(%0 : @owned $Wrapper1):
1008
+ %outer = begin_borrow %0 : $Wrapper1
1009
+ br bb1
1010
+
1011
+ bb1:
1012
+ %ex1 = struct_extract %outer : $Wrapper1, #Wrapper1.val1
1013
+ br bb2(%ex1 : $Wrapper2, %outer : $Wrapper1)
1014
+
1015
+ bb2(%phi1 : @guaranteed $Wrapper2, %phi2 : @guaranteed $Wrapper1):
1016
+ %ex2 = struct_extract %phi1 : $Wrapper2, #Wrapper2.val2
1017
+ br bb3(%ex2 : $Klass, %phi2 : $Wrapper1)
1018
+
1019
+ bb3(%phi3 : @guaranteed $Klass, %phi4 : @guaranteed $Wrapper1):
1020
+ %f = function_ref @use_klass : $@convention(thin) (@guaranteed Klass) -> ()
1021
+ apply %f(%phi3) : $@convention(thin) (@guaranteed Klass) -> ()
1022
+ end_borrow %phi4 : $Wrapper1
1023
+ destroy_value %0 : $Wrapper1
1024
+ %9999 = tuple()
1025
+ return %9999 : $()
1026
+ }
1027
+
1028
+ sil [ossa] @test_loadborrow_dep : $@convention(thin) (@in Wrapper1) -> () {
1029
+ bb0(%0 : $*Wrapper1):
1030
+ %outer = load_borrow %0 : $*Wrapper1
1031
+ br bb1
1032
+
1033
+ bb1:
1034
+ %ex1 = struct_extract %outer : $Wrapper1, #Wrapper1.val1
1035
+ br bb2(%ex1 : $Wrapper2, %outer : $Wrapper1)
1036
+
1037
+ bb2(%phi1 : @guaranteed $Wrapper2, %phi2 : @guaranteed $Wrapper1):
1038
+ %ex2 = struct_extract %phi1 : $Wrapper2, #Wrapper2.val2
1039
+ br bb3(%ex2 : $Klass, %phi2 : $Wrapper1)
1040
+
1041
+ bb3(%phi3 : @guaranteed $Klass, %phi4 : @guaranteed $Wrapper1):
1042
+ %f = function_ref @use_klass : $@convention(thin) (@guaranteed Klass) -> ()
1043
+ apply %f(%phi3) : $@convention(thin) (@guaranteed Klass) -> ()
1044
+ end_borrow %phi4 : $Wrapper1
1045
+ destroy_addr %0 : $*Wrapper1
1046
+ %9999 = tuple()
1047
+ return %9999 : $()
1048
+ }
1049
+
0 commit comments