@@ -9,6 +9,11 @@ class Klass {
9
9
10
10
}
11
11
12
+ enum EitherNoneOrAnyObject {
13
+ case none
14
+ case any(AnyObject)
15
+ }
16
+
12
17
struct NonTrivialStruct {
13
18
var val:Klass
14
19
}
@@ -658,7 +663,7 @@ bb4(%3 : @owned $Klass):
658
663
sil [ossa] @looping_borrow : $@convention(thin) () -> () {
659
664
entry:
660
665
%instance_1 = enum $FakeOptional<Klass>, #FakeOptional.none!enumelt
661
- %lifetime_1 = begin_borrow [lexical] %instance_1 : $FakeOptional<Klass>
666
+ %lifetime_1 = begin_borrow %instance_1 : $FakeOptional<Klass>
662
667
br loop_entry(%instance_1 : $FakeOptional<Klass>, %lifetime_1 : $FakeOptional<Klass>)
663
668
664
669
loop_entry(%18 : @owned $FakeOptional<Klass>, %19 : @guaranteed $FakeOptional<Klass>):
@@ -684,11 +689,11 @@ exit:
684
689
// CHECK: bb0({{%[^,]+}} : $Builtin.Int1, [[INSTANCE_1:%[^,]+]] : @owned $Klass, {{%[^,]+}} : @owned $Klass):
685
690
// CHECK: [[LIFETIME_1:%[^,]+]] = begin_borrow [[INSTANCE_1]]
686
691
// CHECK: copy_value [[LIFETIME_1]]
687
- // CHECK: cond_br {{%[^,]+}}, [[BASIC_BLOCK1 :bb[0-9]+]], [[BASIC_BLOCK2 :bb[0-9]+]]
688
- // CHECK: [[BASIC_BLOCK1 ]]:
692
+ // CHECK: cond_br {{%[^,]+}}, [[LEFT :bb[0-9]+]], [[RIGHT :bb[0-9]+]]
693
+ // CHECK: [[LEFT ]]:
689
694
// CHECK: end_borrow [[LIFETIME_1]]
690
695
// CHECK: destroy_value [[INSTANCE_1]]
691
- // CHECK: [[BASIC_BLOCK2 ]]:
696
+ // CHECK: [[RIGHT ]]:
692
697
// CHECK: end_borrow [[LIFETIME_1]]
693
698
// CHECK: destroy_value [[INSTANCE_1]]
694
699
// CHECK-LABEL: } // end sil function 'add_end_borrow_after_destroy_value'
@@ -720,3 +725,216 @@ bb3(%original : @owned $Klass, %lifetime : @guaranteed $Klass):
720
725
%result = tuple ()
721
726
return %result : $()
722
727
}
728
+
729
+ // CHECK-LABEL: sil [ossa] @borrow_none : {{.*}} {
730
+ // 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: [[EXIT]]:
740
+ // CHECK: [[RETVAL:%[^,]+]] = tuple ()
741
+ // CHECK: return [[RETVAL]] : $()
742
+ // CHECK-LABEL: } // end sil function 'borrow_none'
743
+ sil [ossa] @borrow_none : $@convention(thin) () -> () {
744
+ entry:
745
+ %outer_lifetime_1 = enum $FakeOptional<Klass>, #FakeOptional.none!enumelt
746
+ switch_enum %outer_lifetime_1 : $FakeOptional<Klass>, case #FakeOptional.some!enumelt: work, case #FakeOptional.none!enumelt: to_exit, forwarding: @guaranteed
747
+ to_exit:
748
+ br exit
749
+ work(%outer_lifetime_2 : @guaranteed $Klass):
750
+ %inner_lifetime_1 = begin_borrow %outer_lifetime_2 : $Klass
751
+ end_borrow %inner_lifetime_1 : $Klass
752
+ br exit
753
+ exit:
754
+ %retval = tuple ()
755
+ return %retval : $()
756
+ }
757
+
758
+ // CHECK-LABEL: sil [ossa] @reborrowed_begin_borrow : {{.*}} {
759
+ // CHECK: {{bb[0-9]+}}([[INSTANCE:%[^,]+]] : @owned $Klass):
760
+ // CHECK: [[OUTER_LIFETIME_1:%[^,]+]] = begin_borrow [[INSTANCE]]
761
+ // CHECK: br [[EXIT:bb[0-9]+]]([[OUTER_LIFETIME_1]] : $Klass)
762
+ // CHECK: [[EXIT]]([[OUTER_LIFETIME_2:%[^,]+]] : @guaranteed $Klass):
763
+ // CHECK: end_borrow [[OUTER_LIFETIME_2]]
764
+ // CHECK: destroy_value [[INSTANCE]]
765
+ // CHECK: [[RETVAL:%[^,]+]] = tuple ()
766
+ // CHECK: return [[RETVAL]]
767
+ // CHECK-LABEL: } // end sil function 'reborrowed_begin_borrow'
768
+ sil [ossa] @reborrowed_begin_borrow : $@convention(thin) (@owned Klass) -> () {
769
+ entry(%instance : @owned $Klass):
770
+ %outer_lifetime_1 = begin_borrow %instance : $Klass
771
+ %inner_lifetime_1 = begin_borrow %outer_lifetime_1 : $Klass
772
+ br exit(%outer_lifetime_1 : $Klass, %inner_lifetime_1 : $Klass)
773
+ exit(%outer_lifetime_2 : @guaranteed $Klass, %inner_lifetime_2 : @guaranteed $Klass):
774
+ end_borrow %inner_lifetime_2 : $Klass
775
+ end_borrow %outer_lifetime_2 : $Klass
776
+ destroy_value %instance : $Klass
777
+ %retval = tuple ()
778
+ return %retval : $()
779
+ }
780
+
781
+ // CHECK-LABEL: sil [ossa] @reborrowed_guaranteed_phi : {{.*}} {
782
+ // CHECK: {{bb[0-9]+}}([[INSTANCE:%[^,]+]] : @owned $Klass):
783
+ // CHECK: [[LIFETIME:%[^,]+]] = begin_borrow [[INSTANCE]]
784
+ // CHECK: br [[WORK:bb[0-9]+]]([[LIFETIME]] : $Klass)
785
+ // CHECK: [[WORK]]([[LIFETIME_1:%[^,]+]] : @guaranteed $Klass):
786
+ // CHECK: br [[EXIT:bb[0-9]+]]([[LIFETIME_1]] : $Klass)
787
+ // CHECK: [[EXIT]]([[LIFETIME_2:%[^,]+]] : @guaranteed $Klass):
788
+ // CHECK: end_borrow [[LIFETIME_2]]
789
+ // CHECK: destroy_value [[INSTANCE]]
790
+ // CHECK: [[RETVAL:%[^,]+]] = tuple ()
791
+ // CHECK: return [[RETVAL]] : $()
792
+ // CHECK-LABEL: } // end sil function 'reborrowed_guaranteed_phi'
793
+ sil [ossa] @reborrowed_guaranteed_phi : $@convention(thin) (@owned Klass) -> () {
794
+ entry(%instance : @owned $Klass):
795
+ %outer_lifetime_1 = begin_borrow %instance : $Klass
796
+ br work(%outer_lifetime_1 : $Klass)
797
+ work(%outer_lifetime_2 : @guaranteed $Klass):
798
+ %inner_lifetime_1 = begin_borrow %outer_lifetime_2 : $Klass
799
+ br exit(%outer_lifetime_2 : $Klass, %inner_lifetime_1 : $Klass)
800
+ exit(%outer_lifetime_3 : @guaranteed $Klass, %inner_lifetime_2 : @guaranteed $Klass):
801
+ end_borrow %inner_lifetime_2 : $Klass
802
+ end_borrow %outer_lifetime_3 : $Klass
803
+ destroy_value %instance : $Klass
804
+ %retval = tuple ()
805
+ return %retval : $()
806
+ }
807
+
808
+ // CHECK-LABEL: sil [ossa] @reborrow_guaranteed_phi2 : {{.*}} {
809
+ // CHECK: {{bb[0-9]+}}([[EITHER:%[^,]+]] : @owned $EitherNoneOrAnyObject):
810
+ // CHECK: [[BORROW_EITHER:%[^,]+]] = begin_borrow [[EITHER]]
811
+ // 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
+ // CHECK: [[SOME_BLOCK]]([[PAYLOAD:%[^,]+]] : @guaranteed $AnyObject):
813
+ // CHECK: [[LIFETIME:%[^,]+]] = begin_borrow [[PAYLOAD]]
814
+ // CHECK: end_borrow [[LIFETIME]]
815
+ // CHECK: end_borrow [[BORROW_EITHER]]
816
+ // CHECK: destroy_value [[EITHER]]
817
+ // CHECK: br [[EXIT:bb[0-9]+]]
818
+ // CHECK: [[NONE_BLOCK]]:
819
+ // CHECK: end_borrow [[BORROW_EITHER]]
820
+ // CHECK: destroy_value [[EITHER]]
821
+ // CHECK: br [[EXIT]]
822
+ // CHECK: [[EXIT]]:
823
+ // CHECK: [[RETVAL:%[^,]+]] = tuple ()
824
+ // CHECK: return [[RETVAL]]
825
+ // CHECK-LABEL: } // end sil function 'reborrow_guaranteed_phi2'
826
+ sil [ossa] @reborrow_guaranteed_phi2 : $@convention(thin) (@owned EitherNoneOrAnyObject) -> () {
827
+ entry(%0 : @owned $EitherNoneOrAnyObject):
828
+ %borrow_either = begin_borrow %0 : $EitherNoneOrAnyObject
829
+ switch_enum %borrow_either : $EitherNoneOrAnyObject, case #EitherNoneOrAnyObject.none!enumelt: none_block, case #EitherNoneOrAnyObject.any!enumelt: any_block
830
+ any_block(%borrow : @guaranteed $AnyObject):
831
+ %2 = begin_borrow %borrow : $AnyObject
832
+ end_borrow %2 : $AnyObject
833
+ end_borrow %borrow_either : $EitherNoneOrAnyObject
834
+ destroy_value %0 : $EitherNoneOrAnyObject
835
+ br exit
836
+ none_block:
837
+ end_borrow %borrow_either : $EitherNoneOrAnyObject
838
+ destroy_value %0 : $EitherNoneOrAnyObject
839
+ br exit
840
+ exit:
841
+ %retval = tuple ()
842
+ return %retval : $()
843
+ }
844
+
845
+ // CHECK-LABEL: sil [ossa] @reborrow_load_borrow : {{.*}} {
846
+ // CHECK: {{bb[0-9]+}}([[INSTANCE:%[^,]+]] : $*Klass):
847
+ // CHECK: [[LIFETIME:%[^,]+]] = load_borrow [[INSTANCE]]
848
+ // CHECK: br [[BASIC_BLOCK1:bb[0-9]+]]([[LIFETIME]] : $Klass)
849
+ // CHECK: [[BASIC_BLOCK1]]([[LIFETIME_2:%[^,]+]] : @guaranteed $Klass):
850
+ // CHECK: end_borrow [[LIFETIME_2]]
851
+ // CHECK: [[RETVAL:%[^,]+]] = tuple ()
852
+ // CHECK: return [[RETVAL]]
853
+ // CHECK-LABEL: } // end sil function 'reborrow_load_borrow'
854
+ sil [ossa] @reborrow_load_borrow : $@convention(method) (@in Klass) -> () {
855
+ bb0(%0 : $*Klass):
856
+ %1 = load_borrow %0 : $*Klass
857
+ %2 = begin_borrow %1 : $Klass
858
+ br bb1(%1 : $Klass, %2 : $Klass)
859
+ bb1(%4 : @guaranteed $Klass, %5 : @guaranteed $Klass):
860
+ end_borrow %5 : $Klass
861
+ end_borrow %4 : $Klass
862
+ %8 = tuple ()
863
+ return %8 : $()
864
+ }
865
+
866
+ // CHECK-LABEL: sil [ossa] @reborrow_load_borrow2 : {{.*}} {
867
+ // CHECK: {{bb[0-9]+}}([[ADDR:%[^,]+]] : $*Klass):
868
+ // CHECK: [[LIFETIME:%[^,]+]] = load_borrow [[ADDR]] : $*Klass
869
+ // CHECK: br [[EXIT:bb[0-9]+]]([[LIFETIME]] : $Klass)
870
+ // CHECK: [[EXIT]]([[LIFETIME_2:%[^,]+]] : @guaranteed $Klass):
871
+ // CHECK: end_borrow [[LIFETIME_2]] : $Klass
872
+ // CHECK: [[EXIT:%[^,]+]] = tuple ()
873
+ // CHECK: return [[EXIT]] : $()
874
+ // CHECK-LABEL: } // end sil function 'reborrow_load_borrow2'
875
+ sil [ossa] @reborrow_load_borrow2 : $@convention(method) (@in Klass) -> () {
876
+ bb0(%0 : $*Klass):
877
+ %1 = load_borrow %0 : $*Klass
878
+ %2 = begin_borrow %1 : $Klass
879
+ br bb1(%2 : $Klass, %1 : $Klass)
880
+ bb1(%4 : @guaranteed $Klass, %5 : @guaranteed $Klass):
881
+ end_borrow %4 : $Klass
882
+ end_borrow %5 : $Klass
883
+ %8 = tuple ()
884
+ return %8 : $()
885
+ }
886
+
887
+
888
+ // CHECK-LABEL: sil [ossa] @borrow_guaranteed_tuple : {{.*}} {
889
+ // CHECK: {{bb[0-9]+}}([[INSTANCE_1:%[^,]+]] : @owned $Klass, [[INSTANCE_2:%[^,]+]] : @owned $Klass):
890
+ // CHECK: [[LIFETIME_1_1:%[^,]+]] = begin_borrow [[INSTANCE_1]]
891
+ // CHECK: [[LIFETIME_2_1:%[^,]+]] = begin_borrow [[INSTANCE_2]]
892
+ // CHECK: br [[EXIT:bb[0-9]+]]([[LIFETIME_1_1]] : $Klass, [[LIFETIME_2_1]] : $Klass)
893
+ // CHECK: [[EXIT]]([[LIFETIME_1_2:%[^,]+]] : @guaranteed $Klass, [[LIFETIME_2_2:%[^,]+]] : @guaranteed $Klass):
894
+ // CHECK: end_borrow [[LIFETIME_2_2]]
895
+ // CHECK: destroy_value [[INSTANCE_2]]
896
+ // CHECK: end_borrow [[LIFETIME_1_2]]
897
+ // CHECK: destroy_value [[INSTANCE_1]]
898
+ // CHECK: [[RETVAL:%[^,]+]] = tuple ()
899
+ // CHECK: return [[RETVAL]] : $()
900
+ // CHECK-LABEL: } // end sil function 'borrow_guaranteed_tuple'
901
+ sil [ossa] @borrow_guaranteed_tuple : $@convention(thin) (@owned Klass, @owned Klass) -> () {
902
+ entry(%instance_1 : @owned $Klass, %instance_2 : @owned $Klass):
903
+ %lifetime_1_1 = begin_borrow %instance_1 : $Klass
904
+ %lifetime_2_1 = begin_borrow %instance_2 : $Klass
905
+ %tuple = tuple $(Klass, Klass) (%lifetime_1_1, %lifetime_2_1)
906
+ %tuple_lifetime_1 = begin_borrow %tuple : $(Klass, Klass)
907
+ br exit(%lifetime_1_1 : $Klass, %lifetime_2_1 : $Klass, %tuple_lifetime_1 : $(Klass, Klass))
908
+ exit(%lifetime_1_2 : @guaranteed $Klass, %lifetime_2_2 : @guaranteed $Klass, %tuple_lifetime_2 : @guaranteed $(Klass, Klass)):
909
+ end_borrow %tuple_lifetime_2 : $(Klass, Klass)
910
+ end_borrow %lifetime_2_2 : $Klass
911
+ destroy_value %instance_2 : $Klass
912
+ end_borrow %lifetime_1_2 : $Klass
913
+ destroy_value %instance_1 : $Klass
914
+ %retval = tuple ()
915
+ return %retval : $()
916
+ }
917
+
918
+ // CHECK-LABEL: sil [ossa] @borrow_guaranteed_struct : {{.*}} {
919
+ // CHECK: {{bb[0-9]+}}([[INSTANCE:%[^,]+]] : @owned $Klass):
920
+ // CHECK: [[LIFETIME:%[^,]+]] = begin_borrow [[INSTANCE]]
921
+ // CHECK: br bb1([[LIFETIME]] : $Klass)
922
+ // CHECK: bb1([[LIFETIME_2:%[^,]+]] : @guaranteed $Klass):
923
+ // CHECK: end_borrow [[LIFETIME_2]]
924
+ // CHECK: destroy_value [[INSTANCE]]
925
+ // CHECK: [[RETVAL:%[^,]+]] = tuple ()
926
+ // CHECK: return [[RETVAL]] : $()
927
+ // CHECK-LABEL: } // end sil function 'borrow_guaranteed_struct'
928
+ sil [ossa] @borrow_guaranteed_struct : $@convention(thin) (@owned Klass) -> () {
929
+ entry(%instance_1 : @owned $Klass):
930
+ %lifetime_1 = begin_borrow %instance_1 : $Klass
931
+ %struct = struct $NonTrivialStruct (%lifetime_1 : $Klass)
932
+ %struct_lifetime_1 = begin_borrow %struct : $NonTrivialStruct
933
+ br exit(%lifetime_1 : $Klass, %struct_lifetime_1 : $NonTrivialStruct)
934
+ exit(%lifetime_2 : @guaranteed $Klass, %struct_lifetime_2 : @guaranteed $NonTrivialStruct):
935
+ end_borrow %struct_lifetime_2 : $NonTrivialStruct
936
+ end_borrow %lifetime_2 : $Klass
937
+ destroy_value %instance_1 : $Klass
938
+ %retval = tuple ()
939
+ return %retval : $()
940
+ }
0 commit comments