ICmp->setPredicate(InvariantPredicate);
ICmp->setOperand(0, NewLHS);
ICmp->setOperand(1, NewRHS);
- } else if (ICmpInst::isSigned(Pred) &&
- SE->isKnownNonNegative(S) && SE->isKnownNonNegative(X)) {
- DEBUG(dbgs() << "INDVARS: Turn to unsigned comparison: " << *ICmp << '\n');
- ICmp->setPredicate(ICmpInst::getUnsignedPredicate(Pred));
} else
return;
loop:
; CHECK: loop:
; CHECK: call void (i1, ...) @llvm.experimental.guard(i1 true) [ "deopt"() ]
-; CHECK: %iv.inc.cmp = icmp ult i32 %iv.inc, %len
+; CHECK: %iv.inc.cmp = icmp slt i32 %iv.inc, %len
; CHECK: call void (i1, ...) @llvm.experimental.guard(i1 %iv.inc.cmp) [ "deopt"() ]
; CHECK: leave:
define void @test_2(i32 %n, i32* %len_buf) {
; CHECK-LABEL: @test_2(
-; CHECK: [[LEN_ZEXT:%[^ ]+]] = zext i32 %len to i64
+; CHECK: [[LEN_SEXT:%[^ ]+]] = sext i32 %len to i64
; CHECK: br label %loop
entry:
; CHECK: loop:
; CHECK: %indvars.iv = phi i64 [ %indvars.iv.next, %loop ], [ 0, %entry ]
; CHECK: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
-; CHECK: %iv.inc.cmp = icmp ult i64 %indvars.iv.next, [[LEN_ZEXT]]
+; CHECK: %iv.inc.cmp = icmp slt i64 %indvars.iv.next, [[LEN_SEXT]]
; CHECK: call void (i1, ...) @llvm.experimental.guard(i1 %iv.inc.cmp) [ "deopt"() ]
; CHECK: leave:
+++ /dev/null
-; RUN: opt -S -indvars < %s | FileCheck %s
-
-; Check that we replace signed comparisons between non-negative values with
-; unsigned comparisons if we can.
-
-target datalayout = "n8:16:32:64"
-
-define i32 @test_01(i32 %a, i32 %b, i32* %p) {
-
-; CHECK-LABEL: @test_01(
-; CHECK-NOT: icmp slt
-; CHECK: %cmp1 = icmp ult i32 %iv, 100
-; CHECK: %cmp2 = icmp ult i32 %iv, 100
-; CHECK-NOT: %cmp3
-; CHECK: %exitcond = icmp ne i32 %iv.next, 1000
-
-entry:
- br label %loop.entry
-
-loop.entry:
- %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.be ]
- %cmp1 = icmp slt i32 %iv, 100
- br i1 %cmp1, label %b1, label %b2
-
-b1:
- store i32 %iv, i32* %p
- br label %merge
-
-b2:
- store i32 %a, i32* %p
- br label %merge
-
-merge:
- %cmp2 = icmp ult i32 %iv, 100
- br i1 %cmp2, label %b3, label %b4
-
-b3:
- store i32 %iv, i32* %p
- br label %loop.be
-
-b4:
- store i32 %b, i32* %p
- br label %loop.be
-
-loop.be:
- %iv.next = add i32 %iv, 1
- %cmp3 = icmp slt i32 %iv.next, 1000
- br i1 %cmp3, label %loop.entry, label %exit
-
-exit:
- ret i32 %iv
-}
; Indvars should not turn the second loop into an infinite one.
; CHECK-LABEL: @func_11(
-; CHECK: %tmp5 = icmp ult i32 %__key6.0, 10
+; CHECK: %tmp5 = icmp slt i32 %__key6.0, 10
; CHECK-NOT: br i1 true, label %noassert68, label %unrolledend
define i32 @func_11() nounwind uwtable {
; In this case the second loop only has a single iteration, fold the header away
; CHECK-LABEL: @func_12(
-; CHECK: %tmp5 = icmp ult i32 %__key6.0, 10
+; CHECK: %tmp5 = icmp slt i32 %__key6.0, 10
; CHECK: br i1 true, label %noassert68, label %unrolledend
define i32 @func_12() nounwind uwtable {
entry:
; CHECK-LABEL: @test2
; CHECK: for.body4.us
; CHECK: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
-; CHECK: %cmp2.us = icmp ult i64
+; CHECK: %cmp2.us = icmp slt i64
; CHECK-NOT: %2 = trunc i64 %indvars.iv.next to i32
; CHECK-NOT: %cmp2.us = icmp slt i32