reorg: Do not charge debug insns against search budget [PR127421]

Skip DEBUG_INSNs before decrementing the bounded redundant_insn search
budget.  Debug instructions do not execute and should not hide an otherwise
reachable ordinary redundancy witness.

Assisted-by: OpenAI Codex 5.6 Sol, co-reviewed by Claude and Yongqiang Tian.

	PR rtl-optimization/127421

gcc/ChangeLog:

	* reorg.cc (redundant_insn): Use NONDEBUG_INSN_P in both bounded
	backward walks.  Remove redundant debug-instruction checks.

gcc/testsuite/ChangeLog:

	* gcc.target/sparc/pr127421.c: New test.

Signed-off-by: Yongqiang Tian <yqtian668@gmail.com>
diff --git a/gcc/reorg.cc b/gcc/reorg.cc
index 02fa19a..76b3e14 100644
--- a/gcc/reorg.cc
+++ b/gcc/reorg.cc
@@ -1417,7 +1417,7 @@
       if (LABEL_P (trial) || BARRIER_P (trial))
 	return 0;
 
-      if (!INSN_P (trial))
+      if (!NONDEBUG_INSN_P (trial))
 	continue;
       --insns_to_search;
 
@@ -1425,9 +1425,6 @@
       if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER)
 	continue;
 
-      if (GET_CODE (trial) == DEBUG_INSN)
-	continue;
-
       if (rtx_sequence *seq = dyn_cast <rtx_sequence *> (pat))
 	{
 	  /* Stop for a CALL and its delay slots because it is difficult to
@@ -1514,7 +1511,7 @@
        trial && !LABEL_P (trial) && insns_to_search > 0;
        trial = PREV_INSN (trial))
     {
-      if (!INSN_P (trial))
+      if (!NONDEBUG_INSN_P (trial))
 	continue;
       --insns_to_search;
 
@@ -1522,9 +1519,6 @@
       if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER)
 	continue;
 
-      if (GET_CODE (trial) == DEBUG_INSN)
-	continue;
-
       if (rtx_sequence *seq = dyn_cast <rtx_sequence *> (pat))
 	{
 	  bool annul_p = false;
diff --git a/gcc/testsuite/gcc.target/sparc/pr127421.c b/gcc/testsuite/gcc.target/sparc/pr127421.c
new file mode 100644
index 0000000..6a19eb8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/sparc/pr127421.c
@@ -0,0 +1,75 @@
+/* PR rtl-optimization/127421 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -mcpu=v8 -fno-var-tracking -fno-var-tracking-assignments -fno-asynchronous-unwind-tables --param=max-delay-slot-insn-search=8 -fcompare-debug" } */
+
+typedef unsigned int uint32_t;
+typedef unsigned long long uint64_t;
+
+extern int printf (const char *, ...);
+extern int putchar (int);
+extern int strcmp (const char *, const char *);
+
+static uint64_t checksum;
+static uint32_t values[3] =
+  { 4294967295U, 4294967295U, 4294967295U };
+
+static void
+put_string (const char *s)
+{
+  int i = 0;
+  while (s[i])
+    putchar (s[i++]);
+}
+
+static void
+put_hex_digit (int x)
+{
+  switch (x)
+    {
+    case 0: putchar ('0'); break;
+    case 1: putchar ('1'); break;
+    case 2: putchar ('2'); break;
+    case 3: putchar ('3'); break;
+    case 4: putchar ('4'); break;
+    case 5: putchar ('5'); break;
+    case 6: putchar ('6'); break;
+    case 7: putchar ('7'); break;
+    case 8: putchar ('8'); break;
+    case 9: putchar ('9'); break;
+    case 10: putchar ('a'); break;
+    case 11: putchar ('b'); break;
+    case 12: putchar ('c'); break;
+    case 13: putchar ('d'); break;
+    case 14: putchar ('e'); break;
+    case 15: putchar ('f'); break;
+    }
+}
+
+static void
+print_checksum (uint64_t x)
+{
+  int i;
+  put_string ("checksum = ");
+  for (i = 0; i < 16; i++)
+    {
+      put_hex_digit (x & 15);
+      x >>= 4;
+    }
+  putchar ('\n');
+}
+
+int
+main (int argc, char **argv)
+{
+  int i;
+  int verbose = argc == 2 && strcmp (argv[1], "1") == 0;
+
+  for (i = 0; i < 3; i++)
+    {
+      checksum += values[i];
+      if (verbose)
+	printf ("index = [%d]\n", i);
+    }
+  print_checksum (checksum ^ 0xffffffffU);
+  return 0;
+}