[PATCH] Rerun df_analyze if delete_trivially_dead_insns deleted something during IRA (PR debug/47881)

Vladimir Makarov vmakarov@redhat.com
Tue Mar 8 15:42:00 GMT 2011


On 03/08/2011 10:33 AM, Jakub Jelinek wrote:
> Hi!
>
> If delete_trivially_dead_insns deletes some insn, DF state might be
> out of date, and, what's worse, if there are pseudos set multiple times
> referenced in debug_insns, where the debug_insn references were ok
> before the deletions, but the deletions shortened lifetime of such a pseudo
> in certain location, nothing resets the debug insns afterwards and we end up
> with -fcompare-debug failures because the lifetime of the pseudos is
> different between -g0 and -g.
>
> Fixed by rerunning df_analyze () if delete_trivially_dead_insns removed
> anything, bootstrapped/regtested on x86_64-linux and i686-linux.
> Ok for trunk?
>
Ok for me.  Thanks for the patch, Jakub.
> 2011-03-07  Jakub Jelinek<jakub@redhat.com>
>
> 	PR debug/47881
> 	* ira.c (ira): Call df_analyze again if delete_trivially_dead_insns
> 	removed anything.
>
> 	* gcc.dg/pr47881.c: New test.
>
> --- gcc/ira.c.jj	2011-02-21 15:37:42.000000000 +0100
> +++ gcc/ira.c	2011-03-07 12:33:59.000000000 +0100
> @@ -3232,7 +3232,8 @@ ira (FILE *f)
>       check_allocation ();
>   #endif
>
> -  delete_trivially_dead_insns (get_insns (), max_reg_num ());
> +  if (delete_trivially_dead_insns (get_insns (), max_reg_num ()))
> +    df_analyze ();
>
>     init_reg_equiv_memory_loc ();
>
> --- gcc/testsuite/gcc.dg/pr47881.c.jj	2011-03-08 14:12:04.000000000 +0100
> +++ gcc/testsuite/gcc.dg/pr47881.c	2011-03-08 14:11:46.000000000 +0100
> @@ -0,0 +1,24 @@
> +/* PR debug/47881 */
> +/* { dg-do compile } */
> +/* { dg-options "-O -fcompare-debug -fno-dce -funroll-loops -fno-web" } */
> +
> +extern int data[];
> +
> +int
> +foo (int *t, int *f, int n)
> +{
> +  int i = 0, a, b, c, d;
> +  while (data[*f]&&  n)
> +    n--;
> +  for (; i<  n; i += 4)
> +    {
> +      a = data[*(f++)&  0x7f];
> +      c = data[*(f++)&  0x7f];
> +      c = data[*(f++)&  0x7f];
> +      d = data[*(f++)&  0x7f];
> +      if ((a&  0x80) || (b&  0x80) || (c&  0x80) || (d&  0x80))
> +	return 1;
> +      *(t++) = 16;
> +    }
> +  return 0;
> +}
>
> 	Jakub



More information about the Gcc-patches mailing list