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; +}