]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/116290 - fix compare-debug issue in ldist
authorRichard Biener <rguenther@suse.de>
Sun, 13 Oct 2024 13:12:44 +0000 (15:12 +0200)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 14 Oct 2024 06:14:37 +0000 (08:14 +0200)
Loop distribution does different analysis with -g0/-g due to counting
a debug stmt starting a BB against a limit which will everntually
lead to different IVOPTs choices.  I've fixed a possible IVOPTs
issue on the way even though it doesn't make a difference here.

PR tree-optimization/116290
* tree-loop-distribution.cc (determine_reduction_stmt_1): PHIs
have no debug variants.  Start with first non-debug real stmt.
* tree-ssa-loop-ivopts.cc (find_givs_in_bb): Do not analyze
debug stmts.

* gcc.dg/pr116290.c: New testcase.

gcc/testsuite/gcc.dg/pr116290.c [new file with mode: 0644]
gcc/tree-loop-distribution.cc
gcc/tree-ssa-loop-ivopts.cc

diff --git a/gcc/testsuite/gcc.dg/pr116290.c b/gcc/testsuite/gcc.dg/pr116290.c
new file mode 100644 (file)
index 0000000..97b946b
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-g -O2 -fcompare-debug" } */
+
+char *camel_message_info_class_intern_init_part;
+void g_once_init_enter();
+void camel_message_info_class_intern_init() {
+  int ii;
+  char *label;
+  for (; camel_message_info_class_intern_init_part[ii]; ii++)
+    if (camel_message_info_class_intern_init_part) {
+      if (label && *label)
+        g_once_init_enter();
+      label = &camel_message_info_class_intern_init_part[ii + 1];
+      camel_message_info_class_intern_init_part[ii] = ' ';
+    }
+  if (label)
+    g_once_init_enter();
+}
index f0430ede2f45f23271a25cae526c2e7f163de5a9..d7013ba5f8dd06a6c9844301d47b54449b3fbcf8 100644 (file)
@@ -3552,7 +3552,7 @@ determine_reduction_stmt_1 (const loop_p loop, const basic_block *bbs)
       basic_block bb = bbs[i];
 
       for (gphi_iterator bsi = gsi_start_phis (bb); !gsi_end_p (bsi);
-          gsi_next_nondebug (&bsi))
+          gsi_next (&bsi))
        {
          gphi *phi = bsi.phi ();
          if (virtual_operand_p (gimple_phi_result (phi)))
@@ -3565,8 +3565,8 @@ determine_reduction_stmt_1 (const loop_p loop, const basic_block *bbs)
            }
        }
 
-      for (gimple_stmt_iterator bsi = gsi_start_bb (bb); !gsi_end_p (bsi);
-          gsi_next_nondebug (&bsi), ++ninsns)
+      for (gimple_stmt_iterator bsi = gsi_start_nondebug_bb (bb);
+          !gsi_end_p (bsi); gsi_next_nondebug (&bsi), ++ninsns)
        {
          /* Bail out early for loops which are unlikely to match.  */
          if (ninsns > 16)
index dfe1b254156201fe39baf096209eca938d01b0d1..7441324aec2303655f590842ee571d49ddd8c265 100644 (file)
@@ -1461,7 +1461,8 @@ find_givs_in_bb (struct ivopts_data *data, basic_block bb)
   gimple_stmt_iterator bsi;
 
   for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
-    find_givs_in_stmt (data, gsi_stmt (bsi));
+    if (!is_gimple_debug (gsi_stmt (bsi)))
+      find_givs_in_stmt (data, gsi_stmt (bsi));
 }
 
 /* Finds general ivs.  */