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?

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

Reply via email to