11// RUN: %target-sil-opt -enable-sil-verify-all %s -mem2reg | %FileCheck %s
22
33import Builtin
4- import Swift
54
65//////////////////
76// Declarations //
87//////////////////
98
9+ typealias AnyObject = Builtin.AnyObject
10+
11+ struct Int64 {
12+ var _value : Builtin.Int64
13+ }
14+
15+ struct Int {
16+ var _value : Builtin.Int64
17+ }
18+
19+ struct Bool {
20+ var _value : Builtin.Int1
21+ }
22+
23+ enum FakeOptional<T> {
24+ case some(T)
25+ case none
26+ }
27+
1028class Klass {}
1129
1230struct SmallCodesizeStruct {
@@ -492,22 +510,22 @@ bb0:
492510// CHECK-LABEL: sil [ossa] @test_optional_in_multiple_blocks :
493511// CHECK-NOT: alloc_stack
494512// CHECK: } // end sil function 'test_optional_in_multiple_blocks'
495- sil [ossa] @test_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
513+ sil [ossa] @test_optional_in_multiple_blocks : $@convention(method) (@guaranteed FakeOptional <Klass>) -> () {
514+ bb0(%0 : @guaranteed $FakeOptional <Klass>):
515+ %1 = copy_value %0 : $FakeOptional <Klass>
516+ %32 = alloc_stack $FakeOptional <Klass>
517+ store %1 to [init] %32 : $*FakeOptional <Klass>
518+ switch_enum %0 : $FakeOptional <Klass>, case #FakeOptional .some!enumelt: bb6, case #FakeOptional .none!enumelt: bb5
501519
502520bb5:
503- dealloc_stack %32 : $*Optional <Klass>
521+ dealloc_stack %32 : $*FakeOptional <Klass>
504522 br bb7
505523
506524bb6(%50 : @guaranteed $Klass):
507- %53 = load [copy] %32 : $*Optional <Klass>
508- destroy_value %53 : $Optional <Klass>
509- destroy_addr %32 : $*Optional <Klass>
510- dealloc_stack %32 : $*Optional <Klass>
525+ %53 = load [copy] %32 : $*FakeOptional <Klass>
526+ destroy_value %53 : $FakeOptional <Klass>
527+ destroy_addr %32 : $*FakeOptional <Klass>
528+ dealloc_stack %32 : $*FakeOptional <Klass>
511529 br bb7
512530
513531bb7:
@@ -518,22 +536,22 @@ bb7:
518536// CHECK-LABEL: sil [ossa] @test_optional_in_multiple_blocks_lexical :
519537// CHECK-NOT: alloc_stack
520538// CHECK: } // end sil function 'test_optional_in_multiple_blocks_lexical'
521- sil [ossa] @test_optional_in_multiple_blocks_lexical : $@convention(method) (@guaranteed Optional <Klass>) -> () {
522- bb0(%0 : @guaranteed $Optional <Klass>):
523- %1 = copy_value %0 : $Optional <Klass>
524- %32 = alloc_stack [lexical] $Optional <Klass>
525- store %1 to [init] %32 : $*Optional <Klass>
526- switch_enum %0 : $Optional <Klass>, case #Optional .some!enumelt: bb6, case #Optional .none!enumelt: bb5
539+ sil [ossa] @test_optional_in_multiple_blocks_lexical : $@convention(method) (@guaranteed FakeOptional <Klass>) -> () {
540+ bb0(%0 : @guaranteed $FakeOptional <Klass>):
541+ %1 = copy_value %0 : $FakeOptional <Klass>
542+ %32 = alloc_stack [lexical] $FakeOptional <Klass>
543+ store %1 to [init] %32 : $*FakeOptional <Klass>
544+ switch_enum %0 : $FakeOptional <Klass>, case #FakeOptional .some!enumelt: bb6, case #FakeOptional .none!enumelt: bb5
527545
528546bb5:
529- dealloc_stack %32 : $*Optional <Klass>
547+ dealloc_stack %32 : $*FakeOptional <Klass>
530548 br bb7
531549
532550bb6(%50 : @guaranteed $Klass):
533- %53 = load [copy] %32 : $*Optional <Klass>
534- destroy_value %53 : $Optional <Klass>
535- destroy_addr %32 : $*Optional <Klass>
536- dealloc_stack %32 : $*Optional <Klass>
551+ %53 = load [copy] %32 : $*FakeOptional <Klass>
552+ destroy_value %53 : $FakeOptional <Klass>
553+ destroy_addr %32 : $*FakeOptional <Klass>
554+ dealloc_stack %32 : $*FakeOptional <Klass>
537555 br bb7
538556
539557bb7:
@@ -544,23 +562,23 @@ bb7:
544562// CHECK-LABEL: sil [ossa] @test_optional_in_multiple_blocks_lexical_storedvalue :
545563// CHECK-NOT: alloc_stack
546564// CHECK: } // end sil function 'test_optional_in_multiple_blocks_lexical_storedvalue'
547- sil [ossa] @test_optional_in_multiple_blocks_lexical_storedvalue : $@convention(method) (@owned Optional <Klass>) -> () {
548- bb0(%0 : @owned $Optional <Klass>):
549- %1 = copy_value %0 : $Optional <Klass>
550- %32 = alloc_stack $Optional <Klass>
551- store %0 to [init] %32 : $*Optional <Klass>
552- switch_enum %1 : $Optional <Klass>, case #Optional .some!enumelt: bb6, case #Optional .none!enumelt: bb5
565+ sil [ossa] @test_optional_in_multiple_blocks_lexical_storedvalue : $@convention(method) (@owned FakeOptional <Klass>) -> () {
566+ bb0(%0 : @owned $FakeOptional <Klass>):
567+ %1 = copy_value %0 : $FakeOptional <Klass>
568+ %32 = alloc_stack $FakeOptional <Klass>
569+ store %0 to [init] %32 : $*FakeOptional <Klass>
570+ switch_enum %1 : $FakeOptional <Klass>, case #FakeOptional .some!enumelt: bb6, case #FakeOptional .none!enumelt: bb5
553571
554572bb5:
555- dealloc_stack %32 : $*Optional <Klass>
573+ dealloc_stack %32 : $*FakeOptional <Klass>
556574 br bb7
557575
558576bb6(%50 : @owned $Klass):
559- %53 = load [copy] %32 : $*Optional <Klass>
560- destroy_value %53 : $Optional <Klass>
577+ %53 = load [copy] %32 : $*FakeOptional <Klass>
578+ destroy_value %53 : $FakeOptional <Klass>
561579 destroy_value %50 : $Klass
562- destroy_addr %32 : $*Optional <Klass>
563- dealloc_stack %32 : $*Optional <Klass>
580+ destroy_addr %32 : $*FakeOptional <Klass>
581+ dealloc_stack %32 : $*FakeOptional <Klass>
564582 br bb7
565583
566584bb7:
@@ -571,24 +589,71 @@ bb7:
571589// CHECK-LABEL: sil [ossa] @optimize_optional_in_single_block :
572590// CHECK-NOT: alloc_stack
573591// CHECK: } // end sil function 'optimize_optional_in_single_block'
574- sil [ossa] @optimize_optional_in_single_block : $@convention(method) (@guaranteed Optional <Klass>) -> () {
575- bb0(%0 : @guaranteed $Optional <Klass>):
576- switch_enum %0 : $Optional <Klass>, case #Optional .some!enumelt: bb6, case #Optional .none!enumelt: bb5
592+ sil [ossa] @optimize_optional_in_single_block : $@convention(method) (@guaranteed FakeOptional <Klass>) -> () {
593+ bb0(%0 : @guaranteed $FakeOptional <Klass>):
594+ switch_enum %0 : $FakeOptional <Klass>, case #FakeOptional .some!enumelt: bb6, case #FakeOptional .none!enumelt: bb5
577595
578596bb5:
579597 br bb7
580598
581599bb6(%50 : @guaranteed $Klass):
582- %32 = alloc_stack $Optional <Klass>
583- %1 = copy_value %0 : $Optional <Klass>
584- store %1 to [init] %32 : $*Optional <Klass>
585- %53 = load [take] %32 : $*Optional <Klass>
586- destroy_value %53 : $Optional <Klass>
587- dealloc_stack %32 : $*Optional <Klass>
600+ %32 = alloc_stack $FakeOptional <Klass>
601+ %1 = copy_value %0 : $FakeOptional <Klass>
602+ store %1 to [init] %32 : $*FakeOptional <Klass>
603+ %53 = load [take] %32 : $*FakeOptional <Klass>
604+ destroy_value %53 : $FakeOptional <Klass>
605+ dealloc_stack %32 : $*FakeOptional <Klass>
588606 br bb7
589607
590608bb7:
591609 %r = tuple ()
592610 return %r : $()
593611}
594612
613+ // CHECK-LABEL: sil [ossa] @switch_enum_out_of_new_phi_block : {{.*}} {
614+ // CHECK-NOT: alloc_stack
615+ // CHECK: } // end sil function 'switch_enum_out_of_new_phi_block'
616+ sil [ossa] @switch_enum_out_of_new_phi_block : $() -> () {
617+ entry:
618+ %addr = alloc_stack $FakeOptional<Klass>
619+ cond_br undef, store_none, agg_either
620+
621+ store_none:
622+ %none1 = enum $FakeOptional<Klass>, #FakeOptional.none!enumelt
623+ store %none1 to [init] %addr : $*FakeOptional<Klass>
624+ br switcheroo
625+
626+ agg_either:
627+ cond_br undef, agg_some, agg_none
628+
629+ agg_some:
630+ %Klass = apply undef() : $@convention(thin) () -> (@owned Klass)
631+ %some = enum $FakeOptional<Klass>, #FakeOptional.some!enumelt, %Klass : $Klass
632+ br store_maybe(%some : $FakeOptional<Klass>)
633+
634+ agg_none:
635+ %none2 = enum $FakeOptional<Klass>, #FakeOptional.none!enumelt
636+ br store_maybe(%none2 : $FakeOptional<Klass>)
637+
638+ store_maybe(%maybe : @owned $FakeOptional<Klass>):
639+ store %maybe to [init] %addr : $*FakeOptional<Klass>
640+ br switcheroo
641+
642+ switcheroo:
643+ %borrow = load_borrow %addr : $*FakeOptional<Klass>
644+ switch_enum %borrow : $FakeOptional<Klass>, case #FakeOptional.some!enumelt: bb14, case #FakeOptional.none!enumelt: bb15
645+
646+ bb14(%some_borrowed : @guaranteed $Klass):
647+ end_borrow %borrow : $FakeOptional<Klass>
648+ destroy_addr %addr : $*FakeOptional<Klass>
649+ br bb16
650+
651+ bb15:
652+ end_borrow %borrow : $FakeOptional<Klass>
653+ br bb16
654+
655+ bb16:
656+ dealloc_stack %addr : $*FakeOptional<Klass>
657+ %retval = tuple ()
658+ return %retval : $()
659+ }
0 commit comments