diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-06-25 15:19:45 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-06-25 15:19:45 +0000 |
commit | 917f08fa720784bbdfc3a54e8e953b696e7e9ba8 (patch) | |
tree | c68ff39a5bb496517599a45c38d36496d197a5a9 /gcc/tree-ssa-alias.c | |
parent | e2fe74886ddfcb925e599fd43c819c5d9d1da5da (diff) | |
download | gcc-917f08fa720784bbdfc3a54e8e953b696e7e9ba8.tar.gz |
2009-06-25 Richard Guenther <rguenther@suse.de>
* tree-ssa-alias.c (ref_maybe_used_by_call_p_1): Disambiguate
indirect references against the callused/escaped solutions.
(call_may_clobber_ref_p_1): Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@148947 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-alias.c')
-rw-r--r-- | gcc/tree-ssa-alias.c | 53 |
1 files changed, 46 insertions, 7 deletions
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index 98955246aea..14733675262 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -858,12 +858,8 @@ ref_maybe_used_by_call_p_1 (gimple call, tree ref) && (flags & (ECF_CONST|ECF_NOVOPS))) goto process_args; - /* If the reference is not based on a decl give up. - ??? Handle indirect references by intersecting the call-used - solution with that of the pointer. */ base = get_base_address (ref); - if (!base - || !DECL_P (base)) + if (!base) return true; /* If the reference is based on a decl that is not aliased the call @@ -945,12 +941,45 @@ ref_maybe_used_by_call_p_1 (gimple call, tree ref) it may be used. */ if (flags & (ECF_PURE|ECF_CONST|ECF_LOOPING_CONST_OR_PURE|ECF_NOVOPS)) { - if (is_call_used (base)) + if (DECL_P (base)) + { + if (is_call_used (base)) + return true; + } + else if (INDIRECT_REF_P (base) + && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME) + { + struct ptr_info_def *pi = SSA_NAME_PTR_INFO (TREE_OPERAND (base, 0)); + if (!pi) + return true; + + if (pt_solution_includes_global (&pi->pt) + || pt_solutions_intersect (&cfun->gimple_df->callused, &pi->pt) + || pt_solutions_intersect (&cfun->gimple_df->escaped, &pi->pt)) + return true; + } + else return true; } else { - if (is_call_clobbered (base)) + if (DECL_P (base)) + { + if (is_call_clobbered (base)) + return true; + } + else if (INDIRECT_REF_P (base) + && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME) + { + struct ptr_info_def *pi = SSA_NAME_PTR_INFO (TREE_OPERAND (base, 0)); + if (!pi) + return true; + + if (pt_solution_includes_global (&pi->pt) + || pt_solutions_intersect (&cfun->gimple_df->escaped, &pi->pt)) + return true; + } + else return true; } @@ -1148,6 +1177,16 @@ call_may_clobber_ref_p_1 (gimple call, ao_ref *ref) if (DECL_P (base)) return is_call_clobbered (base); + else if (INDIRECT_REF_P (base) + && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME) + { + struct ptr_info_def *pi = SSA_NAME_PTR_INFO (TREE_OPERAND (base, 0)); + if (!pi) + return true; + + return (pt_solution_includes_global (&pi->pt) + || pt_solutions_intersect (&cfun->gimple_df->escaped, &pi->pt)); + } return true; } |