From 50531b6d400945793a1d549e6ee941d989319d42 Mon Sep 17 00:00:00 2001 From: jlaw Date: Sat, 9 Mar 2024 19:27:32 -0700 Subject: [PATCH] [committed] [PR target/111362] Fix compare-debug issue with mode switching The issue here is the code we emit for mode-switching can change when -g is added to the command line. This is caused by processing debug notes occurring after a call which is the last real statement in a basic block. Without -g the CALL_INSN is literally the last insn in the block and the loop exits. If mode switching after the call is needed, it'll be handled as we process outgoing edges. With -g the loop iterates again and in the processing of the node the backend signals that a mode switch is necessary. I pondered fixing this in the target, but the better fix is to ignore the debug notes in the insn stream. I did a cursory review of some of the other compare-debug failures, but did not immediately see others which would likely be fixed by this change. Sigh. Anyway, bootstrapped and regression tested on x86. Regression tested on rv64 as well. PR target/111362 gcc/ * mode-switching.cc (optimize_mode_switching): Only process NONDEBUG insns. gcc/testsuite * gcc.target/riscv/compare-debug-1.c: New test. * gcc.target/riscv/compare-debug-2.c: New test. --- gcc/mode-switching.cc | 2 +- gcc/testsuite/gcc.target/riscv/compare-debug-1.c | 9 +++++++++ gcc/testsuite/gcc.target/riscv/compare-debug-2.c | 3 +++ 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.target/riscv/compare-debug-1.c create mode 100644 gcc/testsuite/gcc.target/riscv/compare-debug-2.c diff --git a/gcc/mode-switching.cc b/gcc/mode-switching.cc index 583929184ce7..a145b77397d1 100644 --- a/gcc/mode-switching.cc +++ b/gcc/mode-switching.cc @@ -959,7 +959,7 @@ optimize_mode_switching (void) FOR_BB_INSNS (bb, insn) { - if (INSN_P (insn)) + if (NONDEBUG_INSN_P (insn)) { int mode = targetm.mode_switching.needed (e, insn, live_now); rtx link; diff --git a/gcc/testsuite/gcc.target/riscv/compare-debug-1.c b/gcc/testsuite/gcc.target/riscv/compare-debug-1.c new file mode 100644 index 000000000000..d65bb287b9a7 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/compare-debug-1.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fno-tree-ch --param=max-completely-peel-times=0 -march=rv64iv -mabi=lp64d -fcompare-debug" } */ + + +void +foo(void) { + for (unsigned i = 0; i < sizeof(foo); i++) + __builtin_printf("%d", i); +} diff --git a/gcc/testsuite/gcc.target/riscv/compare-debug-2.c b/gcc/testsuite/gcc.target/riscv/compare-debug-2.c new file mode 100644 index 000000000000..d87758475e46 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/compare-debug-2.c @@ -0,0 +1,3 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fno-tree-ch --param=max-completely-peel-times=0 -march=rv64iv -mabi=lp64d -fno-dce -fschedule-insns -fcompare-debug" } */ +#include "compare-debug-1.c" -- 2.47.2