This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH][alias-improvements] Add proper PTA constraints for passed-by reference result decls
- From: Richard Guenther <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Sun, 4 Jan 2009 12:55:33 +0100 (CET)
- Subject: [PATCH][alias-improvements] Add proper PTA constraints for passed-by reference result decls
This fixes the extra libstdc++ fail introduced by the previous patch.
We fail to add constraints for a result decl that is passed by
invisible reference. Then for
A foo ()
{
A &ptr = <result>;
we conclude ptr points to nothing (or rather we eliminate it as a
non-pointer variable). The fix is to add proper constraints for
<result>. The following patch adds a constraint from nonlocal,
like we do for the static chain - but in theory both the result
decl and the outer frame object should be unaliased, no? Well,
better play safe for now.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to
the branch.
Richard.
2009-01-04 Richard Guenther <rguenther@suse.de>
* tree-ssa-structalias.c (intra_create_variable_infos): Add
constraints for a result decl that is passed by hidden reference.
* tree-ssa-alias.c (may_point_to_same_object): Make two identical
pointer always conflict.
Index: gcc/tree-ssa-alias.c
===================================================================
*** gcc/tree-ssa-alias.c (revision 143037)
--- gcc/tree-ssa-alias.c (working copy)
*************** may_point_to_same_object (tree ptr1, tre
*** 153,158 ****
--- 153,164 ----
gcc_assert (TREE_CODE (ptr1) == SSA_NAME
&& TREE_CODE (ptr2) == SSA_NAME);
+ /* We may end up with two empty points-to solutions for two same pointers.
+ In this case we still want to say both pointers alias, so shortcut
+ that here. */
+ if (ptr1 == ptr2)
+ return true;
+
/* If we do not have useful points-to information for either pointer
we cannot disambiguate anything else. */
pi1 = SSA_NAME_PTR_INFO (ptr1);
Index: gcc/tree-ssa-structalias.c
===================================================================
*** gcc/tree-ssa-structalias.c (revision 143037)
--- gcc/tree-ssa-structalias.c (working copy)
*************** intra_create_variable_infos (void)
*** 4596,4601 ****
--- 4596,4615 ----
}
}
+ /* ??? Both a passed by reference result object and the object pointed
+ to by the static chain should be non-aliased by any other pointers.
+ So we may want to assign them a heap variable. */
+
+ /* Add a constraint for a result decl that is passed by reference. */
+ if (DECL_RESULT (cfun->decl)
+ && DECL_BY_REFERENCE (DECL_RESULT (cfun->decl)))
+ {
+ varinfo_t p, result_vi = get_vi_for_tree (DECL_RESULT (cfun->decl));
+
+ for (p = result_vi; p; p = p->next)
+ make_constraint_from (p, nonlocal_id);
+ }
+
/* Add a constraint for the incoming static chain parameter. */
if (cfun->static_chain_decl != NULL_TREE)
{