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]

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


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