diff options
author | Richard Kenner <kenner@vlsi1.ultra.nyu.edu> | 2000-11-14 17:58:01 +0000 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 2000-11-14 12:58:01 -0500 |
commit | 3401c26b5cce41f75a511d1ee60ccadb876c5fb3 (patch) | |
tree | bc239a82c689dfcc3bdc873efab8db9073102de3 /gcc | |
parent | bd7cf17efd38b94f26bcf0c309c6b9053c0a21dd (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/tree.c | 44 |
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. @@ -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 |