@@ -102,6 +102,14 @@ struct MoveOnlyStruct: ~Copyable {
102102 var value: MyInt
103103}
104104
105+ enum NoncopyableEnum : ~Copyable {
106+ case i(CopyableStruct)
107+ }
108+
109+ struct CopyableStruct {
110+ var guts: AnyObject
111+ }
112+
105113//////////////////////
106114// Simple DCE Tests //
107115//////////////////////
@@ -5530,3 +5538,44 @@ bb0:
55305538 return %6
55315539}
55325540
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