Index: llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp =================================================================== --- llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp +++ llvm/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp @@ -696,12 +696,7 @@ APInt::getMinValue(BitWidth); const SCEV *Limit = SE.getMinusSCEV(SE.getConstant(Min), StepPlusOne); - const SCEV *MinusOne = - SE.getMinusSCEV(BoundSCEV, SE.getOne(BoundSCEV->getType())); - - return SE.isLoopEntryGuardedByCond(L, BoundPred, Start, MinusOne) && - SE.isLoopEntryGuardedByCond(L, BoundPred, BoundSCEV, Limit); - + return SE.isLoopEntryGuardedByCond(L, BoundPred, BoundSCEV, Limit); } /// Given a loop with an increasing induction variable, is it possible to @@ -744,9 +739,7 @@ APInt::getMaxValue(BitWidth); const SCEV *Limit = SE.getMinusSCEV(SE.getConstant(Max), StepMinusOne); - return (SE.isLoopEntryGuardedByCond(L, BoundPred, Start, - SE.getAddExpr(BoundSCEV, Step)) && - SE.isLoopEntryGuardedByCond(L, BoundPred, BoundSCEV, Limit)); + return SE.isLoopEntryGuardedByCond(L, BoundPred, BoundSCEV, Limit); } Optional Index: llvm/test/Transforms/IRCE/variable-loop-bounds.ll =================================================================== --- llvm/test/Transforms/IRCE/variable-loop-bounds.ll +++ llvm/test/Transforms/IRCE/variable-loop-bounds.ll @@ -9,6 +9,12 @@ ; CHECK: irce: in function signed_var_imm_dec_sge: constrained Loop at depth 1 containing: %for.body
,%if.else,%for.inc ; CHECK: irce: in function signed_var_imm_dec_ne: constrained Loop at depth 1 containing: %for.body
,%if.else,%for.inc ; CHECK-NOT: irce: in function signed_var_imm_dec_eq: constrained Loop at depth 1 containing: %for.body
,%if.else,%for.inc +; CHECK: irce: in function test_dec_bound: constrained Loop at depth 1 containing: %7
,%10,%11 +; CHECK: irce: in function test_inc_bound: constrained Loop at depth 1 containing: %2
,%5,%6 +; CHECK-NOT: irce: in function test_dec_bound_with_step_not_one: constrained Loop at depth 1 containing: %7
,%10,%11 +; CHECK-NOT: irce: in function test_inc_bound_with_step_not_one: constrained Loop at depth 1 containing: %2
,%5,%6 +; CHECK-NOT: irce: in function test_dec_bound_with_min_start: constrained Loop at depth 1 containing: %7
,%10,%11 +; CHECK-NOT: irce: in function test_inc_bound_with_max_start: constrained Loop at depth 1 containing: %2
,%5,%6 ; CHECK-LABEL: test_inc_eq( ; CHECK: main.exit.selector: @@ -352,3 +358,123 @@ %cmp = icmp eq i32 %dec, %M br i1 %cmp, label %for.cond.cleanup, label %for.body } + +define void @test_dec_bound(i64 %0, i64 %1) { + br label %3 + +3: ; preds = %7, %2 + %4 = phi i64 [ %8, %7 ], [ %1, %2 ] + %5 = icmp slt i64 %4, %0 + br i1 %5, label %6, label %7 + +6: ; preds = %3 + br label %7 + +7: ; preds = %6, %3 + %8 = add nuw nsw i64 %4, -1 + %9 = icmp eq i64 %8, 0 + br i1 %9, label %10, label %3 + +10: ; preds = %7 + ret void +} + +define void @test_inc_bound(i64 %0) { + br label %2 + +2: ; preds = %6, %1 + %3 = phi i64 [ %7, %6 ], [ 1, %1 ] + %4 = icmp slt i64 %3, %0 + br i1 %4, label %5, label %6 + +5: ; preds = %2 + br label %6 + +6: ; preds = %5, %2 + %7 = add nuw nsw i64 %3, 1 + %8 = icmp eq i64 %7, 0 + br i1 %8, label %9, label %2 + +9: ; preds = %6 + ret void +} + +define void @test_dec_bound_with_step_not_one(i64 %0, i64 %1) { + br label %3 + +3: ; preds = %7, %2 + %4 = phi i64 [ %8, %7 ], [ %1, %2 ] + %5 = icmp slt i64 %4, %0 + br i1 %5, label %6, label %7 + +6: ; preds = %3 + br label %7 + +7: ; preds = %6, %3 + %8 = add nuw nsw i64 %4, -2 + %9 = icmp eq i64 %8, 0 + br i1 %9, label %10, label %3 + +10: ; preds = %7 + ret void +} + +define void @test_inc_bound_with_step_not_one(i64 %0) { + br label %2 + +2: ; preds = %6, %1 + %3 = phi i64 [ %7, %6 ], [ 1, %1 ] + %4 = icmp slt i64 %3, %0 + br i1 %4, label %5, label %6 + +5: ; preds = %2 + br label %6 + +6: ; preds = %5, %2 + %7 = add nuw nsw i64 %3, 2 + %8 = icmp eq i64 %7, 0 + br i1 %8, label %9, label %2 + +9: ; preds = %6 + ret void +} + +define void @test_dec_bound_with_min_start(i32 %0, i32 %1) { + br label %3 + +3: ; preds = %7, %2 + %4 = phi i32 [ %8, %7 ], [ -2147483648, %2 ] + %5 = icmp slt i32 %4, %0 + br i1 %5, label %6, label %7 + +6: ; preds = %3 + br label %7 + +7: ; preds = %6, %3 + %8 = add nsw i32 %4, -2 + %9 = icmp eq i32 %8, 0 + br i1 %9, label %10, label %3 + +10: ; preds = %7 + ret void +} + +define void @test_inc_bound_with_max_start(i32 %0) { + br label %2 + +2: ; preds = %6, %1 + %3 = phi i32 [ %7, %6 ], [ 2147483648, %1 ] + %4 = icmp slt i32 %3, %0 + br i1 %4, label %5, label %6 + +5: ; preds = %2 + br label %6 + +6: ; preds = %5, %2 + %7 = add nuw i32 %3, 1 + %8 = icmp eq i32 %7, 0 + br i1 %8, label %9, label %2 + +9: ; preds = %6 + ret void +}