@@ -792,3 +792,114 @@ for.body: ; preds = %entry, %for.body
792
792
for.end: ; preds = %for.body, %entry
793
793
ret void
794
794
}
795
+
796
+ ; Show that these transformatios also work with inverted operands
797
+ ; We only both to do this with slt/ult, but it applies to all predicates.
798
+
799
+ define void @slt_constant_lhs (i16 %n.raw , i8 %start ) mustprogress {
800
+ ; CHECK-LABEL: @slt_constant_lhs(
801
+ ; CHECK-NEXT: entry:
802
+ ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
803
+ ; CHECK: for.body:
804
+ ; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[IV_NEXT:%.*]], [[FOR_BODY]] ], [ [[START:%.*]], [[ENTRY:%.*]] ]
805
+ ; CHECK-NEXT: [[IV_NEXT]] = add i8 [[IV]], 1
806
+ ; CHECK-NEXT: [[ZEXT:%.*]] = zext i8 [[IV_NEXT]] to i16
807
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i16 254, [[ZEXT]]
808
+ ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
809
+ ; CHECK: for.end:
810
+ ; CHECK-NEXT: ret void
811
+ ;
812
+ entry:
813
+ br label %for.body
814
+
815
+ for.body: ; preds = %entry, %for.body
816
+ %iv = phi i8 [ %iv.next , %for.body ], [ %start , %entry ]
817
+ %iv.next = add i8 %iv , 1
818
+ %zext = zext i8 %iv.next to i16
819
+ %cmp = icmp slt i16 254 , %zext
820
+ br i1 %cmp , label %for.body , label %for.end
821
+
822
+ for.end: ; preds = %for.body, %entry
823
+ ret void
824
+ }
825
+
826
+ define void @slt_non_constant_lhs (i16 %n ) mustprogress {
827
+ ; CHECK-LABEL: @slt_non_constant_lhs(
828
+ ; CHECK-NEXT: entry:
829
+ ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
830
+ ; CHECK: for.body:
831
+ ; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[IV_NEXT:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]
832
+ ; CHECK-NEXT: [[IV_NEXT]] = add i8 [[IV]], 1
833
+ ; CHECK-NEXT: [[ZEXT:%.*]] = zext i8 [[IV_NEXT]] to i16
834
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i16 [[N:%.*]], [[ZEXT]]
835
+ ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
836
+ ; CHECK: for.end:
837
+ ; CHECK-NEXT: ret void
838
+ ;
839
+ entry:
840
+ br label %for.body
841
+
842
+ for.body: ; preds = %entry, %for.body
843
+ %iv = phi i8 [ %iv.next , %for.body ], [ 0 , %entry ]
844
+ %iv.next = add i8 %iv , 1
845
+ %zext = zext i8 %iv.next to i16
846
+ %cmp = icmp slt i16 %n , %zext
847
+ br i1 %cmp , label %for.body , label %for.end
848
+
849
+ for.end: ; preds = %for.body, %entry
850
+ ret void
851
+ }
852
+
853
+ define void @ult_constant_lhs (i16 %n.raw , i8 %start ) mustprogress {
854
+ ; CHECK-LABEL: @ult_constant_lhs(
855
+ ; CHECK-NEXT: entry:
856
+ ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
857
+ ; CHECK: for.body:
858
+ ; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[IV_NEXT:%.*]], [[FOR_BODY]] ], [ [[START:%.*]], [[ENTRY:%.*]] ]
859
+ ; CHECK-NEXT: [[IV_NEXT]] = add i8 [[IV]], 1
860
+ ; CHECK-NEXT: [[ZEXT:%.*]] = zext i8 [[IV_NEXT]] to i16
861
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i16 254, [[ZEXT]]
862
+ ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
863
+ ; CHECK: for.end:
864
+ ; CHECK-NEXT: ret void
865
+ ;
866
+ entry:
867
+ br label %for.body
868
+
869
+ for.body: ; preds = %entry, %for.body
870
+ %iv = phi i8 [ %iv.next , %for.body ], [ %start , %entry ]
871
+ %iv.next = add i8 %iv , 1
872
+ %zext = zext i8 %iv.next to i16
873
+ %cmp = icmp ult i16 254 , %zext
874
+ br i1 %cmp , label %for.body , label %for.end
875
+
876
+ for.end: ; preds = %for.body, %entry
877
+ ret void
878
+ }
879
+
880
+ define void @ult_non_constant_lhs (i16 %n ) mustprogress {
881
+ ; CHECK-LABEL: @ult_non_constant_lhs(
882
+ ; CHECK-NEXT: entry:
883
+ ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
884
+ ; CHECK: for.body:
885
+ ; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[IV_NEXT:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]
886
+ ; CHECK-NEXT: [[IV_NEXT]] = add i8 [[IV]], 1
887
+ ; CHECK-NEXT: [[ZEXT:%.*]] = zext i8 [[IV_NEXT]] to i16
888
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i16 [[N:%.*]], [[ZEXT]]
889
+ ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
890
+ ; CHECK: for.end:
891
+ ; CHECK-NEXT: ret void
892
+ ;
893
+ entry:
894
+ br label %for.body
895
+
896
+ for.body: ; preds = %entry, %for.body
897
+ %iv = phi i8 [ %iv.next , %for.body ], [ 0 , %entry ]
898
+ %iv.next = add i8 %iv , 1
899
+ %zext = zext i8 %iv.next to i16
900
+ %cmp = icmp ult i16 %n , %zext
901
+ br i1 %cmp , label %for.body , label %for.end
902
+
903
+ for.end: ; preds = %for.body, %entry
904
+ ret void
905
+ }
0 commit comments