diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 11092923e4c2405d6017dea91ccd7977bc8b64e8..2042aba1efe0c9fc99b479ab8d24641e70a030af 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2006-04-10 Daniel Berlin <dberlin@dberlin.org> + + * tree-ssa-alias.c (lhs_may_store_to): New function. + (recalculate_used_alone): Handle LHS of calls. + 2006-04-09 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> PR target/27034 diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index 3ad4b0ffe1c0e8090e67eea5cfd614296a968646..a151c8c3f418e50ce2bdf4799c6bf2f24f745e21 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -426,6 +426,26 @@ compute_call_clobbered (struct alias_info *ai) } +/* Helper for recalculate_used_alone. Return a conservatively correct + answer as to whether STMT may make a store on the LHS to SYM. */ + +static bool +lhs_may_store_to (tree stmt, tree sym ATTRIBUTE_UNUSED) +{ + tree lhs = TREE_OPERAND (stmt, 0); + + lhs = get_base_address (lhs); + + if (!lhs) + return false; + + if (TREE_CODE (lhs) == SSA_NAME) + return false; + /* We could do better here by looking at the type tag of LHS, but it + is unclear whether this is worth it. */ + return true; +} + /* Recalculate the used_alone information for SMTs . */ void @@ -457,38 +477,45 @@ recalculate_used_alone (void) { for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi)) { + bool iscall = false; + ssa_op_iter iter; + stmt = bsi_stmt (bsi); + if (TREE_CODE (stmt) == CALL_EXPR || (TREE_CODE (stmt) == MODIFY_EXPR && TREE_CODE (TREE_OPERAND (stmt, 1)) == CALL_EXPR)) - VEC_safe_push (tree, heap, calls, stmt); - else { - ssa_op_iter iter; + iscall = true; + VEC_safe_push (tree, heap, calls, stmt); + } + + FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, + SSA_OP_VUSE | SSA_OP_VIRTUAL_DEFS) + { + tree svar = var; + + if (TREE_CODE (var) == SSA_NAME) + svar = SSA_NAME_VAR (var); - FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, - SSA_OP_VUSE | SSA_OP_VIRTUAL_DEFS) + if (TREE_CODE (svar) == SYMBOL_MEMORY_TAG) { - tree svar = var; - - if(TREE_CODE (var) == SSA_NAME) - svar = SSA_NAME_VAR (var); - - if (TREE_CODE (svar) == SYMBOL_MEMORY_TAG) + /* We only care about the LHS on calls. */ + if (iscall && !lhs_may_store_to (stmt, svar)) + continue; + + if (!SMT_USED_ALONE (svar)) { - if (!SMT_USED_ALONE (svar)) - { - SMT_USED_ALONE (svar) = true; - - /* Only need to mark for renaming if it wasn't - used alone before. */ - if (!SMT_OLD_USED_ALONE (svar)) - mark_sym_for_renaming (svar); - } + SMT_USED_ALONE (svar) = true; + + /* Only need to mark for renaming if it wasn't + used alone before. */ + if (!SMT_OLD_USED_ALONE (svar)) + mark_sym_for_renaming (svar); } } - } - } + } + } } /* Update the operands on all the calls we saw. */