aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vrp.c
diff options
context:
space:
mode:
authorXinliang David Li <davidxl@google.com>2010-11-09 02:01:06 +0000
committerXinliang David Li <davidxl@gcc.gnu.org>2010-11-09 02:01:06 +0000
commitb3a50850b16796a6bb2505cabf14571e1e13c656 (patch)
tree77b19f0611ab2226e65c86445c21d58557e5a8ab /gcc/tree-vrp.c
parentd5214afa121044b22e6c0b5c662f148f26c089d1 (diff)
downloadgcc-b3a50850b16796a6bb2505cabf14571e1e13c656.zip
gcc-b3a50850b16796a6bb2505cabf14571e1e13c656.tar.gz
gcc-b3a50850b16796a6bb2505cabf14571e1e13c656.tar.bz2
Fix PR/46316
From-SVN: r166469
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r--gcc/tree-vrp.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 2103e1b..d77cdef 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -3403,13 +3403,18 @@ adjust_range_with_scev (value_range_t *vr, struct loop *loop,
{
value_range_t maxvr = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
double_int dtmp;
- dtmp = double_int_mul (tree_to_double_int (step),
- double_int_sub (loop->nb_iterations_upper_bound,
- double_int_one));
+ bool unsigned_p = TYPE_UNSIGNED (TREE_TYPE (step));
+ int overflow = 0;
+
+ dtmp = double_int_mul_with_sign (tree_to_double_int (step),
+ double_int_sub (
+ loop->nb_iterations_upper_bound,
+ double_int_one),
+ unsigned_p, &overflow);
tem = double_int_to_tree (TREE_TYPE (init), dtmp);
/* If the multiplication overflowed we can't do a meaningful
adjustment. */
- if (double_int_equal_p (dtmp, tree_to_double_int (tem)))
+ if (!overflow && double_int_equal_p (dtmp, tree_to_double_int (tem)))
{
extract_range_from_binary_expr (&maxvr, PLUS_EXPR,
TREE_TYPE (init), init, tem);