@@ -731,6 +731,228 @@ failure:
731
731
unreachable
732
732
}
733
733
734
+ ; TODO: We can break the backedge here by assuming that undef = sub.
735
+ define i32 @test_multiple_pred_undef_1 () {
736
+ ; CHECK-LABEL: @test_multiple_pred_undef_1(
737
+ ; CHECK-NEXT: entry:
738
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
739
+ ; CHECK: loop:
740
+ ; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SUM_NEXT:%.*]], [[BACKEDGE:%.*]] ]
741
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i32 4, [[SUM]]
742
+ ; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0
743
+ ; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
744
+ ; CHECK: if.true:
745
+ ; CHECK-NEXT: br i1 undef, label [[IF_TRUE_1:%.*]], label [[IF_TRUE_2:%.*]]
746
+ ; CHECK: if.true.1:
747
+ ; CHECK-NEXT: br label [[BACKEDGE]]
748
+ ; CHECK: if.true.2:
749
+ ; CHECK-NEXT: br label [[BACKEDGE]]
750
+ ; CHECK: if.false:
751
+ ; CHECK-NEXT: br i1 undef, label [[IF_FALSE_1:%.*]], label [[IF_FALSE_2:%.*]]
752
+ ; CHECK: if.false.1:
753
+ ; CHECK-NEXT: br label [[BACKEDGE]]
754
+ ; CHECK: if.false.2:
755
+ ; CHECK-NEXT: br label [[BACKEDGE]]
756
+ ; CHECK: backedge:
757
+ ; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE_1]] ], [ 0, [[IF_FALSE_2]] ], [ [[SUB]], [[IF_TRUE_1]] ], [ undef, [[IF_TRUE_2]] ]
758
+ ; CHECK-NEXT: [[SUM_NEXT]] = add i32 [[SUM]], [[MERGE_PHI]]
759
+ ; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ne i32 [[SUM_NEXT]], 4
760
+ ; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]]
761
+ ; CHECK: done:
762
+ ; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ]
763
+ ; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]]
764
+ ; CHECK: failure:
765
+ ; CHECK-NEXT: unreachable
766
+ ;
767
+ entry:
768
+ br label %loop
769
+
770
+ loop: ; preds = %backedge, %entry
771
+ %sum = phi i32 [ 0 , %entry ], [ %sum.next , %backedge ]
772
+ %sub = sub i32 4 , %sum
773
+ %is.positive = icmp sgt i32 %sub , 0
774
+ br i1 %is.positive , label %if.true , label %if.false
775
+
776
+ if.true:
777
+ br i1 undef , label %if.true.1 , label %if.true.2
778
+
779
+ if.true .1 :
780
+ br label %backedge
781
+
782
+ if.true .2 :
783
+ br label %backedge
784
+
785
+ if.false: ; preds = %loop
786
+ br i1 undef , label %if.false.1 , label %if.false.2
787
+
788
+ if.false .1 :
789
+ br label %backedge
790
+
791
+ if.false .2 :
792
+ br label %backedge
793
+
794
+ backedge:
795
+ %merge.phi = phi i32 [ 0 , %if.false.1 ], [ 0 , %if.false.2 ], [ %sub , %if.true.1 ], [ undef , %if.true.2 ]
796
+ %sum.next = add i32 %sum , %merge.phi
797
+ %loop.cond = icmp ne i32 %sum.next , 4
798
+ br i1 %loop.cond , label %loop , label %done
799
+
800
+ done: ; preds = %backedge
801
+ %sum.next.lcssa = phi i32 [ %sum.next , %backedge ]
802
+ ret i32 %sum.next.lcssa
803
+
804
+ failure:
805
+ unreachable
806
+ }
807
+
808
+ ; TODO: We can break the backedge here by assuming that undef = sub.
809
+ define i32 @test_multiple_pred_undef_2 () {
810
+ ; CHECK-LABEL: @test_multiple_pred_undef_2(
811
+ ; CHECK-NEXT: entry:
812
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
813
+ ; CHECK: loop:
814
+ ; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SUM_NEXT:%.*]], [[BACKEDGE:%.*]] ]
815
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i32 4, [[SUM]]
816
+ ; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0
817
+ ; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
818
+ ; CHECK: if.true:
819
+ ; CHECK-NEXT: br i1 undef, label [[IF_TRUE_1:%.*]], label [[IF_TRUE_2:%.*]]
820
+ ; CHECK: if.true.1:
821
+ ; CHECK-NEXT: br label [[BACKEDGE]]
822
+ ; CHECK: if.true.2:
823
+ ; CHECK-NEXT: br label [[BACKEDGE]]
824
+ ; CHECK: if.false:
825
+ ; CHECK-NEXT: br i1 undef, label [[IF_FALSE_1:%.*]], label [[IF_FALSE_2:%.*]]
826
+ ; CHECK: if.false.1:
827
+ ; CHECK-NEXT: br label [[BACKEDGE]]
828
+ ; CHECK: if.false.2:
829
+ ; CHECK-NEXT: br label [[BACKEDGE]]
830
+ ; CHECK: backedge:
831
+ ; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE_1]] ], [ 0, [[IF_FALSE_2]] ], [ undef, [[IF_TRUE_1]] ], [ [[SUB]], [[IF_TRUE_2]] ]
832
+ ; CHECK-NEXT: [[SUM_NEXT]] = add i32 [[SUM]], [[MERGE_PHI]]
833
+ ; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ne i32 [[SUM_NEXT]], 4
834
+ ; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]]
835
+ ; CHECK: done:
836
+ ; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ]
837
+ ; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]]
838
+ ; CHECK: failure:
839
+ ; CHECK-NEXT: unreachable
840
+ ;
841
+ entry:
842
+ br label %loop
843
+
844
+ loop: ; preds = %backedge, %entry
845
+ %sum = phi i32 [ 0 , %entry ], [ %sum.next , %backedge ]
846
+ %sub = sub i32 4 , %sum
847
+ %is.positive = icmp sgt i32 %sub , 0
848
+ br i1 %is.positive , label %if.true , label %if.false
849
+
850
+ if.true:
851
+ br i1 undef , label %if.true.1 , label %if.true.2
852
+
853
+ if.true .1 :
854
+ br label %backedge
855
+
856
+ if.true .2 :
857
+ br label %backedge
858
+
859
+ if.false: ; preds = %loop
860
+ br i1 undef , label %if.false.1 , label %if.false.2
861
+
862
+ if.false .1 :
863
+ br label %backedge
864
+
865
+ if.false .2 :
866
+ br label %backedge
867
+
868
+ backedge:
869
+ %merge.phi = phi i32 [ 0 , %if.false.1 ], [ 0 , %if.false.2 ], [ undef , %if.true.1 ], [ %sub , %if.true.2 ]
870
+ %sum.next = add i32 %sum , %merge.phi
871
+ %loop.cond = icmp ne i32 %sum.next , 4
872
+ br i1 %loop.cond , label %loop , label %done
873
+
874
+ done: ; preds = %backedge
875
+ %sum.next.lcssa = phi i32 [ %sum.next , %backedge ]
876
+ ret i32 %sum.next.lcssa
877
+
878
+ failure:
879
+ unreachable
880
+ }
881
+
882
+ ; TODO: We can break the backedge here by exploiting undef.
883
+ define i32 @test_multiple_pred_undef_3 () {
884
+ ; CHECK-LABEL: @test_multiple_pred_undef_3(
885
+ ; CHECK-NEXT: entry:
886
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
887
+ ; CHECK: loop:
888
+ ; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SUM_NEXT:%.*]], [[BACKEDGE:%.*]] ]
889
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i32 4, [[SUM]]
890
+ ; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0
891
+ ; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
892
+ ; CHECK: if.true:
893
+ ; CHECK-NEXT: br i1 undef, label [[IF_TRUE_1:%.*]], label [[IF_TRUE_2:%.*]]
894
+ ; CHECK: if.true.1:
895
+ ; CHECK-NEXT: br label [[BACKEDGE]]
896
+ ; CHECK: if.true.2:
897
+ ; CHECK-NEXT: br label [[BACKEDGE]]
898
+ ; CHECK: if.false:
899
+ ; CHECK-NEXT: br i1 undef, label [[IF_FALSE_1:%.*]], label [[IF_FALSE_2:%.*]]
900
+ ; CHECK: if.false.1:
901
+ ; CHECK-NEXT: br label [[BACKEDGE]]
902
+ ; CHECK: if.false.2:
903
+ ; CHECK-NEXT: br label [[BACKEDGE]]
904
+ ; CHECK: backedge:
905
+ ; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE_1]] ], [ 0, [[IF_FALSE_2]] ], [ undef, [[IF_TRUE_1]] ], [ undef, [[IF_TRUE_2]] ]
906
+ ; CHECK-NEXT: [[SUM_NEXT]] = add i32 [[SUM]], [[MERGE_PHI]]
907
+ ; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ne i32 [[SUM_NEXT]], 4
908
+ ; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]]
909
+ ; CHECK: done:
910
+ ; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ]
911
+ ; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]]
912
+ ; CHECK: failure:
913
+ ; CHECK-NEXT: unreachable
914
+ ;
915
+ entry:
916
+ br label %loop
917
+
918
+ loop: ; preds = %backedge, %entry
919
+ %sum = phi i32 [ 0 , %entry ], [ %sum.next , %backedge ]
920
+ %sub = sub i32 4 , %sum
921
+ %is.positive = icmp sgt i32 %sub , 0
922
+ br i1 %is.positive , label %if.true , label %if.false
923
+
924
+ if.true:
925
+ br i1 undef , label %if.true.1 , label %if.true.2
926
+
927
+ if.true .1 :
928
+ br label %backedge
929
+
930
+ if.true .2 :
931
+ br label %backedge
932
+
933
+ if.false: ; preds = %loop
934
+ br i1 undef , label %if.false.1 , label %if.false.2
935
+
936
+ if.false .1 :
937
+ br label %backedge
938
+
939
+ if.false .2 :
940
+ br label %backedge
941
+
942
+ backedge:
943
+ %merge.phi = phi i32 [ 0 , %if.false.1 ], [ 0 , %if.false.2 ], [ undef , %if.true.1 ], [ undef , %if.true.2 ]
944
+ %sum.next = add i32 %sum , %merge.phi
945
+ %loop.cond = icmp ne i32 %sum.next , 4
946
+ br i1 %loop.cond , label %loop , label %done
947
+
948
+ done: ; preds = %backedge
949
+ %sum.next.lcssa = phi i32 [ %sum.next , %backedge ]
950
+ ret i32 %sum.next.lcssa
951
+
952
+ failure:
953
+ unreachable
954
+ }
955
+
734
956
; TODO: We can break the backedge here.
735
957
define i32 @test_select (i32 %limit ) {
736
958
; CHECK-LABEL: @test_select(
0 commit comments