aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-alias.c
diff options
context:
space:
mode:
authorDaniel Berlin <dberlin@dberlin.org>2006-04-10 03:36:09 +0000
committerDaniel Berlin <dberlin@gcc.gnu.org>2006-04-10 03:36:09 +0000
commitef2bb311e5876bd844395f54c823588e01bf01a3 (patch)
tree68539a67faca48ae36f870363954009531c4f3e6 /gcc/tree-ssa-alias.c
parentc8d47370efb4302a85a1ec3e194666647a2181f4 (diff)
downloadgcc-ef2bb311e5876bd844395f54c823588e01bf01a3.zip
gcc-ef2bb311e5876bd844395f54c823588e01bf01a3.tar.gz
gcc-ef2bb311e5876bd844395f54c823588e01bf01a3.tar.bz2
tree-ssa-alias.c (lhs_may_store_to): New function.
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. From-SVN: r112815
Diffstat (limited to 'gcc/tree-ssa-alias.c')
-rw-r--r--gcc/tree-ssa-alias.c71
1 files changed, 49 insertions, 22 deletions
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c
index 3ad4b0f..a151c8c 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. */