@@ -11,6 +11,10 @@ enum FakeOptional<T> {
11
11
case none
12
12
}
13
13
14
+ struct NonTrivialStruct {
15
+ var val: Klass
16
+ }
17
+
14
18
sil @use_klass : $@convention(thin) (@guaranteed Klass) -> ()
15
19
16
20
// CHECK-LABEL: sil [ossa] @test_simplify_args1 :
172
176
}
173
177
174
178
// CHECK-LABEL: sil [ossa] @test_simplify_args8 :
175
- // CHECK-NOT: unchecked_enum_date
179
+ // CHECK-NOT: unchecked_enum_data
176
180
// CHECK-LABEL: } // end sil function 'test_simplify_args8'
177
181
sil [ossa] @test_simplify_args8 : $@convention(thin) (@guaranteed Klass) -> () {
178
182
bb0(%0 : @guaranteed $Klass):
@@ -235,3 +239,77 @@ bb3(%4 : $Builtin.Int32):
235
239
return %5 : $()
236
240
}
237
241
242
+ // CHECK-LABEL: sil [ossa] @test_simplify_enum_arg_owned :
243
+ // CHECK: bb1([[ARG:%.*]] : @owned $FakeOptional<Klass>)
244
+ // CHECK-LABEL: } // end sil function 'test_simplify_enum_arg_owned'
245
+ sil [ossa] @test_simplify_enum_arg_owned : $@convention(thin) (@owned Klass) -> () {
246
+ bb0(%0 : @owned $Klass):
247
+ test_specification "simplify-cfg-simplify-argument @block[1] 0"
248
+ %1 = enum $FakeOptional<Klass>, #FakeOptional.some!enumelt, %0 : $Klass
249
+ %c = copy_value %1 : $FakeOptional<Klass>
250
+ br bb1(%1 : $FakeOptional<Klass>)
251
+
252
+ bb1(%3 : @owned $FakeOptional<Klass>):
253
+ %4 = unchecked_enum_data %3 : $FakeOptional<Klass>, #FakeOptional.some!enumelt
254
+ %f = function_ref @use_klass : $@convention(thin) (@guaranteed Klass) -> ()
255
+ apply %f(%4) : $@convention(thin) (@guaranteed Klass) -> ()
256
+ br bb2
257
+
258
+ bb2:
259
+ destroy_value %4 : $Klass
260
+ br bb3
261
+
262
+ bb3:
263
+ destroy_value %c : $FakeOptional<Klass>
264
+ %t = tuple ()
265
+ return %t : $()
266
+ }
267
+
268
+ // CHECK-LABEL: sil [ossa] @test_simplify_enum_arg_guaranteed1 :
269
+ // CHECK: bb1([[ARG:%.*]] : @guaranteed $FakeOptional<Klass>)
270
+ // CHECK-LABEL: } // end sil function 'test_simplify_enum_arg_guaranteed1'
271
+ sil [ossa] @test_simplify_enum_arg_guaranteed1 : $@convention(thin) (@owned Klass) -> () {
272
+ bb0(%0 : @owned $Klass):
273
+ test_specification "simplify-cfg-simplify-argument @block[1] 0"
274
+ %b = begin_borrow %0 : $Klass
275
+ %1 = enum $FakeOptional<Klass>, #FakeOptional.some!enumelt, %b : $Klass
276
+ %c = copy_value %1 : $FakeOptional<Klass>
277
+ br bb1(%1 : $FakeOptional<Klass>)
278
+
279
+ bb1(%3 : @guaranteed $FakeOptional<Klass>):
280
+ %4 = unchecked_enum_data %3 : $FakeOptional<Klass>, #FakeOptional.some!enumelt
281
+ %f = function_ref @use_klass : $@convention(thin) (@guaranteed Klass) -> ()
282
+ apply %f(%4) : $@convention(thin) (@guaranteed Klass) -> ()
283
+ br bb2
284
+
285
+ bb2:
286
+ destroy_value %c : $FakeOptional<Klass>
287
+ end_borrow %b : $Klass
288
+ destroy_value %0 : $Klass
289
+ %t = tuple ()
290
+ return %t : $()
291
+ }
292
+
293
+ // CHECK: bb1([[ARG:%.*]] : @guaranteed $NonTrivialStruct)
294
+ sil [ossa] @test_simplify_enum_arg_guaranteed2 : $@convention(thin) (@owned Klass) -> () {
295
+ bb0(%0 : @owned $Klass):
296
+ test_specification "simplify-cfg-simplify-argument @block[1] 0"
297
+ %b = begin_borrow %0 : $Klass
298
+ %1 = struct $NonTrivialStruct(%b : $Klass)
299
+ %c = copy_value %1 : $NonTrivialStruct
300
+ br bb1(%1 : $NonTrivialStruct)
301
+
302
+ bb1(%3 : @guaranteed $NonTrivialStruct):
303
+ %4 = struct_extract %3 : $NonTrivialStruct, #NonTrivialStruct.val
304
+ %f = function_ref @use_klass : $@convention(thin) (@guaranteed Klass) -> ()
305
+ apply %f(%4) : $@convention(thin) (@guaranteed Klass) -> ()
306
+ br bb2
307
+
308
+ bb2:
309
+ destroy_value %c : $NonTrivialStruct
310
+ end_borrow %b : $Klass
311
+ destroy_value %0 : $Klass
312
+ %t = tuple ()
313
+ return %t : $()
314
+ }
315
+
0 commit comments