]> 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>
Fri, 17 Jan 2025 08:52:19 +0000 (09:52 +0100)
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.

(cherry picked from commit 566740013b3445162b8c4bc2205e4e568d014968)

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 1b7d2a1ea7d25c077277d1ac17356637d0b2a9a1..449b9ffd4389fba28fe727a2a15402a64e5dc08b 100644 (file)
@@ -3492,7 +3492,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)))
@@ -3505,8 +3505,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 eb4d8388906f93a9ee499cbcb781cd3e0da2d7ef..597c4b0e8a671ec301652e6f07125d11ea35b44f 100644 (file)
@@ -1458,7 +1458,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.  */