@@ -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
//////////////////////
@@ -5530,3 +5538,44 @@ bb0:
5530
5538
return %6
5531
5539
}
5532
5540
5541
+ // unchecked_take_enum_data_addr of a noncopyable base must not be combined if
5542
+ // there are any load [copy] users.
5543
+ // CHECK-LABEL: sil [ossa] @no_combine_uteda_load_copy_noncopyable {{.*}} {
5544
+ // CHECK: unchecked_take_enum_data_addr
5545
+ // CHECK-LABEL: } // end sil function 'no_combine_uteda_load_copy_noncopyable'
5546
+ sil [ossa] @no_combine_uteda_load_copy_noncopyable : $@convention(thin) (@in NoncopyableEnum) -> () {
5547
+ entry(%e_addr : $*NoncopyableEnum):
5548
+ %i_addr = unchecked_take_enum_data_addr %e_addr : $*NoncopyableEnum, #NoncopyableEnum.i!enumelt
5549
+ %i_copy = load [copy] %i_addr : $*CopyableStruct
5550
+ apply undef(%i_copy) : $@convention(thin) (@owned CopyableStruct) -> ()
5551
+ %i = load [take] %i_addr : $*CopyableStruct
5552
+ apply undef(%i) : $@convention(thin) (@owned CopyableStruct) -> ()
5553
+ return undef : $()
5554
+ }
5555
+
5556
+ // unchecked_take_enum_data_addr of a noncopyable base should be combined if
5557
+ // there are only load [take] users.
5558
+ // CHECK-LABEL: sil [ossa] @combine_uteda_load_take_noncopyable {{.*}} {
5559
+ // CHECK-NOT: unchecked_take_enum_data_addr
5560
+ // CHECK-LABEL: } // end sil function 'combine_uteda_load_take_noncopyable'
5561
+ sil [ossa] @combine_uteda_load_take_noncopyable : $@convention(thin) (@in NoncopyableEnum) -> () {
5562
+ entry(%e_addr : $*NoncopyableEnum):
5563
+ %i_addr = unchecked_take_enum_data_addr %e_addr : $*NoncopyableEnum, #NoncopyableEnum.i!enumelt
5564
+ %i = load [take] %i_addr : $*CopyableStruct
5565
+ apply undef(%i) : $@convention(thin) (@owned CopyableStruct) -> ()
5566
+ return undef : $()
5567
+ }
5568
+
5569
+ // unchecked_take_enum_data_addr of a noncopyable base should be combined if
5570
+ // there are only load_borrow users.
5571
+ // CHECK-LABEL: sil [ossa] @combine_uteda_load_borrow_noncopyable {{.*}} {
5572
+ // CHECK-NOT: unchecked_take_enum_data_addr
5573
+ // CHECK-LABEL: } // end sil function 'combine_uteda_load_borrow_noncopyable'
5574
+ sil [ossa] @combine_uteda_load_borrow_noncopyable : $@convention(thin) (@in_guaranteed NoncopyableEnum) -> () {
5575
+ entry(%e_addr : $*NoncopyableEnum):
5576
+ %i_addr = unchecked_take_enum_data_addr %e_addr : $*NoncopyableEnum, #NoncopyableEnum.i!enumelt
5577
+ %i = load_borrow %i_addr : $*CopyableStruct
5578
+ apply undef(%i) : $@convention(thin) (@guaranteed CopyableStruct) -> ()
5579
+ end_borrow %i : $CopyableStruct
5580
+ return undef : $()
5581
+ }
0 commit comments