On 6/10/2026 1:10 PM, [email protected] wrote:
> From: Kyrylo Tkachov <[email protected]>
>
> factor_out_conditional_load currently only runs from the sink pass.  Also call
> it from phiopt itself when the join block of a diamond load PHI <*P, *Q> lies
> outside any loop: there is nothing to loop-vectorise there, so commoning the
> two arm loads into a single P' = PHI <P, Q>; result = *P' is a pure win and is
> cheap to attempt.
>
> This is restricted to:
>    * the late phiopt run (!early_p), since after inlining the region may yet
>      become part of a loop where the commoned load could inhibit 
> vectorisation;
>    * SSA-name arm pointers (a new REQUIRE_SSA_ARGS argument to
>      factor_out_conditional_load), so that phiprop does not undo it.
>
> This triggers a few 100s times in SPEC2026 with no harmful effects. The
> llvm benchmarks improves slightly on my aarch64 machine (1.6%)
>
> Bootstrapped and tested on aarch64-none-linux-gnu.
> Ok for trunk after the prerequisites?
>
> Thanks,
> Kyrill
>
> Signed-off-by: Kyrylo Tkachov <[email protected]>
>
> gcc/
>       PR tree-optimization/125557
>       * tree-ssa-phiopt.h (conditional_load_factorable_p)
>       (factor_out_conditional_load): Add a REQUIRE_SSA_ARGS parameter
>       defaulting to false.
>       * tree-ssa-phiopt.cc (conditional_load_factorable_p): Honour
>       REQUIRE_SSA_ARGS.
>       (factor_out_conditional_load): Pass it through.
>       (pass_phiopt::execute): Call factor_out_conditional_load for
>       out-of-loop diamonds in the late run.
>
> gcc/testsuite/
>
>       PR tree-optimization/125557
>       * gcc.dg/tree-ssa/phiopt-factor-load-1.c: New test.
> ---
>
> diff --git a/gcc/tree-ssa-phiopt.h b/gcc/tree-ssa-phiopt.h
> index 7383095f5a5..8f9b9edcdad 100644
> --- a/gcc/tree-ssa-phiopt.h
> +++ b/gcc/tree-ssa-phiopt.h
> @@ -25,11 +25,13 @@ extern int find_different_opnum (const gimple_match_op 
> &arg0_op,
>   /* True if factor_out_conditional_load would factor the load PHI at MERGE; 
> lets
>      the sink pass gate on commonability without mutating.  */
>   extern bool conditional_load_factorable_p (edge e0, edge e1, basic_block 
> merge,
> -                                        gphi *phi);
> +                                        gphi *phi,
> +                                        bool require_ssa_args = false);
I tend to prefer fixing caller rather than defaulting arguments.  If 
there's only a few call sites just fix them.  Similarly for 
factor_out_conditional_load.

OK when prereqs go in.  Ideally with the defaulted arguments fixed too.

jeff

Reply via email to