aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@vlsi1.ultra.nyu.edu>2000-11-14 17:58:01 +0000
committerRichard Kenner <kenner@gcc.gnu.org>2000-11-14 12:58:01 -0500
commit3401c26b5cce41f75a511d1ee60ccadb876c5fb3 (patch)
treebc239a82c689dfcc3bdc873efab8db9073102de3 /gcc
parentbd7cf17efd38b94f26bcf0c309c6b9053c0a21dd (diff)
downloadgcc-3401c26b5cce41f75a511d1ee60ccadb876c5fb3.zip
gcc-3401c26b5cce41f75a511d1ee60ccadb876c5fb3.tar.gz
gcc-3401c26b5cce41f75a511d1ee60ccadb876c5fb3.tar.bz2
tree.c (get_unwidened): Use host_integerp and tree_low_cst.
* tree.c (get_unwidened): Use host_integerp and tree_low_cst. (int_fits_type_p): For variable bounds, call force_fit_type. From-SVN: r37460
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/tree.c44
2 files changed, 32 insertions, 17 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e0dd9f7..613a7b2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+Tue Nov 14 12:34:56 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * tree.c (get_unwidened): Use host_integerp and tree_low_cst.
+ (int_fits_type_p): For variable bounds, call force_fit_type.
+
2000-11-14 Jakub Jelinek <jakub@redhat.com>
* varasm.c (struct deferred_string): New structure.
diff --git a/gcc/tree.c b/gcc/tree.c
index 556a063..4b3e930 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -4210,10 +4210,11 @@ get_unwidened (op, for_type)
/* Since type_for_size always gives an integer type. */
&& TREE_CODE (type) != REAL_TYPE
/* Don't crash if field not laid out yet. */
- && DECL_SIZE (TREE_OPERAND (op, 1)) != 0)
+ && DECL_SIZE (TREE_OPERAND (op, 1)) != 0
+ && host_integerp (DECL_SIZE (TREE_OPERAND (op, 1)), 1))
{
unsigned int innerprec
- = TREE_INT_CST_LOW (DECL_SIZE (TREE_OPERAND (op, 1)));
+ = tree_low_cst (DECL_SIZE (TREE_OPERAND (op, 1)), 1);
type = type_for_size (innerprec, TREE_UNSIGNED (TREE_OPERAND (op, 1)));
@@ -4235,6 +4236,7 @@ get_unwidened (op, for_type)
TREE_THIS_VOLATILE (win) = TREE_THIS_VOLATILE (op);
}
}
+
return win;
}
@@ -4333,22 +4335,30 @@ int
int_fits_type_p (c, type)
tree c, type;
{
- if (TREE_UNSIGNED (type))
- return (! (TREE_CODE (TYPE_MAX_VALUE (type)) == INTEGER_CST
- && INT_CST_LT_UNSIGNED (TYPE_MAX_VALUE (type), c))
- && ! (TREE_CODE (TYPE_MIN_VALUE (type)) == INTEGER_CST
- && INT_CST_LT_UNSIGNED (c, TYPE_MIN_VALUE (type)))
- /* Negative ints never fit unsigned types. */
- && ! (TREE_INT_CST_HIGH (c) < 0
- && ! TREE_UNSIGNED (TREE_TYPE (c))));
+ /* If the bounds of the type are integers, we can check ourselves.
+ Otherwise,. use force_fit_type, which checks against the precision. */
+ if (TREE_CODE (TYPE_MAX_VALUE (type)) == INTEGER_CST
+ && TREE_CODE (TYPE_MIN_VALUE (type)) == INTEGER_CST)
+ {
+ if (TREE_UNSIGNED (type))
+ return (! INT_CST_LT_UNSIGNED (TYPE_MAX_VALUE (type), c)
+ && ! INT_CST_LT_UNSIGNED (c, TYPE_MIN_VALUE (type))
+ /* Negative ints never fit unsigned types. */
+ && ! (TREE_INT_CST_HIGH (c) < 0
+ && ! TREE_UNSIGNED (TREE_TYPE (c))));
+ else
+ return (! INT_CST_LT (TYPE_MAX_VALUE (type), c)
+ && ! INT_CST_LT (c, TYPE_MIN_VALUE (type))
+ /* Unsigned ints with top bit set never fit signed types. */
+ && ! (TREE_INT_CST_HIGH (c) < 0
+ && TREE_UNSIGNED (TREE_TYPE (c))));
+ }
else
- return (! (TREE_CODE (TYPE_MAX_VALUE (type)) == INTEGER_CST
- && INT_CST_LT (TYPE_MAX_VALUE (type), c))
- && ! (TREE_CODE (TYPE_MIN_VALUE (type)) == INTEGER_CST
- && INT_CST_LT (c, TYPE_MIN_VALUE (type)))
- /* Unsigned ints with top bit set never fit signed types. */
- && ! (TREE_INT_CST_HIGH (c) < 0
- && TREE_UNSIGNED (TREE_TYPE (c))));
+ {
+ c = copy_node (c);
+ TREE_TYPE (c) = type;
+ return !force_fit_type (c, 0);
+ }
}
/* Given a DECL or TYPE, return the scope in which it was declared, or