> Am 11.11.2023 um 09:27 schrieb Jakub Jelinek <ja...@redhat.com>:
> 
> Hi!
> 
> The following testcase ICEs, because the temp_stmts were removed in
> wrong order, from the ones appearing earlier in the IL to the later ones,
> so insert_debug_temps_for_defs can reintroduce dead SSA_NAMEs back into the
> IL.
> 
> The following patch fixes that by removing them in the order they were
> pushed into the vector, which is from later ones to earlier ones.
> Additionally, I've noticed I forgot to call release_defs on the removed
> stmts.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Ok

Richard 

> 2023-11-11  Jakub Jelinek  <ja...@redhat.com>
> 
>    PR middle-end/112430
>    * tree-ssa-math-opts.cc (match_uaddc_usubc): Remove temp_stmts in the
>    order they were pushed rather than in reverse order.  Call
>    release_defs after gsi_remove.
> 
>    * gcc.dg/pr112430.c: New test.
> 
> --- gcc/tree-ssa-math-opts.cc.jj    2023-11-02 07:49:20.699815089 +0100
> +++ gcc/tree-ssa-math-opts.cc    2023-11-10 13:43:13.059912310 +0100
> @@ -5047,11 +5047,11 @@ match_uaddc_usubc (gimple_stmt_iterator
>       gsi_insert_before (gsi, g, GSI_SAME_STMT);
>       /* Remove some further statements which can't be kept in the IL because
>     they can use SSA_NAMEs whose setter is going to be removed too.  */
> -      while (temp_stmts.length ())
> +      for (gimple *g2 : temp_stmts)
>    {
> -      g = temp_stmts.pop ();
> -      gsi2 = gsi_for_stmt (g);
> +      gsi2 = gsi_for_stmt (g2);
>      gsi_remove (&gsi2, true);
> +      release_defs (g2);
>    }
>     }
>   else
> @@ -5068,10 +5068,12 @@ match_uaddc_usubc (gimple_stmt_iterator
>    rhs1 = gimple_assign_rhs1 (g);
>    gsi2 = gsi_for_stmt (g);
>    gsi_remove (&gsi2, true);
> +    release_defs (g);
>       }
>   gcc_checking_assert (rhs1 == gimple_assign_lhs (im2));
>   gsi2 = gsi_for_stmt (im2);
>   gsi_remove (&gsi2, true);
> +  release_defs (im2);
>   /* Replace the re2 statement with __real__ of the newly added
>      .UADDC/.USUBC call.  */
>   if (re2)
> --- gcc/testsuite/gcc.dg/pr112430.c.jj    2023-11-10 13:45:18.707163791 +0100
> +++ gcc/testsuite/gcc.dg/pr112430.c    2023-11-10 13:45:04.523361174 +0100
> @@ -0,0 +1,30 @@
> +/* PR middle-end/112430 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -g" } */
> +
> +int a, b, c, d, e;
> +unsigned int f;
> +
> +static void
> +foo (unsigned int x)
> +{
> +  unsigned int g = x < c;
> +  int h = f < b;
> +  x += h;
> +  g += x < h;
> +  f = x;
> +  x = g;
> +  g = f += a;
> +  h = f < a;
> +  x += h;
> +  c += f < d;
> +  x += c;
> +  g += x < c;
> +  e = g;
> +}
> +
> +void
> +bar (unsigned int x)
> +{
> +  foo (x);
> +}
> 
>    Jakub
> 

Reply via email to