@@ -30,6 +30,10 @@ enum OuterEnum<T> {
30
30
case inner(InnerEnum<T>, AnyObject)
31
31
}
32
32
33
+ struct Box<T> {
34
+ var t: T
35
+ }
36
+
33
37
struct InnerStruct<T> {
34
38
var t: T
35
39
var object: AnyObject
@@ -536,3 +540,62 @@ exit(%instance_2 : @owned $T, %s_2 : $S):
536
540
%retval = tuple ()
537
541
return %retval : $()
538
542
}
543
+
544
+ // Check behavior of non-coalesceable single incoming phi.
545
+ // CHECK-LABEL: sil [ossa] @f120_single_phi_argument_forwarded_function_argument : {{.*}} {
546
+ // CHECK: bb0([[T:%[^,]+]] :
547
+ // CHECK: [[STORAGE:%[^,]+]] = alloc_stack
548
+ // CHECK: copy_addr [take] [[T]] to [init] [[STORAGE]]
549
+ // CHECK: br [[EXIT:bb[0-9]+]]
550
+ // CHECK: [[EXIT]]:
551
+ // CHECK: destroy_addr [[STORAGE]]
552
+ // CHECK: dealloc_stack [[STORAGE]]
553
+ // CHECK-LABEL: } // end sil function 'f120_single_phi_argument_forwarded_function_argument'
554
+ sil [ossa]@f120_single_phi_argument_forwarded_function_argument : $@convention(thin) <T> (@in T) -> () {
555
+ entry(%t : @owned $T):
556
+ br exit(%t : $T)
557
+
558
+ exit(%t2 : @owned $T):
559
+ destroy_value %t2 : $T
560
+ %retval = tuple ()
561
+ return %retval : $()
562
+ }
563
+
564
+ // CHECK-LABEL: sil [ossa] @f121_single_phi_argument_forwarded_function_argument_returned : {{.*}} {
565
+ // CHECK: bb0([[OUT:%[^,]+]] :
566
+ // CHECK-SAME: [[IN:%[^,]+]] :
567
+ // CHECK: copy_addr [take] [[IN]] to [init] [[OUT]]
568
+ // CHECK: br [[EXIT:bb[0-9]+]]
569
+ // CHECK: [[EXIT]]:
570
+ // CHECK-LABEL: } // end sil function 'f121_single_phi_argument_forwarded_function_argument_returned'
571
+ sil [ossa]@f121_single_phi_argument_forwarded_function_argument_returned : $@convention(thin) <T> (@in T) -> @out T {
572
+ entry(%t : @owned $T):
573
+ br exit(%t : $T)
574
+
575
+ exit(%t2 : @owned $T):
576
+ return %t2 : $T
577
+ }
578
+
579
+ // CHECK-LABEL: sil [ossa] @f122_single_phi_argument_destructure : $@convention(thin) <T> () -> () {
580
+ // CHECK: [[PHI_ADDR:%[^,]+]] = alloc_stack $T
581
+ // CHECK: [[BOX_ADDR:%[^,]+]] = alloc_stack $Box<T>
582
+ // CHECK: apply undef<T>([[BOX_ADDR]])
583
+ // CHECK: [[T_ADDR:%[^,]+]] = struct_element_addr [[BOX_ADDR]] : $*Box<T>, #Box.t
584
+ // CHECK: copy_addr [take] [[T_ADDR]] to [init] [[PHI_ADDR]]
585
+ // CHECK: br [[EXIT:bb[0-9]+]]
586
+ // CHECK: [[EXIT]]:
587
+ // CHECK: destroy_addr [[PHI_ADDR]]
588
+ // CHECK: dealloc_stack [[BOX_ADDR]]
589
+ // CHECK: dealloc_stack [[PHI_ADDR]]
590
+ // CHECK-LABEL: } // end sil function 'f122_single_phi_argument_destructure'
591
+ sil [ossa]@f122_single_phi_argument_destructure : $@convention(thin) <T> () -> () {
592
+ entry:
593
+ %box = apply undef<T>() : $@convention(thin) <T> () -> (@out Box<T>)
594
+ %t = destructure_struct %box : $Box<T>
595
+ br exit(%t : $T)
596
+
597
+ exit(%t2 : @owned $T):
598
+ destroy_value %t2 : $T
599
+ %retval = tuple ()
600
+ return %retval : $()
601
+ }
0 commit comments