This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH][alias-improvements] Add proper PTA constraints for passed-by reference result decls




On Jan 4, 2009, at 3:55 AM, Richard Guenther <rguenther@suse.de> wrote:


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.

Yes for the return value but no for the ststic chain, because the user could still pass a pointer value of one of the variables in the chain to the nested function.
Thanks,
Andrew Pinski




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)
{


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]