diff options
author | Xinliang David Li <davidxl@google.com> | 2010-11-09 02:01:06 +0000 |
---|---|---|
committer | Xinliang David Li <davidxl@gcc.gnu.org> | 2010-11-09 02:01:06 +0000 |
commit | b3a50850b16796a6bb2505cabf14571e1e13c656 (patch) | |
tree | 77b19f0611ab2226e65c86445c21d58557e5a8ab /gcc/tree-vrp.c | |
parent | d5214afa121044b22e6c0b5c662f148f26c089d1 (diff) | |
download | gcc-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.c | 13 |
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); |