aboutsummaryrefslogtreecommitdiff
path: root/gcc/fold-const.c
diff options
context:
space:
mode:
authorRoger Sayle <sayle@gcc.gnu.org>2007-01-30 04:39:59 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2007-01-30 04:39:59 +0000
commitbcf52d7b57feb18b8839c3b0706c367c6018a876 (patch)
tree3dcbb29663a562dd3b54c1da772ca6214bb6d2c1 /gcc/fold-const.c
parent2828987879a62a861500d4b1d5649575a07e0b78 (diff)
downloadgcc-bcf52d7b57feb18b8839c3b0706c367c6018a876.zip
gcc-bcf52d7b57feb18b8839c3b0706c367c6018a876.tar.gz
gcc-bcf52d7b57feb18b8839c3b0706c367c6018a876.tar.bz2
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
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r--gcc/fold-const.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index a7a12eb..e0cab9c 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -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);