Re: [PATCH] Another canonical cselib_val bootstrap fix (PR bootstrap/51725)

2012-01-06 Thread Jakub Jelinek
On Fri, Jan 06, 2012 at 05:30:52PM -0200, Alexandre Oliva wrote:
> Regstrapped on x86_64-linux-gnu and i686-linux-gnu, also verified with
> gnu-CORBA.list with a ia64-linux-gnu cross.
> 
> Ok to install?

Ok.

Jakub


Re: [PATCH] Another canonical cselib_val bootstrap fix (PR bootstrap/51725)

2012-01-06 Thread Alexandre Oliva
On Jan  3, 2012, Jakub Jelinek  wrote:

> My previous patch apparently wasn't enough.

I think we need to propagate addr_lists to the canonical value too, and
I found other spots that AFAICT require or would benefit from canonical
values.

Regstrapped on x86_64-linux-gnu and i686-linux-gnu, also verified with
gnu-CORBA.list with a ia64-linux-gnu cross.

Ok to install?

for  gcc/ChangeLog
from  Alexandre Oliva  

	PR bootstrap/51725
	* cselib.c (new_elt_loc_list): Promote addr_list to canonical node.
	Add canonical node to containing_mem chain after the non-canonical
	one, even if there weren't any locs to propagate.
	(remove_useless_values): Keep only canonical values.
	(add_mem_for_addr, cselib_lookup_mem): Canonicalize addr.
	(cselib_invalidate_mem): Likewise.  Ensure v is canonical, and
	canonicalize mem_chain elements that are not discarded.

Index: gcc/cselib.c
===
--- gcc/cselib.c.orig	2012-01-06 14:15:37.049194330 -0200
+++ gcc/cselib.c	2012-01-06 14:18:38.954548069 -0200
@@ -277,12 +277,27 @@ new_elt_loc_list (cselib_val *val, rtx l
 	}
 	  el->next = val->locs;
 	  next = val->locs = CSELIB_VAL_PTR (loc)->locs;
-	  if (CSELIB_VAL_PTR (loc)->next_containing_mem != NULL
-	  && val->next_containing_mem == NULL)
-	{
-	  val->next_containing_mem = first_containing_mem;
-	  first_containing_mem = val;
-	}
+	}
+
+  if (CSELIB_VAL_PTR (loc)->addr_list)
+	{
+	  /* Bring in addr_list into canonical node.  */
+	  struct elt_list *last = CSELIB_VAL_PTR (loc)->addr_list;
+	  while (last->next)
+	last = last->next;
+	  last->next = val->addr_list;
+	  val->addr_list = CSELIB_VAL_PTR (loc)->addr_list;
+	  CSELIB_VAL_PTR (loc)->addr_list = NULL;
+	}
+
+  if (CSELIB_VAL_PTR (loc)->next_containing_mem != NULL
+	  && val->next_containing_mem == NULL)
+	{
+	  /* Add VAL to the containing_mem list after LOC.  LOC will
+	 be removed when we notice it doesn't contain any
+	 MEMs.  */
+	  val->next_containing_mem = CSELIB_VAL_PTR (loc)->next_containing_mem;
+	  CSELIB_VAL_PTR (loc)->next_containing_mem = val;
 	}
 
   /* Chain LOC back to VAL.  */
@@ -641,7 +656,7 @@ remove_useless_values (void)
 
   p = &first_containing_mem;
   for (v = *p; v != &dummy_val; v = v->next_containing_mem)
