diff options
author | Richard Guenther <rguenther@suse.de> | 2011-04-18 13:58:47 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2011-04-18 13:58:47 +0000 |
commit | 75e802cc5f06a9db7d7e2509d658538b3142d86b (patch) | |
tree | 28a9745323155c7dca610704660532e04a391173 /gcc | |
parent | 3b45a007ef93933c0c70c37cb87bf6097db68a32 (diff) | |
download | gcc-75e802cc5f06a9db7d7e2509d658538b3142d86b.zip gcc-75e802cc5f06a9db7d7e2509d658538b3142d86b.tar.gz gcc-75e802cc5f06a9db7d7e2509d658538b3142d86b.tar.bz2 |
tree.c (upper_bound_in_type): Build properly canonicalized INTEGER_CSTs.
2011-04-18 Richard Guenther <rguenther@suse.de>
* tree.c (upper_bound_in_type): Build properly canonicalized
INTEGER_CSTs.
(lower_bound_in_type): Likewise.
From-SVN: r172645
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/tree.c | 26 |
2 files changed, 19 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 49c0481..8e6dda6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2011-04-18 Richard Guenther <rguenther@suse.de> + * tree.c (upper_bound_in_type): Build properly canonicalized + INTEGER_CSTs. + (lower_bound_in_type): Likewise. + +2011-04-18 Richard Guenther <rguenther@suse.de> + * gimple.h (gimple_call_addr_fndecl): New function. (gimple_call_fndecl): Use it. * gimple-fold.c (gimple_fold_call): Fold away OBJ_TYPE_REFs @@ -9964,7 +9964,7 @@ signed_type_for (tree type) tree upper_bound_in_type (tree outer, tree inner) { - unsigned HOST_WIDE_INT lo, hi; + double_int high; unsigned int det = 0; unsigned oprec = TYPE_PRECISION (outer); unsigned iprec = TYPE_PRECISION (inner); @@ -10011,18 +10011,18 @@ upper_bound_in_type (tree outer, tree inner) /* Compute 2^^prec - 1. */ if (prec <= HOST_BITS_PER_WIDE_INT) { - hi = 0; - lo = ((~(unsigned HOST_WIDE_INT) 0) + high.high = 0; + high.low = ((~(unsigned HOST_WIDE_INT) 0) >> (HOST_BITS_PER_WIDE_INT - prec)); } else { - hi = ((~(unsigned HOST_WIDE_INT) 0) + high.high = ((~(unsigned HOST_WIDE_INT) 0) >> (2 * HOST_BITS_PER_WIDE_INT - prec)); - lo = ~(unsigned HOST_WIDE_INT) 0; + high.low = ~(unsigned HOST_WIDE_INT) 0; } - return build_int_cst_wide (outer, lo, hi); + return double_int_to_tree (outer, high); } /* Returns the smallest value obtainable by casting something in INNER type to @@ -10031,7 +10031,7 @@ upper_bound_in_type (tree outer, tree inner) tree lower_bound_in_type (tree outer, tree inner) { - unsigned HOST_WIDE_INT lo, hi; + double_int low; unsigned oprec = TYPE_PRECISION (outer); unsigned iprec = TYPE_PRECISION (inner); @@ -10042,7 +10042,7 @@ lower_bound_in_type (tree outer, tree inner) contains all values of INNER type. In particular, both INNER and OUTER types have zero in common. */ || (oprec > iprec && TYPE_UNSIGNED (inner))) - lo = hi = 0; + low.low = low.high = 0; else { /* If we are widening a signed type to another signed type, we @@ -10053,18 +10053,18 @@ lower_bound_in_type (tree outer, tree inner) if (prec <= HOST_BITS_PER_WIDE_INT) { - hi = ~(unsigned HOST_WIDE_INT) 0; - lo = (~(unsigned HOST_WIDE_INT) 0) << (prec - 1); + low.high = ~(unsigned HOST_WIDE_INT) 0; + low.low = (~(unsigned HOST_WIDE_INT) 0) << (prec - 1); } else { - hi = ((~(unsigned HOST_WIDE_INT) 0) + low.high = ((~(unsigned HOST_WIDE_INT) 0) << (prec - HOST_BITS_PER_WIDE_INT - 1)); - lo = 0; + low.low = 0; } } - return build_int_cst_wide (outer, lo, hi); + return double_int_to_tree (outer, low); } /* Return nonzero if two operands that are suitable for PHI nodes are |