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
>