@@ -102,6 +102,14 @@ struct MoveOnlyStruct: ~Copyable {
102
102
var value: MyInt
103
103
}
104
104
105
+ enum NoncopyableEnum : ~Copyable {
106
+ case i(CopyableStruct)
107
+ }
108
+
109
+ struct CopyableStruct {
110
+ var guts: AnyObject
111
+ }
112
+
105
113
//////////////////////
106
114
// Simple DCE Tests //
107
115
//////////////////////
@@ -5528,3 +5536,44 @@ bb0:
5528
5536
return %6
5529
5537
}
5530
5538
5539
+ // unchecked_take_enum_data_addr of a noncopyable base must not be combined if
5540
+ // there are any load [copy] users.
5541
+ // CHECK-LABEL: sil [ossa] @no_combine_uteda_load_copy_noncopyable {{.*}} {
5542
+ // CHECK: unchecked_take_enum_data_addr
5543
+ // CHECK-LABEL: } // end sil function 'no_combine_uteda_load_copy_noncopyable'
5544
+ sil [ossa] @no_combine_uteda_load_copy_noncopyable : $@convention(thin) (@in NoncopyableEnum) -> () {
5545
+ entry(%e_addr : $*NoncopyableEnum):
5546
+ %i_addr = unchecked_take_enum_data_addr %e_addr : $*NoncopyableEnum, #NoncopyableEnum.i!enumelt
5547
+ %i_copy = load [copy] %i_addr : $*CopyableStruct
5548
+ apply undef(%i_copy) : $@convention(thin) (@owned CopyableStruct) -> ()
5549
+ %i = load [take] %i_addr : $*CopyableStruct
5550
+ apply undef(%i) : $@convention(thin) (@owned CopyableStruct) -> ()
5551
+ return undef : $()
5552
+ }
5553
+
5554
+ // unchecked_take_enum_data_addr of a noncopyable base should be combined if
5555
+ // there are only load [take] users.
5556
+ // CHECK-LABEL: sil [ossa] @combine_uteda_load_take_noncopyable {{.*}} {
5557
+ // CHECK-NOT: unchecked_take_enum_data_addr
5558
+ // CHECK-LABEL: } // end sil function 'combine_uteda_load_take_noncopyable'
5559
+ sil [ossa] @combine_uteda_load_take_noncopyable : $@convention(thin) (@in NoncopyableEnum) -> () {
5560
+ entry(%e_addr : $*NoncopyableEnum):
5561
+ %i_addr = unchecked_take_enum_data_addr %e_addr : $*NoncopyableEnum, #NoncopyableEnum.i!enumelt
5562
+ %i = load [take] %i_addr : $*CopyableStruct
5563
+ apply undef(%i) : $@convention(thin) (@owned CopyableStruct) -> ()
5564
+ return undef : $()
5565
+ }
5566
+
5567
+ // unchecked_take_enum_data_addr of a noncopyable base should be combined if
5568
+ // there are only load_borrow users.
5569
+ // CHECK-LABEL: sil [ossa] @combine_uteda_load_borrow_noncopyable {{.*}} {
5570
+ // CHECK-NOT: unchecked_take_enum_data_addr
5571
+ // CHECK-LABEL: } // end sil function 'combine_uteda_load_borrow_noncopyable'
5572
+ sil [ossa] @combine_uteda_load_borrow_noncopyable : $@convention(thin) (@in_guaranteed NoncopyableEnum) -> () {
5573
+ entry(%e_addr : $*NoncopyableEnum):
5574
+ %i_addr = unchecked_take_enum_data_addr %e_addr : $*NoncopyableEnum, #NoncopyableEnum.i!enumelt
5575
+ %i = load_borrow %i_addr : $*CopyableStruct
5576
+ apply undef(%i) : $@convention(thin) (@guaranteed CopyableStruct) -> ()
5577
+ end_borrow %i : $CopyableStruct
5578
+ return undef : $()
5579
+ }
0 commit comments