aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-alias.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2011-04-21 11:31:52 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2011-04-21 11:31:52 +0000
commit53f94a5c18aa035ceb4f9ada2afb9ec8aa07ce57 (patch)
tree16beee1774ba2326722157c467df642024eced08 /gcc/tree-ssa-alias.c
parentf0dca5baf206a94c93c9aef85eb32d2734bf2878 (diff)
downloadgcc-53f94a5c18aa035ceb4f9ada2afb9ec8aa07ce57.zip
gcc-53f94a5c18aa035ceb4f9ada2afb9ec8aa07ce57.tar.gz
gcc-53f94a5c18aa035ceb4f9ada2afb9ec8aa07ce57.tar.bz2
tree-ssa-alias.c (ref_maybe_used_by_stmt_p): Handle return statements.
2011-04-21 Richard Guenther <rguenther@suse.de> * tree-ssa-alias.c (ref_maybe_used_by_stmt_p): Handle return statements. From-SVN: r172820
Diffstat (limited to 'gcc/tree-ssa-alias.c')
-rw-r--r--gcc/tree-ssa-alias.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c
index a77c803..673073e 100644
--- a/gcc/tree-ssa-alias.c
+++ b/gcc/tree-ssa-alias.c
@@ -1364,6 +1364,26 @@ ref_maybe_used_by_stmt_p (gimple stmt, tree ref)
}
else if (is_gimple_call (stmt))
return ref_maybe_used_by_call_p (stmt, ref);
+ else if (gimple_code (stmt) == GIMPLE_RETURN)
+ {
+ tree retval = gimple_return_retval (stmt);
+ tree base;
+ if (retval
+ && TREE_CODE (retval) != SSA_NAME
+ && !is_gimple_min_invariant (retval)
+ && refs_may_alias_p (retval, ref))
+ return true;
+ /* If ref escapes the function then the return acts as a use. */
+ base = get_base_address (ref);
+ if (!base)
+ ;
+ else if (DECL_P (base))
+ return is_global_var (base);
+ else if (TREE_CODE (base) == MEM_REF
+ || TREE_CODE (base) == TARGET_MEM_REF)
+ return ptr_deref_may_alias_global_p (TREE_OPERAND (base, 0));
+ return false;
+ }
return true;
}