aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2011-04-18 13:58:47 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2011-04-18 13:58:47 +0000
commit75e802cc5f06a9db7d7e2509d658538b3142d86b (patch)
tree28a9745323155c7dca610704660532e04a391173 /gcc/tree.c
parent3b45a007ef93933c0c70c37cb87bf6097db68a32 (diff)
downloadgcc-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/tree.c')
-rw-r--r--gcc/tree.c26
1 files changed, 13 insertions, 13 deletions
diff --git a/gcc/tree.c b/gcc/tree.c
index e36d4d8..57e8e684 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -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