summaryrefslogtreecommitdiff
path: root/lib/Analysis
diff options
context:
space:
mode:
authorHal Finkel <hfinkel@anl.gov>2012-10-24 19:46:44 +0000
committerHal Finkel <hfinkel@anl.gov>2012-10-24 19:46:44 +0000
commit8c65549318950ff3fc1cb3d7a73fb50c688c78a5 (patch)
treefd174875c34cec9db5e130538cb2e7ee02e40283 /lib/Analysis
parent99abc17832b36007c66369321c0c2f5a2a7713f1 (diff)
downloadllvm-8c65549318950ff3fc1cb3d7a73fb50c688c78a5.tar.gz
llvm-8c65549318950ff3fc1cb3d7a73fb50c688c78a5.tar.bz2
llvm-8c65549318950ff3fc1cb3d7a73fb50c688c78a5.tar.xz
getSmallConstantTripMultiple should never return zero.
When the trip count is -1, getSmallConstantTripMultiple could return zero, and this would cause runtime loop unrolling to assert. Instead of returning zero, one is now returned (consistent with the existing overflow cases). Fixes PR14167. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@166612 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis')
-rw-r--r--lib/Analysis/ScalarEvolution.cpp7
1 files changed, 5 insertions, 2 deletions
diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp
index 3e06298882..148912b766 100644
--- a/lib/Analysis/ScalarEvolution.cpp
+++ b/lib/Analysis/ScalarEvolution.cpp
@@ -3979,8 +3979,11 @@ getSmallConstantTripMultiple(Loop *L, BasicBlock *ExitingBlock) {
ConstantInt *Result = MulC->getValue();
- // Guard against huge trip counts.
- if (!Result || Result->getValue().getActiveBits() > 32)
+ // Guard against huge trip counts (this requires checking
+ // for zero to handle the case where the trip count == -1 and the
+ // addition wraps).
+ if (!Result || Result->getValue().getActiveBits() > 32 ||
+ Result->getValue().getActiveBits() == 0)
return 1;
return (unsigned)Result->getZExtValue();