+2010-11-08 Xinliang David Li <davidxl@google.com>
+
+ PR/46316
+ * tree-vrp.c (adjust_range_with_scev): Check double_int
+ overflow.
+ * double-int.h (double_int_mul_with_sign): New function.
+ * double-int.c (double_int_mul_with_sign): New function.
+
2010-11-08 Paul Koning <ni1d@arrl.net>
* config/pdp11/pdp11.md (lshrsi3, lshrhi3): Fix wrong code.
return ret;
}
+/* Returns A * B. If the operation overflows according to UNSIGNED_P,
+ *OVERFLOW is set to nonzero. */
+
+double_int
+double_int_mul_with_sign (double_int a, double_int b,
+ bool unsigned_p, int *overflow)
+{
+ double_int ret;
+ *overflow = mul_double_with_sign (a.low, a.high, b.low, b.high,
+ &ret.low, &ret.high, unsigned_p);
+ return ret;
+}
+
/* Returns A + B. */
double_int
2 * HOST_BITS_PER_WIDE_INT bits. */
double_int double_int_mul (double_int, double_int);
+double_int double_int_mul_with_sign (double_int, double_int, bool, int *);
double_int double_int_add (double_int, double_int);
double_int double_int_sub (double_int, double_int);
double_int double_int_neg (double_int);
+2010-11-08 Xinliang David Li <davidxl@google.com>
+
+ PR/46316
+ * gcc.dg/tree-ssa/pr46316.c: New test.
+
2010-11-08 Janus Weil <janus@gcc.gnu.org>
PR fortran/46344
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+extern void abort (void);
+
+long long __attribute__((noinline,noclone))
+foo (long long t)
+{
+ while (t > -4)
+ t -= 2;
+
+ return t;
+}
+
+int main(void)
+{
+ if (foo (0) != -4)
+ abort ();
+ return 0;
+}
{
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);