@@ -718,6 +718,65 @@ bb2:
718
718
return %9999 : $()
719
719
}
720
720
721
+ // Don't remove a retain of an AnyObject which comes from a metatype.
722
+ //
723
+ // CHECK-LABEL: sil @conditional_metatype_cast
724
+ // CHECK: bb2([[ARG:%[0-9]+]] : $AnyObject):
725
+ // CHECK: strong_retain [[ARG]]
726
+ // CHECK: checked_cast_addr_br
727
+ // CHECK: } // end sil function 'conditional_metatype_cast'
728
+ sil @conditional_metatype_cast : $@convention(thin) () -> AnyObject {
729
+ bb0:
730
+ %0 = metatype $@thick Int.Type
731
+ checked_cast_br %0 : $@thick Int.Type to AnyObject, bb2, bb1
732
+
733
+ bb1:
734
+ unreachable
735
+
736
+ bb2(%6 : $AnyObject):
737
+ strong_retain %6 : $AnyObject
738
+ %9 = alloc_stack $AnyObject
739
+ store %6 to %9 : $*AnyObject
740
+ %11 = alloc_stack $@thick Int.Type
741
+ checked_cast_addr_br take_always AnyObject in %9 : $*AnyObject to Int.Type in %11 : $*@thick Int.Type, bb3, bb4
742
+
743
+ bb3:
744
+ dealloc_stack %11 : $*@thick Int.Type
745
+ dealloc_stack %9 : $*AnyObject
746
+ return %6 : $AnyObject
747
+
748
+ bb4:
749
+ unreachable
750
+ }
751
+
752
+ // Don't remove a retain of an AnyObject which comes from a metatype.
753
+ //
754
+ // CHECK-LABEL: sil @unconditional_metatype_cast
755
+ // CHECK: [[O:%[0-9]+]] = unconditional_checked_cast
756
+ // CHECK: strong_retain [[O]]
757
+ // CHECK: checked_cast_addr_br
758
+ // CHECK: } // end sil function 'unconditional_metatype_cast'
759
+ sil @unconditional_metatype_cast : $@convention(thin) () -> AnyObject {
760
+ bb0:
761
+ %0 = metatype $@thick Int.Type
762
+ %6 = unconditional_checked_cast %0 : $@thick Int.Type to AnyObject
763
+ strong_retain %6 : $AnyObject
764
+ %9 = alloc_stack $AnyObject
765
+ store %6 to %9 : $*AnyObject
766
+ %11 = alloc_stack $@thick Int.Type
767
+ checked_cast_addr_br take_always AnyObject in %9 : $*AnyObject to Int.Type in %11 : $*@thick Int.Type, bb3, bb4
768
+
769
+ bb3:
770
+ dealloc_stack %11 : $*@thick Int.Type
771
+ dealloc_stack %9 : $*AnyObject
772
+ return %6 : $AnyObject
773
+
774
+ bb4:
775
+ unreachable
776
+ }
777
+
778
+
779
+
721
780
// Hoist releases above dealloc_stack
722
781
// CHECK-LABEL: sil @testReleaseHoistDeallocStack : $@convention(thin) (AnyObject) -> () {
723
782
// CHECK: bb0(%0 : $AnyObject):
0 commit comments