@@ -392,3 +392,221 @@ bb3:
392
392
%8 = tuple ()
393
393
return %8 : $()
394
394
}
395
+
396
+ sil @getVoidOut : $@convention(thin) () -> @out ()
397
+
398
+ // CHECK-LABEL: sil @empty_nondominating_apply : {{.*}} {
399
+ // CHECK: inject_enum_addr
400
+ // CHECK-LABEL: } // end sil function 'empty_nondominating_apply'
401
+ sil @empty_nondominating_apply : $@convention(thin) (Builtin.Int1) -> () {
402
+ entry(%cond : $Builtin.Int1):
403
+ %addr = alloc_stack $Optional<()>
404
+ %some_addr = init_enum_data_addr %addr : $*Optional<()>, #Optional.some!enumelt
405
+ cond_br %cond, left, right
406
+
407
+ left:
408
+ br middle
409
+
410
+ right:
411
+ %get = function_ref @getVoidOut : $@convention(thin) () -> @out ()
412
+ apply %get(%some_addr) : $@convention(thin) () -> @out ()
413
+ br middle
414
+
415
+ middle:
416
+ inject_enum_addr %addr : $*Optional<()>, #Optional.some!enumelt
417
+ %o = load %addr : $*Optional<()>
418
+ switch_enum %o : $Optional<()>, case #Optional.some!enumelt: some_block, case #Optional.none!enumelt: none_block
419
+
420
+ some_block(%avoid : $()):
421
+ br exit
422
+
423
+ none_block:
424
+ br exit
425
+
426
+ exit:
427
+ dealloc_stack %addr : $*Optional<()>
428
+ %retval = tuple ()
429
+ return %retval : $()
430
+ }
431
+
432
+ // CHECK-LABEL: sil @empty_nondominating_store : {{.*}} {
433
+ // CHECK: inject_enum_addr
434
+ // CHECK-LABEL: } // end sil function 'empty_nondominating_store'
435
+ sil @empty_nondominating_store : $@convention(thin) (Builtin.Int1) -> () {
436
+ entry(%cond : $Builtin.Int1):
437
+ %addr = alloc_stack $Optional<()>
438
+ %some_addr = init_enum_data_addr %addr : $*Optional<()>, #Optional.some!enumelt
439
+ cond_br %cond, left, right
440
+
441
+ left:
442
+ br middle
443
+
444
+ right:
445
+ %void = tuple ()
446
+ store %void to %some_addr : $*()
447
+ br middle
448
+
449
+ middle:
450
+ inject_enum_addr %addr : $*Optional<()>, #Optional.some!enumelt
451
+ %o = load %addr : $*Optional<()>
452
+ switch_enum %o : $Optional<()>, case #Optional.some!enumelt: some_block, case #Optional.none!enumelt: none_block
453
+
454
+ some_block(%avoid : $()):
455
+ br exit
456
+
457
+ none_block:
458
+ br exit
459
+
460
+ exit:
461
+ dealloc_stack %addr : $*Optional<()>
462
+ %retval = tuple ()
463
+ return %retval : $()
464
+ }
465
+
466
+ // CHECK-LABEL: sil @empty_nondominating_tuple_store_neither : {{.*}} {
467
+ // CHECK: inject_enum_addr
468
+ // CHECK-LABEL: } // end sil function 'empty_nondominating_tuple_store_neither'
469
+ sil @empty_nondominating_tuple_store_neither : $@convention(thin) (Builtin.Int1) -> () {
470
+ entry(%cond : $Builtin.Int1):
471
+ %addr = alloc_stack $Optional<((), ())>
472
+ %some_addr = init_enum_data_addr %addr : $*Optional<((), ())>, #Optional.some!enumelt
473
+ %left_addr = tuple_element_addr %some_addr : $*((), ()), 0
474
+ %right_addr = tuple_element_addr %some_addr : $*((), ()), 1
475
+ cond_br %cond, left, right
476
+
477
+ left:
478
+ br middle
479
+
480
+ right:
481
+ %void = tuple ()
482
+ store %void to %left_addr : $*()
483
+ store %void to %right_addr : $*()
484
+ br middle
485
+
486
+ middle:
487
+ inject_enum_addr %addr : $*Optional<((), ())>, #Optional.some!enumelt
488
+ %o = load %addr : $*Optional<((), ())>
489
+ switch_enum %o : $Optional<((), ())>, case #Optional.some!enumelt: some_block, case #Optional.none!enumelt: none_block
490
+
491
+ some_block(%avoid : $((), ())):
492
+ br exit
493
+
494
+ none_block:
495
+ br exit
496
+
497
+ exit:
498
+ dealloc_stack %addr : $*Optional<((), ())>
499
+ %retval = tuple ()
500
+ return %retval : $()
501
+ }
502
+
503
+ // CHECK-LABEL: sil @empty_nondominating_tuple_store_left : {{.*}} {
504
+ // CHECK: inject_enum_addr
505
+ // CHECK-LABEL: } // end sil function 'empty_nondominating_tuple_store_left'
506
+ sil @empty_nondominating_tuple_store_left : $@convention(thin) (Builtin.Int1) -> () {
507
+ entry(%cond : $Builtin.Int1):
508
+ %addr = alloc_stack $Optional<((), ())>
509
+ %some_addr = init_enum_data_addr %addr : $*Optional<((), ())>, #Optional.some!enumelt
510
+ %left_addr = tuple_element_addr %some_addr : $*((), ()), 0
511
+ %right_addr = tuple_element_addr %some_addr : $*((), ()), 1
512
+ %void = tuple ()
513
+ cond_br %cond, left, right
514
+
515
+ left:
516
+ br middle
517
+
518
+ right:
519
+ store %void to %left_addr : $*()
520
+ br middle
521
+
522
+ middle:
523
+ store %void to %right_addr : $*()
524
+ inject_enum_addr %addr : $*Optional<((), ())>, #Optional.some!enumelt
525
+ %o = load %addr : $*Optional<((), ())>
526
+ switch_enum %o : $Optional<((), ())>, case #Optional.some!enumelt: some_block, case #Optional.none!enumelt: none_block
527
+
528
+ some_block(%avoid : $((), ())):
529
+ br exit
530
+
531
+ none_block:
532
+ br exit
533
+
534
+ exit:
535
+ dealloc_stack %addr : $*Optional<((), ())>
536
+ %retval = tuple ()
537
+ return %retval : $()
538
+ }
539
+
540
+ // CHECK-LABEL: sil @empty_nondominating_tuple_store_right : {{.*}} {
541
+ // CHECK: inject_enum_addr
542
+ // CHECK-LABEL: } // end sil function 'empty_nondominating_tuple_store_right'
543
+ sil @empty_nondominating_tuple_store_right : $@convention(thin) (Builtin.Int1) -> () {
544
+ entry(%cond : $Builtin.Int1):
545
+ %addr = alloc_stack $Optional<((), ())>
546
+ %some_addr = init_enum_data_addr %addr : $*Optional<((), ())>, #Optional.some!enumelt
547
+ %left_addr = tuple_element_addr %some_addr : $*((), ()), 0
548
+ %right_addr = tuple_element_addr %some_addr : $*((), ()), 1
549
+ %void = tuple ()
550
+ cond_br %cond, left, right
551
+
552
+ left:
553
+ br middle
554
+
555
+ right:
556
+ store %void to %right_addr : $*()
557
+ br middle
558
+
559
+ middle:
560
+ store %void to %left_addr : $*()
561
+ inject_enum_addr %addr : $*Optional<((), ())>, #Optional.some!enumelt
562
+ %o = load %addr : $*Optional<((), ())>
563
+ switch_enum %o : $Optional<((), ())>, case #Optional.some!enumelt: some_block, case #Optional.none!enumelt: none_block
564
+
565
+ some_block(%avoid : $((), ())):
566
+ br exit
567
+
568
+ none_block:
569
+ br exit
570
+
571
+ exit:
572
+ dealloc_stack %addr : $*Optional<((), ())>
573
+ %retval = tuple ()
574
+ return %retval : $()
575
+ }
576
+
577
+ // CHECK-LABEL: sil @empty_dominating_tuple_stores : {{.*}} {
578
+ // CHECK-NOT: inject_enum_addr
579
+ // CHECK-LABEL: } // end sil function 'empty_dominating_tuple_stores'
580
+ sil @empty_dominating_tuple_stores : $@convention(thin) (Builtin.Int1) -> () {
581
+ entry(%cond : $Builtin.Int1):
582
+ %addr = alloc_stack $Optional<((), ())>
583
+ %some_addr = init_enum_data_addr %addr : $*Optional<((), ())>, #Optional.some!enumelt
584
+ %left_addr = tuple_element_addr %some_addr : $*((), ()), 0
585
+ %right_addr = tuple_element_addr %some_addr : $*((), ()), 1
586
+ %void = tuple ()
587
+ cond_br %cond, left, right
588
+
589
+ left:
590
+ br middle
591
+
592
+ right:
593
+ br middle
594
+
595
+ middle:
596
+ store %void to %right_addr : $*()
597
+ store %void to %left_addr : $*()
598
+ inject_enum_addr %addr : $*Optional<((), ())>, #Optional.some!enumelt
599
+ %o = load %addr : $*Optional<((), ())>
600
+ switch_enum %o : $Optional<((), ())>, case #Optional.some!enumelt: some_block, case #Optional.none!enumelt: none_block
601
+
602
+ some_block(%avoid : $((), ())):
603
+ br exit
604
+
605
+ none_block:
606
+ br exit
607
+
608
+ exit:
609
+ dealloc_stack %addr : $*Optional<((), ())>
610
+ %retval = tuple ()
611
+ return %retval : $()
612
+ }
0 commit comments