diff options
author | Andrew Trick <atrick@apple.com> | 2011-09-13 01:59:32 +0000 |
---|---|---|
committer | Andrew Trick <atrick@apple.com> | 2011-09-13 01:59:32 +0000 |
commit | 94f2c23d24b3ca682ea192f1d9a4e2c2e0f4eeb3 (patch) | |
tree | 56fe11068f62daa9bc73ea845eccf61c8dd7d41d | |
parent | cee58a69fa3f0f291c0c88ce0d29099a95495ae7 (diff) | |
download | llvm-94f2c23d24b3ca682ea192f1d9a4e2c2e0f4eeb3.tar.gz llvm-94f2c23d24b3ca682ea192f1d9a4e2c2e0f4eeb3.tar.bz2 llvm-94f2c23d24b3ca682ea192f1d9a4e2c2e0f4eeb3.tar.xz |
[indvars] Fix bugs in floating point IV range checks noticed by inspection.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@139574 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/Scalar/IndVarSimplify.cpp | 20 | ||||
-rw-r--r-- | test/Transforms/IndVarSimplify/floating-point-iv.ll | 6 |
2 files changed, 13 insertions, 13 deletions
diff --git a/lib/Transforms/Scalar/IndVarSimplify.cpp b/lib/Transforms/Scalar/IndVarSimplify.cpp index 3a4580e100..b5500dec6e 100644 --- a/lib/Transforms/Scalar/IndVarSimplify.cpp +++ b/lib/Transforms/Scalar/IndVarSimplify.cpp @@ -351,14 +351,14 @@ void IndVarSimplify::HandleFloatingPointIV(Loop *L, PHINode *PN) { // Positive and negative strides have different safety conditions. if (IncValue > 0) { // If we have a positive stride, we require the init to be less than the - // exit value and an equality or less than comparison. - if (InitValue >= ExitValue || - NewPred == CmpInst::ICMP_SGT || NewPred == CmpInst::ICMP_SGE) + // exit value. + if (InitValue >= ExitValue) return; uint32_t Range = uint32_t(ExitValue-InitValue); - if (NewPred == CmpInst::ICMP_SLE) { - // Normalize SLE -> SLT, check for infinite loop. + // Check for infinite loop, either: + // while (i <= Exit) or until (i > Exit) + if (NewPred == CmpInst::ICMP_SLE || NewPred == CmpInst::ICMP_SGT) { if (++Range == 0) return; // Range overflows. } @@ -378,14 +378,14 @@ void IndVarSimplify::HandleFloatingPointIV(Loop *L, PHINode *PN) { } else { // If we have a negative stride, we require the init to be greater than the - // exit value and an equality or greater than comparison. - if (InitValue >= ExitValue || - NewPred == CmpInst::ICMP_SLT || NewPred == CmpInst::ICMP_SLE) + // exit value. + if (InitValue <= ExitValue) return; uint32_t Range = uint32_t(InitValue-ExitValue); - if (NewPred == CmpInst::ICMP_SGE) { - // Normalize SGE -> SGT, check for infinite loop. + // Check for infinite loop, either: + // while (i >= Exit) or until (i < Exit) + if (NewPred == CmpInst::ICMP_SGE || NewPred == CmpInst::ICMP_SLT) { if (++Range == 0) return; // Range overflows. } diff --git a/test/Transforms/IndVarSimplify/floating-point-iv.ll b/test/Transforms/IndVarSimplify/floating-point-iv.ll index 8f4b87048a..e334f069b8 100644 --- a/test/Transforms/IndVarSimplify/floating-point-iv.ll +++ b/test/Transforms/IndVarSimplify/floating-point-iv.ll @@ -67,7 +67,8 @@ bb: ; preds = %bb, %entry return: ret void ; CHECK: @test4 -; CHECK: fcmp +; CHECK-NOT: cmp +; CHECK: br i1 false } ; PR6761 @@ -84,9 +85,8 @@ define void @test5() nounwind { exit: ret void - + ; CHECK: @test5 ; CHECK: icmp eq i32 {{.*}}, 10 ; CHECK-NEXT: br i1 } - |