Message ID | patch-18131-tamar@arm.com |
---|---|
State | New |
Headers | show |
Series | middle-end: thread through existing LCSSA variable for alternative exits too [PR113237] | expand |
On 1/7/24 18:29, Tamar Christina wrote: > 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. Might that be the same error as I got here when building with bootstrap-lto and bootstrap-O3: https://gcc.gnu.org/pipermail/gcc-testresults/2024-January/804807.html ?
No, that error is fixed by some earlier patches sent early last week that are awaiting review :)
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; > } > > > > > >
--- /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; }