On Sun, 7 Jan 2024, Tamar Christina wrote:
> Hi All,
>
> Builing on top of the previous patch, similar to when we have a single exit if
> we have a case where all exits are considered early exits and there are
> existing
> non virtual phi then in order to maintain LCSSA we have to use the existing
> PHI
> variables. We can't simply clear them and just rebuild them because the order
> of the PHIs in the main exit must match the original exit for when we add the
> skip_epilog guard.
>
> But the infrastructure is already in place to maintain them, we just have to
> use
> the right value.
>
> Bootstrapped Regtested on aarch64-none-linux-gnu, x86_64-pc-linux-gnu
> and no issues normally and with with --enable-checking=release --enable-lto
> --with-build-config=bootstrap-O3 --enable-checking=yes,rtl,extra.
>
> Ok for master?
OK
Richard.
> Thanks,
> Tamar
>
> gcc/ChangeLog:
>
> PR tree-optimization/113237
> * tree-vect-loop-manip.cc (slpeel_tree_duplicate_loop_to_edge_cfg): Use
> existing LCSSA variable for exit when all exits are early break.
>
> gcc/testsuite/ChangeLog:
>
> PR tree-optimization/113237
> * gcc.dg/vect/vect-early-break_98-pr113237.c: New test.
>
> --- inline copy of patch --
> diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_98-pr113237.c
> b/gcc/testsuite/gcc.dg/vect/vect-early-break_98-pr113237.c
> new file mode 100644
> index
> 0000000000000000000000000000000000000000..e6d150b571f753e9eb3859f06f62b371817494a3
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_98-pr113237.c
> @@ -0,0 +1,20 @@
> +/* { dg-do compile } */
> +/* { dg-add-options vect_early_break } */
> +/* { dg-require-effective-target vect_early_break } */
> +/* { dg-require-effective-target vect_int } */
> +
> +long Perl_pp_split_limit;
> +int Perl_block_gimme();
> +int Perl_pp_split() {
> + char strend;
> + long iters;
> + int gimme = Perl_block_gimme();
> + while (--Perl_pp_split_limit) {
> + if (gimme)
> + iters++;
> + if (strend)
> + break;
> + }
> + if (iters)
> + return 0;
> +}
> diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc
> index
> 7fd6566341b4893a1e209d1f8ff65d6d180f1190..77649b84f45b9e5dacec2809e0c854c8fcc17ce1
> 100644
> --- a/gcc/tree-vect-loop-manip.cc
> +++ b/gcc/tree-vect-loop-manip.cc
> @@ -1700,7 +1700,12 @@ slpeel_tree_duplicate_loop_to_edge_cfg (class loop
> *loop, edge loop_exit,
> if (peeled_iters && !virtual_operand_p (new_arg))
> {
> tree tmp_arg = gimple_phi_result (from_phi);
> - if (!new_phi_args.get (tmp_arg))
> + /* Similar to the single exit case, If we have an existing
> + LCSSA variable thread through the original value otherwise
> + skip it and directly use the final value. */
> + if (tree *res = new_phi_args.get (tmp_arg))
> + new_arg = *res;
> + else
> new_arg = tmp_arg;
> }
>
>
>
>
>
>
--
Richard Biener <[email protected]>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)