diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index 1482a47158a76..b9a319474ed6c 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -10704,8 +10704,13 @@ bool ScalarEvolution::isImpliedCondBalancedTypes( // Unsigned comparison is the same as signed comparison when both the operands // are non-negative or negative. - if (CmpInst::isUnsigned(FoundPred) && - CmpInst::getSignedPredicate(FoundPred) == Pred && + auto IsSignFlippedPredicate = [](CmpInst::Predicate P1, + CmpInst::Predicate P2) { + assert(P1 != P2 && "Handled earlier!"); + return CmpInst::isRelational(P2) && + P1 == CmpInst::getFlippedSignednessPredicate(P2); + }; + if (IsSignFlippedPredicate(Pred, FoundPred) && ((isKnownNonNegative(FoundLHS) && isKnownNonNegative(FoundRHS)) || (isKnownNegative(FoundLHS) && isKnownNegative(FoundRHS)))) return isImpliedCondOperands(Pred, LHS, RHS, FoundLHS, FoundRHS, CtxI); diff --git a/llvm/test/Transforms/IndVarSimplify/negative_ranges.ll b/llvm/test/Transforms/IndVarSimplify/negative_ranges.ll index 5db305ab68a16..67fd05465d3f7 100644 --- a/llvm/test/Transforms/IndVarSimplify/negative_ranges.ll +++ b/llvm/test/Transforms/IndVarSimplify/negative_ranges.ll @@ -4,7 +4,6 @@ declare i1 @cond() -; FIXME: 2nd check is implied by the 1st one as both values are negative. define i32 @test_01(i32* %p, i32* %s) { ; CHECK-LABEL: @test_01( ; CHECK-NEXT: entry: @@ -16,8 +15,7 @@ define i32 @test_01(i32* %p, i32* %s) { ; CHECK-NEXT: [[C1:%.*]] = icmp slt i32 [[IV]], [[END]] ; CHECK-NEXT: br i1 [[C1]], label [[GUARDED:%.*]], label [[SIDE_EXIT:%.*]] ; CHECK: guarded: -; CHECK-NEXT: [[C2:%.*]] = icmp ult i32 [[IV]], [[END]] -; CHECK-NEXT: br i1 [[C2]], label [[BACKEDGE]], label [[SIDE_EXIT]] +; CHECK-NEXT: br i1 true, label [[BACKEDGE]], label [[SIDE_EXIT]] ; CHECK: backedge: ; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 ; CHECK-NEXT: [[LOOP_COND:%.*]] = call i1 @cond()