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
>

Reply via email to