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.
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.
Assisted-by: OpenAI Codex 5.6 Sol, co-reviewed by Claude and Yongqiang Tian.
Signed-off-by: Yongqiang Tian <[email protected]>
---
gcc/reorg.cc | 10 +--
gcc/testsuite/gcc.target/sparc/pr127421.c | 75 +++++++++++++++++++++++
2 files changed, 77 insertions(+), 8 deletions(-)
create mode 100644 gcc/testsuite/gcc.target/sparc/pr127421.c
diff --git a/gcc/reorg.cc b/gcc/reorg.cc
index 02fa19a118a..76b3e1438f0 100644
--- a/gcc/reorg.cc
+++ b/gcc/reorg.cc
@@ -1417,7 +1417,7 @@ redundant_insn (rtx insn, rtx_insn *target, const
vec<rtx_insn *> &delay_list)
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 @@ redundant_insn (rtx insn, rtx_insn *target, const
vec<rtx_insn *> &delay_list)
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 @@ redundant_insn (rtx insn, rtx_insn *target, const
vec<rtx_insn *> &delay_list)
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 @@ redundant_insn (rtx insn, rtx_insn *target, const
vec<rtx_insn *> &delay_list)
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 00000000000..6a19eb87350
--- /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;
+}
--
2.34.1