On Wed, Sep 16, 2026 at 2:18 PM Yongqiang Tian <[email protected]> wrote:
>
> A DEBUG_INSN can retain a volatile MEM after the corresponding ordinary
> instruction has been deleted.  Do not treat that non-executing payload as an
> intervening volatile access in can_combine_p.

Please specify how you tested the patch.

OK if bootstrapped/tested.

Richard.

>         PR rtl-optimization/127422
>
> gcc/ChangeLog:
>
>         * combine.cc (can_combine_p): Ignore debug instructions when scanning
>         for intervening volatile references.
>
> gcc/testsuite/ChangeLog:
>
>         * gcc.dg/pr127422.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/combine.cc                  |  5 ++++-
>  gcc/testsuite/gcc.dg/pr127422.c | 35 +++++++++++++++++++++++++++++++++
>  2 files changed, 39 insertions(+), 1 deletion(-)
>  create mode 100644 gcc/testsuite/gcc.dg/pr127422.c
>
> diff --git a/gcc/combine.cc b/gcc/combine.cc
> index 35c6a529950..11427f5a920 100644
> --- a/gcc/combine.cc
> +++ b/gcc/combine.cc
> @@ -2024,7 +2024,10 @@ can_combine_p (rtx_insn *insn, rtx_insn *i3, rtx_insn 
> *pred ATTRIBUTE_UNUSED,
>      : volatile_insn_p;
>
>    for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
> -    if (INSN_P (p) && p != succ && p != succ2 && is_volatile_p (PATTERN (p)))
> +    if (NONDEBUG_INSN_P (p)
> +       && p != succ
> +       && p != succ2
> +       && is_volatile_p (PATTERN (p)))
>        return false;
>
>    /* If INSN contains an autoincrement or autodecrement, make sure that
> diff --git a/gcc/testsuite/gcc.dg/pr127422.c b/gcc/testsuite/gcc.dg/pr127422.c
> new file mode 100644
> index 00000000000..bba30ad7844
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr127422.c
> @@ -0,0 +1,35 @@
> +/* PR rtl-optimization/127422 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fcompare-debug" } */
> +
> +static int ordinary_0 = 3;
> +static int ordinary_1 = 22;
> +static volatile int effect_0 = 6;
> +static volatile int effect_1 = 23;
> +static int ordinary_2 = 41;
> +__attribute__ ((used)) int *ordinary_escape[]
> +    = { &ordinary_0, &ordinary_1, &ordinary_2 };
> +
> +static inline __attribute__ ((always_inline))
> +unsigned long long
> +accumulate (unsigned long long acc, unsigned long long val)
> +{
> +  return acc + val;
> +}
> +
> +unsigned long long
> +foo (void)
> +{
> +  int staged_ordinary_0 = ordinary_0;
> +  int staged_ordinary_1 = ordinary_1;
> +  int staged_effect_0 = effect_0;
> +  int staged_effect_1 = effect_1;
> +  int staged_ordinary_2 = ordinary_2;
> +  unsigned long long sum = 0;
> +  sum = accumulate (sum, staged_ordinary_0);
> +  sum = accumulate (sum, staged_ordinary_1);
> +  sum = accumulate (sum, staged_effect_0);
> +  sum = accumulate (sum, staged_effect_1);
> +  sum = accumulate (sum, staged_ordinary_2);
> +  return sum;
> +}
> --
> 2.34.1
>

Reply via email to