@@ -1,5 +1,5 @@
/* Operations with very long integers.
- Copyright (C) 2012-2013 Free Software Foundation, Inc.
+ Copyright (C) 2012-2014 Free Software Foundation, Inc.
Contributed by Kenneth Zadeck <zadeck@naturalbridge.com>
This file is part of GCC.
@@ -1282,6 +1282,12 @@ wi::mul_internal (HOST_WIDE_INT *val, co
&& wi::fits_uhwi_p (op1)
&& wi::fits_uhwi_p (op2))
{
+ /* This case never overflows. */
+ if (high)
+ {
+ val[0] = 0;
+ return 1;
+ }
umul_ppmm (val[1], val[0], op1.ulow (), op2.ulow ());
return 1 + (val[1] != 0 || val[0] < 0);
}
@@ -1294,6 +1300,8 @@ wi::mul_internal (HOST_WIDE_INT *val, co
umul_ppmm (upper, val[0], op1.ulow (), op2.ulow ());
if (needs_overflow)
*overflow = (upper != 0);
+ if (high)
+ val[0] = upper;
return 1;
}
}
@@ -1302,12 +1310,28 @@ wi::mul_internal (HOST_WIDE_INT *val, co
/* Handle multiplications by 1. */
if (op1 == 1)
{
+ if (high)
+ {
+ if (sgn == SIGNED && wi::neg_p (op2))
+ val[0] = -1;
+ else
+ val[0] = 0;
+ return 1;
+ }
for (i = 0; i < op2len; i++)
val[i] = op2val[i];
return op2len;
}
if (op2 == 1)
{
+ if (high)
+ {
+ if (sgn == SIGNED && wi::neg_p (op1))
+ val[0] = -1;
+ else
+ val[0] = 0;
+ return 1;
+ }
for (i = 0; i < op1len; i++)
val[i] = op1val[i];
return op1len;
@@ -0,0 +1,17 @@
+/* PR tree-optimization/61682 */
+
+int a, b;
+static int *c = &b;
+
+int
+main ()
+{
+ int *d = &a;
+ for (a = 0; a < 12; a++)
+ *c |= *d / 9;
+
+ if (b != 1)
+ __builtin_abort ();
+
+ return 0;
+}