On Wed, Sep 16, 2026 at 2:19 PM Yongqiang Tian <[email protected]> wrote: > > 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.
OK if bootstrapped/tested. I'll note that this gets back compile-time issues for testcases that are dominated by DEBUG_INSNs (which can happen). But there's not really a way out here w/o introducing compare-debug issues like this. Richard. > 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 >
