@@ -648,3 +648,78 @@ done: ; preds = %backedge
648
648
failure:
649
649
unreachable
650
650
}
651
+
652
+ ; TODO: We can break the backedge here.
653
+ define i32 @test_multiple_pred_2 () {
654
+ ; CHECK-LABEL: @test_multiple_pred_2(
655
+ ; CHECK-NEXT: entry:
656
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
657
+ ; CHECK: loop:
658
+ ; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SUM_NEXT:%.*]], [[BACKEDGE:%.*]] ]
659
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i32 4, [[SUM]]
660
+ ; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0
661
+ ; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
662
+ ; CHECK: if.true:
663
+ ; CHECK-NEXT: br i1 undef, label [[IF_TRUE_1:%.*]], label [[IF_TRUE_2:%.*]]
664
+ ; CHECK: if.true.1:
665
+ ; CHECK-NEXT: br label [[BACKEDGE]]
666
+ ; CHECK: if.true.2:
667
+ ; CHECK-NEXT: br label [[BACKEDGE]]
668
+ ; CHECK: if.false:
669
+ ; CHECK-NEXT: br i1 undef, label [[IF_FALSE_1:%.*]], label [[IF_FALSE_2:%.*]]
670
+ ; CHECK: if.false.1:
671
+ ; CHECK-NEXT: br label [[BACKEDGE]]
672
+ ; CHECK: if.false.2:
673
+ ; CHECK-NEXT: br label [[BACKEDGE]]
674
+ ; CHECK: backedge:
675
+ ; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE_1]] ], [ 0, [[IF_FALSE_2]] ], [ [[SUB]], [[IF_TRUE_1]] ], [ [[SUB]], [[IF_TRUE_2]] ]
676
+ ; CHECK-NEXT: [[SUM_NEXT]] = add i32 [[SUM]], [[MERGE_PHI]]
677
+ ; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ne i32 [[SUM_NEXT]], 4
678
+ ; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]]
679
+ ; CHECK: done:
680
+ ; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ]
681
+ ; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]]
682
+ ; CHECK: failure:
683
+ ; CHECK-NEXT: unreachable
684
+ ;
685
+ entry:
686
+
687
+ br label %loop
688
+
689
+ loop: ; preds = %backedge, %entry
690
+ %sum = phi i32 [ 0 , %entry ], [ %sum.next , %backedge ]
691
+ %sub = sub i32 4 , %sum
692
+ %is.positive = icmp sgt i32 %sub , 0
693
+ br i1 %is.positive , label %if.true , label %if.false
694
+
695
+ if.true:
696
+ br i1 undef , label %if.true.1 , label %if.true.2
697
+
698
+ if.true .1 :
699
+ br label %backedge
700
+
701
+ if.true .2 :
702
+ br label %backedge
703
+
704
+ if.false: ; preds = %loop
705
+ br i1 undef , label %if.false.1 , label %if.false.2
706
+
707
+ if.false .1 :
708
+ br label %backedge
709
+
710
+ if.false .2 :
711
+ br label %backedge
712
+
713
+ backedge:
714
+ %merge.phi = phi i32 [ 0 , %if.false.1 ], [ 0 , %if.false.2 ], [ %sub , %if.true.1 ], [ %sub , %if.true.2 ]
715
+ %sum.next = add i32 %sum , %merge.phi
716
+ %loop.cond = icmp ne i32 %sum.next , 4
717
+ br i1 %loop.cond , label %loop , label %done
718
+
719
+ done: ; preds = %backedge
720
+ %sum.next.lcssa = phi i32 [ %sum.next , %backedge ]
721
+ ret i32 %sum.next.lcssa
722
+
723
+ failure:
724
+ unreachable
725
+ }
0 commit comments