@@ -488,3 +488,53 @@ bb0:
488488 dealloc_stack %1 : $*((), ())
489489 return %16 : $((), ())
490490}
491+
492+ // CHECK-LABEL: sil [ossa] @dont_optimize_optional_in_multiple_blocks :
493+ // CHECK: alloc_stack
494+ // CHECK: } // end sil function 'dont_optimize_optional_in_multiple_blocks'
495+ sil [ossa] @dont_optimize_optional_in_multiple_blocks : $@convention(method) (@guaranteed Optional<Klass>) -> () {
496+ bb0(%0 : @guaranteed $Optional<Klass>):
497+ %1 = copy_value %0 : $Optional<Klass>
498+ %32 = alloc_stack $Optional<Klass>
499+ store %1 to [init] %32 : $*Optional<Klass>
500+ switch_enum %0 : $Optional<Klass>, case #Optional.some!enumelt: bb6, case #Optional.none!enumelt: bb5
501+
502+ bb5:
503+ dealloc_stack %32 : $*Optional<Klass>
504+ br bb7
505+
506+ bb6(%50 : @guaranteed $Klass):
507+ %53 = load [take] %32 : $*Optional<Klass>
508+ destroy_value %53 : $Optional<Klass>
509+ dealloc_stack %32 : $*Optional<Klass>
510+ br bb7
511+
512+ bb7:
513+ %r = tuple ()
514+ return %r : $()
515+ }
516+
517+ // CHECK-LABEL: sil [ossa] @optimize_optional_in_single_block :
518+ // CHECK-NOT: alloc_stack
519+ // CHECK: } // end sil function 'optimize_optional_in_single_block'
520+ sil [ossa] @optimize_optional_in_single_block : $@convention(method) (@guaranteed Optional<Klass>) -> () {
521+ bb0(%0 : @guaranteed $Optional<Klass>):
522+ switch_enum %0 : $Optional<Klass>, case #Optional.some!enumelt: bb6, case #Optional.none!enumelt: bb5
523+
524+ bb5:
525+ br bb7
526+
527+ bb6(%50 : @guaranteed $Klass):
528+ %32 = alloc_stack $Optional<Klass>
529+ %1 = copy_value %0 : $Optional<Klass>
530+ store %1 to [init] %32 : $*Optional<Klass>
531+ %53 = load [take] %32 : $*Optional<Klass>
532+ destroy_value %53 : $Optional<Klass>
533+ dealloc_stack %32 : $*Optional<Klass>
534+ br bb7
535+
536+ bb7:
537+ %r = tuple ()
538+ return %r : $()
539+ }
540+
0 commit comments