@@ -718,6 +718,65 @@ bb2:
718718 return %9999 : $()
719719}
720720
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+
721780// Hoist releases above dealloc_stack
722781// CHECK-LABEL: sil @testReleaseHoistDeallocStack : $@convention(thin) (AnyObject) -> () {
723782// CHECK: bb0(%0 : $AnyObject):
0 commit comments