1
1
// RUN: %target-sil-opt -enable-sil-verify-all %s -mem2reg | %FileCheck %s
2
2
3
3
import Builtin
4
- import Swift
5
4
6
5
//////////////////
7
6
// Declarations //
8
7
//////////////////
9
8
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
+
10
28
class Klass {}
11
29
12
30
struct SmallCodesizeStruct {
@@ -492,22 +510,22 @@ bb0:
492
510
// CHECK-LABEL: sil [ossa] @test_optional_in_multiple_blocks :
493
511
// CHECK-NOT: alloc_stack
494
512
// 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
501
519
502
520
bb5:
503
- dealloc_stack %32 : $*Optional <Klass>
521
+ dealloc_stack %32 : $*FakeOptional <Klass>
504
522
br bb7
505
523
506
524
bb6(%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>
511
529
br bb7
512
530
513
531
bb7:
@@ -518,22 +536,22 @@ bb7:
518
536
// CHECK-LABEL: sil [ossa] @test_optional_in_multiple_blocks_lexical :
519
537
// CHECK-NOT: alloc_stack
520
538
// 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
527
545
528
546
bb5:
529
- dealloc_stack %32 : $*Optional <Klass>
547
+ dealloc_stack %32 : $*FakeOptional <Klass>
530
548
br bb7
531
549
532
550
bb6(%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>
537
555
br bb7
538
556
539
557
bb7:
@@ -544,23 +562,23 @@ bb7:
544
562
// CHECK-LABEL: sil [ossa] @test_optional_in_multiple_blocks_lexical_storedvalue :
545
563
// CHECK-NOT: alloc_stack
546
564
// 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
553
571
554
572
bb5:
555
- dealloc_stack %32 : $*Optional <Klass>
573
+ dealloc_stack %32 : $*FakeOptional <Klass>
556
574
br bb7
557
575
558
576
bb6(%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>
561
579
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>
564
582
br bb7
565
583
566
584
bb7:
@@ -571,24 +589,71 @@ bb7:
571
589
// CHECK-LABEL: sil [ossa] @optimize_optional_in_single_block :
572
590
// CHECK-NOT: alloc_stack
573
591
// 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
577
595
578
596
bb5:
579
597
br bb7
580
598
581
599
bb6(%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>
588
606
br bb7
589
607
590
608
bb7:
591
609
%r = tuple ()
592
610
return %r : $()
593
611
}
594
612
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