Patchwork [alpha] Fix dwarf2 call-arg-location ICE

login
register
mail settings
Submitter Richard Henderson
Date Dec. 13, 2012, 7:37 p.m.
Message ID <50CA2E74.2050908@redhat.com>
Download mbox | patch
Permalink /patch/206207/
State New
Headers show

Comments

Richard Henderson - Dec. 13, 2012, 7:37 p.m.
Here's me wishing that NOTE_INSN_CALL_ARG_LOCATION was a reg note
and not an insn note.  Mainly because it's required to be adjacent
to the call insn, modulo barriers apparently.

This just started failing recently, though I didn't check to see
what sort of other change might have precipitated this.

Tested via cross to alphaev67-linux.


r~
* config/alpha/alpha.c (alpha_pad_function_end): Consider barriers
        when looking for NOTE_INSN_CALL_ARG_LOCATION.
Jakub Jelinek - Dec. 13, 2012, 7:44 p.m.
On Thu, Dec 13, 2012 at 11:37:24AM -0800, Richard Henderson wrote:
> Here's me wishing that NOTE_INSN_CALL_ARG_LOCATION was a reg note
> and not an insn note.  Mainly because it's required to be adjacent
> to the call insn, modulo barriers apparently.

It can be changed (though I guess for 4.9?).

> This just started failing recently, though I didn't check to see
> what sort of other change might have precipitated this.

I've reverted the offending patch in the mean time, so this is unnecessary
now.

>         * config/alpha/alpha.c (alpha_pad_function_end): Consider barriers
>         when looking for NOTE_INSN_CALL_ARG_LOCATION.
> 
> 
> diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c
> index 82135ff..8411218 100644
> --- a/gcc/config/alpha/alpha.c
> +++ b/gcc/config/alpha/alpha.c
> @@ -9253,23 +9253,26 @@ alpha_pad_function_end (void)
>  
>    for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
>      {
> -      if (! (CALL_P (insn)
> -	     && (SIBLING_CALL_P (insn)
> -		 || find_reg_note (insn, REG_NORETURN, NULL_RTX))))
> +      if (!CALL_P (insn)
> +	  || !(SIBLING_CALL_P (insn)
> +	       || find_reg_note (insn, REG_NORETURN, NULL_RTX)))
>          continue;
>  
>        /* Make sure we do not split a call and its corresponding
>  	 CALL_ARG_LOCATION note.  */
> -      if (CALL_P (insn))
> +      next = NEXT_INSN (insn);
> +      if (next == NULL)
> +	continue;
> +      if (BARRIER_P (next))
>  	{
> -	  next = NEXT_INSN (insn);
> -	  if (next && NOTE_P (next)
> -	      && NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
> -	    insn = next;
> +	  next = NEXT_INSN (next);
> +	  if (next == NULL)
> +	    continue;
>  	}
> +      if (NOTE_P (next) && NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
> +	insn = next;
>  
>        next = next_active_insn (insn);
> -
>        if (next)
>  	{
>  	  rtx pat = PATTERN (next);


	Jakub

Patch

diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c
index 82135ff..8411218 100644
--- a/gcc/config/alpha/alpha.c
+++ b/gcc/config/alpha/alpha.c
@@ -9253,23 +9253,26 @@  alpha_pad_function_end (void)
 
   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
     {
-      if (! (CALL_P (insn)
-	     && (SIBLING_CALL_P (insn)
-		 || find_reg_note (insn, REG_NORETURN, NULL_RTX))))
+      if (!CALL_P (insn)
+	  || !(SIBLING_CALL_P (insn)
+	       || find_reg_note (insn, REG_NORETURN, NULL_RTX)))
         continue;
 
       /* Make sure we do not split a call and its corresponding
 	 CALL_ARG_LOCATION note.  */
-      if (CALL_P (insn))
+      next = NEXT_INSN (insn);
+      if (next == NULL)
+	continue;
+      if (BARRIER_P (next))
 	{
-	  next = NEXT_INSN (insn);
-	  if (next && NOTE_P (next)
-	      && NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
-	    insn = next;
+	  next = NEXT_INSN (next);
+	  if (next == NULL)
+	    continue;
 	}
+      if (NOTE_P (next) && NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
+	insn = next;
 
       next = next_active_insn (insn);
-
       if (next)
 	{
 	  rtx pat = PATTERN (next);