@@ -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,84 @@ 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
+ // CHECK-LABEL: sil [ossa] @test_forwarded_phi1 :
1007
+ // CHECK: br bb3
1008
+ // CHECK: end_borrow
1009
+ // CHECK-LABEL: } // end sil function 'test_forwarded_phi1'
1010
+ sil [ossa] @test_forwarded_phi1 : $@convention(thin) (@owned Wrapper1) -> () {
1011
+ bb0(%0 : @owned $Wrapper1):
1012
+ %outer = begin_borrow %0 : $Wrapper1
1013
+ br bb1
1014
+
1015
+ bb1:
1016
+ %ex1 = struct_extract %outer : $Wrapper1, #Wrapper1.val1
1017
+ br bb2(%ex1 : $Wrapper2, %outer : $Wrapper1)
1018
+
1019
+ bb2(%phi1 : @guaranteed $Wrapper2, %phi2 : @guaranteed $Wrapper1):
1020
+ %ex2 = struct_extract %phi1 : $Wrapper2, #Wrapper2.val2
1021
+ br bb3(%ex2 : $Klass, %phi2 : $Wrapper1)
1022
+
1023
+ bb3(%phi3 : @guaranteed $Klass, %phi4 : @guaranteed $Wrapper1):
1024
+ %f = function_ref @use_klass : $@convention(thin) (@guaranteed Klass) -> ()
1025
+ apply %f(%phi3) : $@convention(thin) (@guaranteed Klass) -> ()
1026
+ end_borrow %phi4 : $Wrapper1
1027
+ destroy_value %0 : $Wrapper1
1028
+ %9999 = tuple()
1029
+ return %9999 : $()
1030
+ }
1031
+
1032
+ // CHECK-LABEL: sil [ossa] @test_forwarded_phi2 :
1033
+ // CHECK: br bb3
1034
+ // CHECK: end_borrow
1035
+ // CHECK-LABEL: } // end sil function 'test_forwarded_phi2'
1036
+ sil [ossa] @test_forwarded_phi2 : $@convention(thin) (@owned Wrapper1) -> () {
1037
+ bb0(%0 : @owned $Wrapper1):
1038
+ %outer = begin_borrow %0 : $Wrapper1
1039
+ br bb1
1040
+
1041
+ bb1:
1042
+ br bb2(%outer : $Wrapper1)
1043
+
1044
+ bb2(%phi1 : @guaranteed $Wrapper1):
1045
+ %ex1 = struct_extract %phi1 : $Wrapper1, #Wrapper1.val1 // user: %4
1046
+ %ex2 = struct_extract %ex1 : $Wrapper2, #Wrapper2.val2
1047
+ br bb3(%ex2 : $Klass, %phi1 : $Wrapper1)
1048
+
1049
+ bb3(%phi2 : @guaranteed $Klass, %phi3 : @guaranteed $Wrapper1):
1050
+ %f = function_ref @use_klass : $@convention(thin) (@guaranteed Klass) -> ()
1051
+ apply %f(%phi2) : $@convention(thin) (@guaranteed Klass) -> ()
1052
+ end_borrow %phi3 : $Wrapper1
1053
+ destroy_value %0 : $Wrapper1
1054
+ %9999 = tuple()
1055
+ return %9999 : $()
1056
+ }
1057
+
1058
+ // CHECK-LABEL: sil [ossa] @test_loadborrow_dep :
1059
+ // CHECK: br bb3
1060
+ // CHECK: end_borrow
1061
+ // CHECK-LABEL: } // end sil function 'test_loadborrow_dep'
1062
+ sil [ossa] @test_loadborrow_dep : $@convention(thin) (@in Wrapper1) -> () {
1063
+ bb0(%0 : $*Wrapper1):
1064
+ %outer = load_borrow %0 : $*Wrapper1
1065
+ br bb1
1066
+
1067
+ bb1:
1068
+ %ex1 = struct_extract %outer : $Wrapper1, #Wrapper1.val1
1069
+ br bb2(%ex1 : $Wrapper2, %outer : $Wrapper1)
1070
+
1071
+ bb2(%phi1 : @guaranteed $Wrapper2, %phi2 : @guaranteed $Wrapper1):
1072
+ %ex2 = struct_extract %phi1 : $Wrapper2, #Wrapper2.val2
1073
+ br bb3(%ex2 : $Klass, %phi2 : $Wrapper1)
1074
+
1075
+ bb3(%phi3 : @guaranteed $Klass, %phi4 : @guaranteed $Wrapper1):
1076
+ %f = function_ref @use_klass : $@convention(thin) (@guaranteed Klass) -> ()
1077
+ apply %f(%phi3) : $@convention(thin) (@guaranteed Klass) -> ()
1078
+ end_borrow %phi4 : $Wrapper1
1079
+ destroy_addr %0 : $*Wrapper1
1080
+ %9999 = tuple()
1081
+ return %9999 : $()
1082
+ }
1083
+
0 commit comments