From: Richard Kenner Date: Tue, 14 Nov 2000 17:58:01 +0000 (+0000) Subject: tree.c (get_unwidened): Use host_integerp and tree_low_cst. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3401c26b5cce41f75a511d1ee60ccadb876c5fb3;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e0dd9f7e968..613a7b28942 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Tue Nov 14 12:34:56 2000 Richard Kenner + + * 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 * varasm.c (struct deferred_string): New structure. diff --git a/gcc/tree.c b/gcc/tree.c index 556a0631eb0..4b3e9300efc 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