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 <rguent...@suse.de>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to