Skip to content

Commit c97bb5d

Browse files
committed
[tests] Precommit for generalization of D112262
1 parent 5022ac0 commit c97bb5d

File tree

1 file changed

+111
-0
lines changed

1 file changed

+111
-0
lines changed

llvm/test/Transforms/IndVarSimplify/finite-exit-comparisons.ll

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -792,3 +792,114 @@ for.body: ; preds = %entry, %for.body
792792
for.end: ; preds = %for.body, %entry
793793
ret void
794794
}
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

Comments
 (0)