With -gstatement-frontiers we may end up with different IR coming from the front end with and without debug information turned on. See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100733 for details. That may result in differences in discriminator values and -fcompare-debug failures.
This patch disables printing of discriminators when the dump is intended for -fcompare-debug comparison and reverses the workaround in a test. Tested on x86_64-pc-linux-gnu. gcc/ChangeLog: PR debug/107231 PR debug/107169 * print-rtl.cc (print_rtx_operand_code_i): Don't print discriminators for -fdebug-compare. gcc/testsuite/ChangeLog: * c-c++-common/ubsan/pr85213.c: Reverse the workaround for discriminators. --- gcc/print-rtl.cc | 13 ++++++++++--- gcc/testsuite/c-c++-common/ubsan/pr85213.c | 7 +------ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/gcc/print-rtl.cc b/gcc/print-rtl.cc index e115f987173..0476f3d7e79 100644 --- a/gcc/print-rtl.cc +++ b/gcc/print-rtl.cc @@ -453,10 +453,17 @@ rtx_writer::print_rtx_operand_code_i (const_rtx in_rtx, int idx) expanded_location xloc = insn_location (in_insn); fprintf (m_outfile, " \"%s\":%i:%i", xloc.file, xloc.line, xloc.column); - int discriminator = insn_discriminator (in_insn); - if (discriminator) - fprintf (m_outfile, " discrim %d", discriminator); + /* Don't print discriminators for -fcompare-debug since the IR + coming from the front end may be different with and without + debug information turned on. That may result in different + discriminator values. */ + if (!(dump_flags & TDF_COMPARE_DEBUG)) + { + int discriminator = insn_discriminator (in_insn); + if (discriminator) + fprintf (m_outfile, " discrim %d", discriminator); + } } #endif } diff --git a/gcc/testsuite/c-c++-common/ubsan/pr85213.c b/gcc/testsuite/c-c++-common/ubsan/pr85213.c index e903e976f2c..8a6be81d20f 100644 --- a/gcc/testsuite/c-c++-common/ubsan/pr85213.c +++ b/gcc/testsuite/c-c++-common/ubsan/pr85213.c @@ -1,11 +1,6 @@ /* PR sanitizer/85213 */ /* { dg-do compile } */ -/* Pass -gno-statement-frontiers to work around - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100733 : - without it the IR coming from the front end may be different with and without - debug information turned on. That may cause e.g., different discriminator values - and -fcompare-debug failures. */ -/* { dg-options "-O1 -fsanitize=undefined -fcompare-debug -gno-statement-frontiers" } */ +/* { dg-options "-O1 -fsanitize=undefined -fcompare-debug" } */ int foo (int x) -- 2.25.1