On Mon, Jun 8, 2026 at 12:41 PM Richard Sandiford
<[email protected]> wrote:
>
> r17-1238-g8e3eff39a4564c added an early return for SSA names that
> occur in abnormal phis.  That had the effect of bypassing the later:
>
>           /* If STMT is a phi, remove any information recorded for
>              its arguments.  */
>           if (is_a <gphi *> (stmt))
>             reprocess_inputs (stmt);
>
> That reprocessing is important since (by design) the pass initially
> makes optimistic assumptions about backedges.
>
> Tested on aarch64-linux-gnu, powerpc64le-linux-gnu and x86_64-linux-gnu.
> Also tested by Sam on the glibc testsuite (thanks!).
>
> OK to install?

OK.

Richard.

> Richard
>
>
> gcc/
>         PR tree-optimization/125653
>         * gimple-ssa-backprop.cc (backprop::process_var): Avoid early
>         return for SSA names that occur in abnormal phis.
>
> gcc/testsuite/
>         PR tree-optimization/125653
>         * gcc.dg/torture/pr125653.c: New test.
> ---
>  gcc/gimple-ssa-backprop.cc              |  9 ++++-----
>  gcc/testsuite/gcc.dg/torture/pr125653.c | 26 +++++++++++++++++++++++++
>  2 files changed, 30 insertions(+), 5 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.dg/torture/pr125653.c
>
> diff --git a/gcc/gimple-ssa-backprop.cc b/gcc/gimple-ssa-backprop.cc
> index f32f18f1014..e101430bb8e 100644
> --- a/gcc/gimple-ssa-backprop.cc
> +++ b/gcc/gimple-ssa-backprop.cc
> @@ -633,12 +633,11 @@ backprop::process_var (tree var, var_info *v)
>    if (has_zero_uses (var))
>      return;
>
> -  /* Propagating along abnormal edges is delicate, punt for now.  */
> -  if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (var))
> -    return;
> -
>    usage_info info;
> -  intersect_uses (var, &info);
> +
> +  /* Propagating along abnormal edges is delicate, punt for now.  */
> +  if (!SSA_NAME_OCCURS_IN_ABNORMAL_PHI (var))
> +    intersect_uses (var, &info);
>
>    gimple *stmt = SSA_NAME_DEF_STMT (var);
>    auto hash = SSA_NAME_VERSION (var);
> diff --git a/gcc/testsuite/gcc.dg/torture/pr125653.c 
> b/gcc/testsuite/gcc.dg/torture/pr125653.c
> new file mode 100644
> index 00000000000..d88f30f3d1f
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/torture/pr125653.c
> @@ -0,0 +1,26 @@
> +/* { dg-do run } */
> +
> +int
> +main ()
> +{
> +  __label__ set, neg, check;
> +  void *ops[] = { &&set, &&neg, &&check };
> +  int i = 0;
> +  double foo = 0.0;
> +
> +next:
> +  goto *ops[i++];
> +
> +set:
> +  foo = 1.0;
> +  goto next;
> +
> +neg:
> +  foo = -foo;
> +  goto next;
> +
> +check:
> +  if (foo != -1.0)
> +    __builtin_abort ();
> +  return 0;
> +}
> --
> 2.54.0
>

Reply via email to