--- ../trunk/gcc/fold-const.c 2008-04-19 17:50:58.000000000 -0700 +++ fold-const.c 2008-04-19 17:53:16.000000000 -0700 @@ -8401,9 +8401,8 @@ static bool pointer_may_wrap_p (tree base, tree offset, HOST_WIDE_INT bitpos) { - tree size; unsigned HOST_WIDE_INT offset_low, total_low; - HOST_WIDE_INT offset_high, total_high; + HOST_WIDE_INT size, offset_high, total_high; if (!POINTER_TYPE_P (TREE_TYPE (base))) return true; @@ -8411,18 +8410,16 @@ if (bitpos < 0) return true; - size = size_in_bytes (TREE_TYPE (TREE_TYPE (base))); - if (size == NULL_TREE || TREE_CODE (size) != INTEGER_CST) + size = int_size_in_bytes (TREE_TYPE (TREE_TYPE (base))); + if (size <= 0) return true; /* We can do slightly better for SIZE if we have an ADDR_EXPR of an array. */ if (TREE_CODE (base) == ADDR_EXPR) { - tree base_size = size_in_bytes (TREE_TYPE (TREE_OPERAND (base, 0))); - if (base_size != NULL_TREE - && TREE_CODE (base_size) == INTEGER_CST - && INT_CST_LT_UNSIGNED (size, base_size)) + tree base_size = int_size_in_bytes (TREE_TYPE (TREE_OPERAND (base, 0))); + if (base_size > 0 && size < base_size) size = base_size; } @@ -8445,13 +8442,9 @@ true)) return true; - if ((unsigned HOST_WIDE_INT) total_high - < (unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (size)) + if (total_high != 0) return false; - if ((unsigned HOST_WIDE_INT) total_high - > (unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (size)) - return true; - return total_low > TREE_INT_CST_LOW (size); + return total_low > (unsigned HOST_WIDE_INT) size; } /* Subroutine of fold_binary. This routine performs all of the