On Tue, 24 Mar 2020, Jakub Jelinek wrote:

> Hi!
> 
> The following testcase shows -fcompare-debug bugs in ifcvt_local_dce,
> where the decisions what statements are needed is based also on debug stmt
> operands, which is wrong.
> So, this patch makes sure to never add debug stmt to the worklist, or never
> add an assign to worklist just because it is used in a debug stmt in another
> bb.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK.

> 2020-03-24  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR debug/94283
>       * tree-if-conv.c (ifcvt_local_dce): For gimple debug stmts, just set
>       GF_PLF_2, but don't add them to worklist.  Don't add an assigment to
>       worklist or set GF_PLF_2 just because it is used in a debug stmt in
>       another bb.  Formatting improvements.
> 
>       * gcc.target/i386/pr94283.c: New test.
> 
> --- gcc/tree-if-conv.c.jj     2020-01-12 11:54:38.495381997 +0100
> +++ gcc/tree-if-conv.c        2020-03-23 17:13:13.823724294 +0100
> @@ -2917,9 +2917,12 @@ ifcvt_local_dce (class loop *loop)
>    for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
>      {
>        stmt = gsi_stmt (gsi);
> -      if (gimple_store_p (stmt)
> -       || gimple_assign_load_p (stmt)
> -       || is_gimple_debug (stmt))
> +      if (is_gimple_debug (stmt))
> +     {
> +       gimple_set_plf (stmt, GF_PLF_2, true);
> +       continue;
> +     }
> +      if (gimple_store_p (stmt) || gimple_assign_load_p (stmt))
>       {
>         gimple_set_plf (stmt, GF_PLF_2, true);
>         worklist.safe_push (stmt);
> @@ -2940,7 +2943,7 @@ ifcvt_local_dce (class loop *loop)
>         FOR_EACH_IMM_USE_FAST (use_p, imm_iter, lhs)
>           {
>             stmt1 = USE_STMT (use_p);
> -           if (gimple_bb (stmt1) != bb)
> +           if (!is_gimple_debug (stmt1) && gimple_bb (stmt1) != bb)
>               {
>                 gimple_set_plf (stmt, GF_PLF_2, true);
>                 worklist.safe_push (stmt);
> @@ -2963,8 +2966,7 @@ ifcvt_local_dce (class loop *loop)
>         if (TREE_CODE (use) != SSA_NAME)
>           continue;
>         stmt1 = SSA_NAME_DEF_STMT (use);
> -       if (gimple_bb (stmt1) != bb
> -           || gimple_plf (stmt1, GF_PLF_2))
> +       if (gimple_bb (stmt1) != bb || gimple_plf (stmt1, GF_PLF_2))
>           continue;
>         gimple_set_plf (stmt1, GF_PLF_2, true);
>         worklist.safe_push (stmt1);
> --- gcc/testsuite/gcc.target/i386/pr94283.c.jj        2020-03-23 
> 17:16:50.324494226 +0100
> +++ gcc/testsuite/gcc.target/i386/pr94283.c   2020-03-23 17:16:42.238614863 
> +0100
> @@ -0,0 +1,5 @@
> +/* PR debug/94283 */
> +/* { dg-do compile } */
> +/* { dg-options "-O3 -fcompare-debug -mavx2" } */
> +
> +#include "../../gcc.dg/fold-bopcond-1.c"
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)

Reply via email to