diff mbox series

[committed,PR,target/111362] Fix compare-debug issue with mode switching

Message ID e6a03d60-de67-4625-a153-318ff63a5e3b@ventanamicro.com
State New
Headers show
Series [committed,PR,target/111362] Fix compare-debug issue with mode switching | expand

Commit Message

Jeff Law March 10, 2024, 2:39 a.m. UTC
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.

Pushing to the trunk.

Jeff
commit 50531b6d400945793a1d549e6ee941d989319d42
Author: jlaw <jeffreyalaw@gmail.com>
Date:   Sat Mar 9 19:27:32 2024 -0700

    [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.
diff mbox series

Patch

diff --git a/gcc/mode-switching.cc b/gcc/mode-switching.cc
index 583929184ce..a145b77397d 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 00000000000..d65bb287b9a
--- /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 00000000000..d87758475e4
--- /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"