On Mon, Jun 22, 2026 at 6:12 AM Andrew Pinski
<[email protected]> wrote:
>
> So it turns out I thought we would always get a virtual phi when there was a 
> store
> in front of the load. This is correct for all normal code except if heading 
> into
> an infinite loop where there are no stores/loads. Since this is leading to
> an infinite loop, rejecting this case does not change performance at all.
>
> Bootstrapped and tested on x86_64-linux-gnu.

OK

>         PR tree-optimization/125923
>
> gcc/ChangeLog:
>
>         * tree-ssa-phiopt.cc (factor_out_conditional_load): Change
>         assert of the vuse being the same to rejecting if they are
>         different without a virtual phi.
>
> gcc/testsuite/ChangeLog:
>
>         * gcc.dg/torture/pr125923-1.c: New test.
>
> Signed-off-by: Andrew Pinski <[email protected]>
> ---
>  gcc/testsuite/gcc.dg/torture/pr125923-1.c | 12 ++++++++++++
>  gcc/tree-ssa-phiopt.cc                    |  7 +++++--
>  2 files changed, 17 insertions(+), 2 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.dg/torture/pr125923-1.c
>
> diff --git a/gcc/testsuite/gcc.dg/torture/pr125923-1.c 
> b/gcc/testsuite/gcc.dg/torture/pr125923-1.c
> new file mode 100644
> index 00000000000..1edce7d388f
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/torture/pr125923-1.c
> @@ -0,0 +1,12 @@
> +/* { dg-do compile } */
> +/* { dg-additional-options "-fno-tree-dce" } */
> +/* PR tree-optimization/125923 */
> +
> +int a, b, c, d;
> +void e() {
> +  d = a && d;
> +  if (b)
> +    b = 0;
> +  while (!a || b)
> +    c ^= 1;
> +}
> diff --git a/gcc/tree-ssa-phiopt.cc b/gcc/tree-ssa-phiopt.cc
> index c73a81c4166..7a623fc4c0c 100644
> --- a/gcc/tree-ssa-phiopt.cc
> +++ b/gcc/tree-ssa-phiopt.cc
> @@ -3713,8 +3713,11 @@ factor_out_conditional_load (edge e0, edge e1, 
> basic_block merge, gphi *phi,
>           || gimple_vuse (load1) != gimple_phi_arg_def (vphi, e1->dest_idx))
>         return false;
>      }
> -  else
> -    gcc_assert (gimple_vuse (load0) == gimple_vuse (load1));
> +  /* Sometimes due to not removing dead statements,
> +     a virtual phi does not show up going into an infinite loop
> +     so just reject that case.  */
> +  else if (gimple_vuse (load0) != gimple_vuse (load1))
> +    return false;
>
>    tree ref0 = gimple_assign_rhs1 (load0);
>    tree ref1 = gimple_assign_rhs1 (load1);
> --
> 2.43.0
>

Reply via email to