@@ -491,6 +491,113 @@ func @merge_nested_if(%arg0: i1, %arg1: i1) {
491
491
492
492
// -----
493
493
494
+ // CHECK-LABEL: @merge_yielding_nested_if
495
+ // CHECK-SAME: (%[[ARG0:.*]]: i1, %[[ARG1:.*]]: i1)
496
+ func @merge_yielding_nested_if (%arg0: i1 , %arg1: i1 ) -> (i32 , f32 , i32 , i8 ) {
497
+ // CHECK: %[[PRE0:.*]] = "test.op"() : () -> i32
498
+ // CHECK: %[[PRE1:.*]] = "test.op1"() : () -> f32
499
+ // CHECK: %[[PRE2:.*]] = "test.op2"() : () -> i32
500
+ // CHECK: %[[PRE3:.*]] = "test.op3"() : () -> i8
501
+ // CHECK: %[[COND:.*]] = arith.andi %[[ARG0]], %[[ARG1]]
502
+ // CHECK: %[[RES:.*]]:2 = scf.if %[[COND]] -> (f32, i32)
503
+ // CHECK: %[[IN0:.*]] = "test.inop"() : () -> i32
504
+ // CHECK: %[[IN1:.*]] = "test.inop1"() : () -> f32
505
+ // CHECK: scf.yield %[[IN1]], %[[IN0]] : f32, i32
506
+ // CHECK: } else {
507
+ // CHECK: scf.yield %[[PRE1]], %[[PRE2]] : f32, i32
508
+ // CHECK: }
509
+ // CHECK: return %[[PRE0]], %[[RES]]#0, %[[RES]]#1, %[[PRE3]] : i32, f32, i32, i8
510
+ %0 = " test.op" () : () -> (i32 )
511
+ %1 = " test.op1" () : () -> (f32 )
512
+ %2 = " test.op2" () : () -> (i32 )
513
+ %3 = " test.op3" () : () -> (i8 )
514
+ %r:4 = scf.if %arg0 -> (i32 , f32 , i32 , i8 ) {
515
+ %a:2 = scf.if %arg1 -> (i32 , f32 ) {
516
+ %i = " test.inop" () : () -> (i32 )
517
+ %i1 = " test.inop1" () : () -> (f32 )
518
+ scf.yield %i , %i1 : i32 , f32
519
+ } else {
520
+ scf.yield %2 , %1 : i32 , f32
521
+ }
522
+ scf.yield %0 , %a#1 , %a#0 , %3 : i32 , f32 , i32 , i8
523
+ } else {
524
+ scf.yield %0 , %1 , %2 , %3 : i32 , f32 , i32 , i8
525
+ }
526
+ return %r#0 , %r#1 , %r#2 , %r#3 : i32 , f32 , i32 , i8
527
+ }
528
+
529
+ // CHECK-LABEL: @merge_yielding_nested_if_nv1
530
+ // CHECK-SAME: (%[[ARG0:.*]]: i1, %[[ARG1:.*]]: i1)
531
+ func @merge_yielding_nested_if_nv1 (%arg0: i1 , %arg1: i1 ) {
532
+ // CHECK: %[[PRE0:.*]] = "test.op"() : () -> i32
533
+ // CHECK: %[[PRE1:.*]] = "test.op1"() : () -> f32
534
+ // CHECK: %[[COND:.*]] = arith.andi %[[ARG0]], %[[ARG1]]
535
+ // CHECK: scf.if %[[COND]]
536
+ // CHECK: %[[IN0:.*]] = "test.inop"() : () -> i32
537
+ // CHECK: %[[IN1:.*]] = "test.inop1"() : () -> f32
538
+ // CHECK: }
539
+ %0 = " test.op" () : () -> (i32 )
540
+ %1 = " test.op1" () : () -> (f32 )
541
+ scf.if %arg0 {
542
+ %a:2 = scf.if %arg1 -> (i32 , f32 ) {
543
+ %i = " test.inop" () : () -> (i32 )
544
+ %i1 = " test.inop1" () : () -> (f32 )
545
+ scf.yield %i , %i1 : i32 , f32
546
+ } else {
547
+ scf.yield %0 , %1 : i32 , f32
548
+ }
549
+ }
550
+ return
551
+ }
552
+
553
+ // CHECK-LABEL: @merge_yielding_nested_if_nv2
554
+ // CHECK-SAME: (%[[ARG0:.*]]: i1, %[[ARG1:.*]]: i1)
555
+ func @merge_yielding_nested_if_nv2 (%arg0: i1 , %arg1: i1 ) -> i32 {
556
+ // CHECK: %[[PRE0:.*]] = "test.op"() : () -> i32
557
+ // CHECK: %[[PRE1:.*]] = "test.op1"() : () -> i32
558
+ // CHECK: %[[COND:.*]] = arith.andi %[[ARG0]], %[[ARG1]]
559
+ // CHECK: scf.if %[[COND]]
560
+ // CHECK: "test.run"() : () -> ()
561
+ // CHECK: }
562
+ // CHECK: %[[RES:.*]] = arith.select %[[COND]], %[[PRE0]], %[[PRE1]]
563
+ // CHECK: return %[[RES]]
564
+ %0 = " test.op" () : () -> (i32 )
565
+ %1 = " test.op1" () : () -> (i32 )
566
+ %r = scf.if %arg0 -> i32 {
567
+ scf.if %arg1 {
568
+ " test.run" () : () -> ()
569
+ }
570
+ scf.yield %0 : i32
571
+ } else {
572
+ scf.yield %1 : i32
573
+ }
574
+ return %r : i32
575
+ }
576
+
577
+ // CHECK-LABEL: @merge_fail_yielding_nested_if
578
+ // CHECK-SAME: (%[[ARG0:.*]]: i1, %[[ARG1:.*]]: i1)
579
+ func @merge_fail_yielding_nested_if (%arg0: i1 , %arg1: i1 ) -> (i32 , f32 , i32 , i8 ) {
580
+ // CHECK-NOT: andi
581
+ %0 = " test.op" () : () -> (i32 )
582
+ %1 = " test.op1" () : () -> (f32 )
583
+ %2 = " test.op2" () : () -> (i32 )
584
+ %3 = " test.op3" () : () -> (i8 )
585
+ %r:4 = scf.if %arg0 -> (i32 , f32 , i32 , i8 ) {
586
+ %a:2 = scf.if %arg1 -> (i32 , f32 ) {
587
+ %i = " test.inop" () : () -> (i32 )
588
+ %i1 = " test.inop1" () : () -> (f32 )
589
+ scf.yield %i , %i1 : i32 , f32
590
+ } else {
591
+ scf.yield %0 , %1 : i32 , f32
592
+ }
593
+ scf.yield %0 , %a#1 , %a#0 , %3 : i32 , f32 , i32 , i8
594
+ } else {
595
+ scf.yield %0 , %1 , %2 , %3 : i32 , f32 , i32 , i8
596
+ }
597
+ return %r#0 , %r#1 , %r#2 , %r#3 : i32 , f32 , i32 , i8
598
+ }
599
+ // -----
600
+
494
601
// CHECK-LABEL: func @if_condition_swap
495
602
// CHECK-NEXT: %{{.*}} = scf.if %arg0 -> (index) {
496
603
// CHECK-NEXT: %[[i1:.+]] = "test.origFalse"() : () -> index
0 commit comments