fold-const.c (round_up): Make HIGH an unsigned HOST_WIDE_INT to avoid undefined behaviour on overflow.

* fold-const.c (round_up): Make HIGH an unsigned HOST_WIDE_INT to
	avoid undefined behaviour on overflow.  Use force_fit_type_double
	to construct the constant with the specified TREE_OVERFLOW.

From-SVN: r121332
This commit is contained in:
Roger Sayle 2007-01-30 04:39:59 +00:00
parent 2828987879
commit bcf52d7b57
2 changed files with 19 additions and 12 deletions

View File

@ -1,9 +1,16 @@
2007-01-29 Roger Sayle <roger@eyesopen.com>
Richard Guenther <rguenther@suse.de>
* fold-const.c (round_up): Make HIGH an unsigned HOST_WIDE_INT to
avoid undefined behaviour on overflow. Use force_fit_type_double
to construct the constant with the specified TREE_OVERFLOW.
2007-01-29 Janis Johnson <janis187@us.ibm.com>
* config/dfp-bit.c: Add parameterized support for fp exceptions.
* config/dfp-bit.h: Ditto.
007-01-29 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
2007-01-29 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
* c-decl.c (pop_scope): Replace warnings with call to
warn_for_unused_label.

View File

@ -13514,33 +13514,33 @@ round_up (tree value, int divisor)
/* If divisor is a power of two, simplify this to bit manipulation. */
if (divisor == (divisor & -divisor))
{
tree t;
if (TREE_CODE (value) == INTEGER_CST)
{
unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (value);
HOST_WIDE_INT high;
unsigned HOST_WIDE_INT high;
bool overflow_p;
if ((low & (divisor - 1)) == 0)
return value;
overflow_p = TREE_OVERFLOW (value);
high = TREE_INT_CST_HIGH (value);
low &= ~(divisor - 1);
low += divisor;
if (low == 0)
high++;
t = build_int_cst_wide_type (TREE_TYPE (value), low, high);
if ((TREE_OVERFLOW (value) || integer_zerop (t))
&& !TREE_OVERFLOW (t))
{
t = copy_node (t);
TREE_OVERFLOW (t) = 1;
high++;
if (high == 0)
overflow_p = true;
}
return t;
return force_fit_type_double (TREE_TYPE (value), low, high,
-1, overflow_p);
}
else
{
tree t;
t = build_int_cst (TREE_TYPE (value), divisor - 1);
value = size_binop (PLUS_EXPR, value, t);
t = build_int_cst (TREE_TYPE (value), -divisor);