-if (v->locs)
+if (v->locs && v == canonical_cselib_val (v))
   {
 	*p = v;
 	p = &(*p)->next_containing_mem;
@@ -1270,6 +1285,7 @@ add_mem_for_addr (cselib_val *addr_elt, 
 {
   struct elt_loc_list *l;
 
+  addr_elt = canonical_cselib_val (addr_elt);
   mem_elt = canonical_cselib_val (mem_elt);
 
   /* Avoid duplicates.  */
@@ -1318,6 +1334,7 @@ cselib_lookup_mem (rtx x, int create)
   if (! addr)
 return 0;
 
+  addr = canonical_cselib_val (addr);
   /* Find a value that describes a value of our mode at that address.  */
   for (l = addr->addr_list; l; l = l->next)
 if (GET_MODE (l->elt->val_rtx) == mode)
@@ -2214,15 +2231,22 @@ cselib_invalidate_mem (rtx mem_rtx)
 	  /* We must have a mapping from this MEM's address to the
 	 value (E).  Remove that, too.  */
 	  addr = cselib_lookup (XEXP (x, 0), VOIDmode, 0, GET_MODE (x));
+	  addr = canonical_cselib_val (addr);
+	  gcc_checking_assert (v == canonical_cselib_val (v));
 	  mem_chain = &addr->addr_list;
 	  for (;;)
 	{
-	  if (canonical_cselib_val ((*mem_chain)->elt) == v)
+	  cselib_val *canon = canonical_cselib_val ((*mem_chain)->elt);
+
+	  if (canon == v)
 		{
 		  unchain_one_elt_list (mem_chain);
 		  break;
 		}
 
+	  /* Record canonicalized elt.  */
+	  (*mem_chain)->elt = canon;
+
 	  mem_chain = &(*mem_chain)->next;
 	}
 

-- 
Alexandre Oliva, freedom fighterhttp://FSFLA.org/~lxoliva/
You must be the change you wish to see in the world. -- Gandhi
Be Free! -- http://FSFLA.org/   FSF Latin America board member
Free Software Evangelist  Red Hat Brazil Compiler Engineer


Re: [PATCH] Another canonical cselib_val bootstrap fix (PR bootstrap/51725)

2012-01-04 Thread Jakub Jelinek
On Wed, Jan 04, 2012 at 10:33:50AM +0100, Richard Guenther wrote:
> > My previous patch apparently wasn't enough.  If at add_mem_*
> > time mem_elt is still its own canonical cselib_val, but only afterwards
> > new_elt_loc_list adds a new canonical cselib_val to it (and moves
> 
> Hm, shouldn't an existing cselib_val be always the canonical one?

Canonical is the one with lower uid.  If cselib_add_permanent_equiv
is called with two existing cselib_vals, just one of them will be
canonical.

Jakub


Re: [PATCH] Another canonical cselib_val bootstrap fix (PR bootstrap/51725)

2012-01-04 Thread Richard Guenther
On Tue, 3 Jan 2012, Jakub Jelinek wrote:

> Hi!
> 
> My previous patch apparently wasn't enough.  If at add_mem_*
> time mem_elt is still its own canonical cselib_val, but only afterwards
> new_elt_loc_list adds a new canonical cselib_val to it (and moves

Hm, shouldn't an existing cselib_val be always the canonical one?

> over its locs), then we can still crash in cselib_invalidate_mem.
> This patch ensures that new_elt_loc_list when moving over the locs also
> adds the canonical cselib_val to first_containing_mem list if it
> wasn't already there and the old val was (it would be better to
> remove it, but the chain is only single linked list and it would be
> expensive to remove it there - the next cselib_invalidate_mem
> will handle it automatically, as non-canonical values don't have any mem
> locs and thus are removed from the chain).
> In cselib_invalidate_mem it needs to call canonical_cselib_val on the
> addr_list chain elts (those aren't canonicalized by anything).
> There is no need to call canonical_cselib_val on v, the new_elt_loc_list
> change ensures that the canonical value is in the list always too
> and non-canonical values don't have MEM locs.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, tested with
> cross jc1 to ia64-linux on gnu-CORBA.list compilation.  Ok for trunk?
> 
> 2012-01-03  Jakub Jelinek  
> 
>   PR bootstrap/51725
>   * cselib.c (new_elt_loc_list): When moving locs from one
>   cselib_val to its new canonical_cselib_val and the
>   cselib_val was in first_containing_mem chain, but
>   the canonical_cselib_val was not, add the latter into the
>   chain.
>   (cselib_invalidate_mem): Compare canonical_cselib_val of
>   addr_list chain elt with v.
> 
> --- gcc/cselib.c.jj   2012-01-03 16:22:48.0 +0100
> +++ gcc/cselib.c  2012-01-03 17:29:10.096229315 +0100
> @@ -277,6 +277,12 @@ new_elt_loc_list (cselib_val *val, rtx l
>   }
> el->next = val->locs;
> next = val->locs = CSELIB_VAL_PTR (loc)->locs;
> +   if (CSELIB_VAL_PTR (loc)->next_containing_mem != NULL
> +   && val->next_containing_mem == NULL)
> + {
> +   val->next_containing_mem = first_containing_mem;
> +   first_containing_mem = val;
> + }
>   }
>  
>/* Chain LOC back to VAL.  */
> @@ -2211,7 +2217,7 @@ cselib_invalidate_mem (rtx mem_rtx)
> mem_chain = &addr->addr_list;
> for (;;)
>   {
> -   if ((*mem_chain)->elt == v)
> +   if (canonical_cselib_val ((*mem_chain)->elt) == v)
>   {
> unchain_one_elt_list (mem_chain);
> break;
> 
>   Jakub
> 
> 

-- 
Richard Guenther 
SUSE / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer

Re: [PATCH] Another canonical cselib_val bootstrap fix (PR bootstrap/51725)

2012-01-03 Thread Richard Henderson
On 01/04/2012 06:14 AM, Jakub Jelinek wrote:
>   PR bootstrap/51725
>   * cselib.c (new_elt_loc_list): When moving locs from one
>   cselib_val to its new canonical_cselib_val and the
>   cselib_val was in first_containing_mem chain, but
>   the canonical_cselib_val was not, add the latter into the
>   chain.
>   (cselib_invalidate_mem): Compare canonical_cselib_val of
>   addr_list chain elt with v.

Ok.


r~