diff options
author | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-11-07 10:31:59 +0000 |
---|---|---|
committer | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-11-07 10:31:59 +0000 |
commit | 1daf16ed0885573ec41bb4eb00f25c165ba9cf26 (patch) | |
tree | 8abab63378b6af81c6c73b90c8da3e67745ef5d0 /gcc/tree-ssa-ccp.c | |
parent | 2b2b3bd8d96c3193c8d9bc606ee1b5b3c9b47000 (diff) | |
download | gcc-1daf16ed0885573ec41bb4eb00f25c165ba9cf26.tar.gz |
2008-11-07 Basile Starynkevitch <basile@starynkevitch.net>
MELT branch merged with trunk r141668
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/melt-branch@141672 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-ccp.c')
-rw-r--r-- | gcc/tree-ssa-ccp.c | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c index 0365697fc85..a7d5be32e31 100644 --- a/gcc/tree-ssa-ccp.c +++ b/gcc/tree-ssa-ccp.c @@ -851,6 +851,31 @@ ccp_visit_phi_node (gimple phi) return SSA_PROP_NOT_INTERESTING; } +/* Return true if we may propagate the address expression ADDR into the + dereference DEREF and cancel them. */ + +bool +may_propagate_address_into_dereference (tree addr, tree deref) +{ + gcc_assert (INDIRECT_REF_P (deref) + && TREE_CODE (addr) == ADDR_EXPR); + + /* If the address is invariant then we do not need to preserve restrict + qualifications. But we do need to preserve volatile qualifiers until + we can annotate the folded dereference itself properly. */ + if (is_gimple_min_invariant (addr) + && (!TREE_THIS_VOLATILE (deref) + || TYPE_VOLATILE (TREE_TYPE (addr)))) + return useless_type_conversion_p (TREE_TYPE (deref), + TREE_TYPE (TREE_OPERAND (addr, 0))); + + /* Else both the address substitution and the folding must result in + a valid useless type conversion sequence. */ + return (useless_type_conversion_p (TREE_TYPE (TREE_OPERAND (deref, 0)), + TREE_TYPE (addr)) + && useless_type_conversion_p (TREE_TYPE (deref), + TREE_TYPE (TREE_OPERAND (addr, 0)))); +} /* CCP specific front-end to the non-destructive constant folding routines. @@ -897,12 +922,8 @@ ccp_fold (gimple stmt) prop_value_t *val = get_value (TREE_OPERAND (*base, 0)); if (val->lattice_val == CONSTANT && TREE_CODE (val->value) == ADDR_EXPR - && useless_type_conversion_p - (TREE_TYPE (TREE_OPERAND (*base, 0)), - TREE_TYPE (val->value)) - && useless_type_conversion_p - (TREE_TYPE (*base), - TREE_TYPE (TREE_OPERAND (val->value, 0)))) + && may_propagate_address_into_dereference + (val->value, *base)) { /* We need to return a new tree, not modify the IL or share parts of it. So play some tricks to |