tree.c (expr_first, [...]): New fns.

* tree.c (expr_first, expr_length): New fns.
        * tree.h: Declare them.

        * tree.c (iterative_hash_expr): Hash commutative expressions
        consistently.

From-SVN: r67201
This commit is contained in:
Jason Merrill 2003-05-27 18:53:01 -04:00 committed by Jason Merrill
parent f85716e06e
commit 066f50a9e7
3 changed files with 60 additions and 5 deletions

View file

@ -1,3 +1,11 @@
2003-05-27 Jason Merrill <jason@redhat.com>
* tree.c (expr_first, expr_length): New fns.
* tree.h: Declare them.
* tree.c (iterative_hash_expr): Hash commutative expressions
consistently.
2003-05027 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* tree.h (contains_placeholder_p): Now returns bool.

View file

@ -1123,11 +1123,22 @@ tree_cons (purpose, value, chain)
return node;
}
/* Return the first expression in a sequence of COMPOUND_EXPRs. */
tree
expr_first (tree expr)
{
if (expr == NULL_TREE)
return expr;
while (TREE_CODE (expr) == COMPOUND_EXPR)
expr = TREE_OPERAND (expr, 0);
return expr;
}
/* Return the last expression in a sequence of COMPOUND_EXPRs. */
tree
expr_last (expr)
tree expr;
expr_last (tree expr)
{
if (expr == NULL_TREE)
return expr;
@ -1135,6 +1146,21 @@ expr_last (expr)
expr = TREE_OPERAND (expr, 1);
return expr;
}
/* Return the number of subexpressions in a sequence of COMPOUND_EXPRs. */
int
expr_length (tree expr)
{
int len = 0;
if (expr == NULL_TREE)
return 0;
for (; TREE_CODE (expr) == COMPOUND_EXPR; expr = TREE_OPERAND (expr, 1))
len += expr_length (TREE_OPERAND (expr, 0));
++len;
return len;
}
/* Return the size nominally occupied by an object of type TYPE
when it resides in memory. The value is measured in units of bytes,
@ -3653,9 +3679,28 @@ iterative_hash_expr (tree t, hashval_t val)
if (code == NOP_EXPR || code == CONVERT_EXPR
|| code == NON_LVALUE_EXPR)
val = iterative_hash_object (TREE_TYPE (t), val);
for (i = first_rtl_op (code) - 1; i >= 0; --i)
val = iterative_hash_expr (TREE_OPERAND (t, i), val);
if (code == PLUS_EXPR || code == MULT_EXPR || code == MIN_EXPR
|| code == MAX_EXPR || code == BIT_IOR_EXPR || code == BIT_XOR_EXPR
|| code == BIT_AND_EXPR || code == NE_EXPR || code == EQ_EXPR)
{
/* It's a commutative expression. We want to hash it the same
however it appears. We do this by first hashing both operands
and then rehashing based on the order of their independent
hashes. */
hashval_t one = iterative_hash_expr (TREE_OPERAND (t, 0), 0);
hashval_t two = iterative_hash_expr (TREE_OPERAND (t, 1), 0);
hashval_t t;
if (one > two)
t = one, one = two, two = t;
val = iterative_hash_object (one, val);
val = iterative_hash_object (two, val);
}
else
for (i = first_rtl_op (code) - 1; i >= 0; --i)
val = iterative_hash_expr (TREE_OPERAND (t, i), val);
}
else if (code == TREE_LIST)
{

View file

@ -2349,7 +2349,9 @@ extern tree pedantic_non_lvalue PARAMS ((tree));
extern tree convert PARAMS ((tree, tree));
extern unsigned int expr_align PARAMS ((tree));
extern tree expr_first PARAMS ((tree));
extern tree expr_last PARAMS ((tree));
extern int expr_length PARAMS ((tree));
extern tree size_in_bytes PARAMS ((tree));
extern HOST_WIDE_INT int_size_in_bytes PARAMS ((tree));
extern tree bit_position PARAMS ((tree));