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
This commit is contained in:
Richard Kenner 2000-11-14 17:58:01 +00:00 committed by Richard Kenner
parent bd7cf17efd
commit 3401c26b5c
2 changed files with 32 additions and 17 deletions

View File

@ -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.

View File

@ -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