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.
Bootstrap and regtest running on x86_64-unknown-linux-gnu. 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 | 18 ++++++++++++++++++ gcc/tree-loop-distribution.cc | 6 +++--- gcc/tree-ssa-loop-ivopts.cc | 3 ++- 3 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr116290.c diff --git a/gcc/testsuite/gcc.dg/pr116290.c b/gcc/testsuite/gcc.dg/pr116290.c new file mode 100644 index 00000000000..97b946bda89 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr116290.c @@ -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(); +} diff --git a/gcc/tree-loop-distribution.cc b/gcc/tree-loop-distribution.cc index f0430ede2f4..d7013ba5f8d 100644 --- a/gcc/tree-loop-distribution.cc +++ b/gcc/tree-loop-distribution.cc @@ -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) diff --git a/gcc/tree-ssa-loop-ivopts.cc b/gcc/tree-ssa-loop-ivopts.cc index dfe1b254156..7441324aec2 100644 --- a/gcc/tree-ssa-loop-ivopts.cc +++ b/gcc/tree-ssa-loop-ivopts.cc @@ -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. */ -- 2.43.0