@@ -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//////////////////////
@@ -5528,3 +5536,44 @@ bb0:
55285536 return %6
55295537}
55305538
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