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 | 3de5b8e4c19104f245dfd95ff808de9c9fcb2f60 (patch) | |
| tree | ed4ee0c2e518060f12df68ac9d21be40f8e3945b /llvm/lib/Transforms | |
| parent | 40ddfedd6c1c9bc704a08d7cd688869a60284efc (diff) | |
| download | bcm5719-llvm-3de5b8e4c19104f245dfd95ff808de9c9fcb2f60.tar.gz bcm5719-llvm-3de5b8e4c19104f245dfd95ff808de9c9fcb2f60.zip | |
[indvars] Fix bugs in floating point IV range checks noticed by inspection.
llvm-svn: 139574
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/IndVarSimplify.cpp | 20 | 
1 files changed, 10 insertions, 10 deletions
| diff --git a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp index 3a4580e1007..b5500dec6e7 100644 --- a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp +++ b/llvm/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.      } | 

