if-conv: Fix -fcompare-debug bugs in ifcvt_local_dce [PR94283]
authorJakub Jelinek <jakub@redhat.com>
Tue, 24 Mar 2020 08:34:58 +0000 (09:34 +0100)
committerJakub Jelinek <jakub@redhat.com>
Tue, 24 Mar 2020 08:34:58 +0000 (09:34 +0100)
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.

2020-03-24  Jakub Jelinek  <jakub@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/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr94283.c [new file with mode: 0644]
gcc/tree-if-conv.c

index a45d7ba876b40ad60b7cab54231f23f10cf1b767..51cb52dbb10f6827041b7b5a0953e615c83943e4 100644 (file)
@@ -1,5 +1,11 @@
 2020-03-24  Jakub Jelinek  <jakub@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.
+
        PR debug/94277
        * cgraphunit.c (check_global_declaration): For DECL_EXTERNAL and
        non-TREE_PUBLIC non-DECL_ARTIFICIAL FUNCTION_DECLs, set TREE_PUBLIC
index 13e609015801127d4b5c37289954f51dcad54829..e050d159d5c8eb8dfc85cb0b79938f73ffa3f8dd 100644 (file)
@@ -1,5 +1,8 @@
 2020-03-24  Jakub Jelinek  <jakub@redhat.com>
 
+       PR debug/94283
+       * gcc.target/i386/pr94283.c: New test.
+
        PR debug/94277
        * gcc.dg/pr94277.c: New test.
 
diff --git a/gcc/testsuite/gcc.target/i386/pr94283.c b/gcc/testsuite/gcc.target/i386/pr94283.c
new file mode 100644 (file)
index 0000000..4982f7d
--- /dev/null
@@ -0,0 +1,5 @@
+/* PR debug/94283 */
+/* { dg-do compile } */
+/* { dg-options "-O3 -fcompare-debug -mavx2" } */
+
+#include "../../gcc.dg/fold-bopcond-1.c"
index 8d24c18d5de9a982733bfd5a16d4e87cc4ebef1b..dd11d805c77f2fed4f2522ca3a0d045e2a59327c 100644 (file)
@@ -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);