On Wed, 5 Apr 2023, Andre Vieira (lists) wrote: > Hi, > > The original patch to fix this PR broke the if-conversion of calls into > IFN_MASK_CALL. This patch restores that original behaviour and makes sure the > tests added earlier specifically test inbranch SIMD clones.
OOps. > Bootstrapped and regression tested on aarch64-none-linux-gnu and > x86_64-pc-linux-gnu. > > Is this OK for trunk? OK. Thanks, Richard. > gcc/ChangeLog: > > PR tree-optimization/108888 > * tree-if-conv.cc (predicate_statements): Fix gimple call check. > > gcc/testsuite/ChangeLog: > > * gcc.dg/vect/vect-simd-clone-16.c: Make simd clone inbranch only. > * gcc.dg/vect/vect-simd-clone-17.c: Likewise. > * gcc.dg/vect/vect-simd-clone-18.c: Likewise. > > On 23/02/2023 10:10, Richard Biener via Gcc-patches wrote: > > The following makes sure to only predicate calls necessary. > > > > Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed. > > > > PR tree-optimization/108888 > > * tree-if-conv.cc (if_convertible_stmt_p): Set PLF_2 on > > calls to predicate. > > (predicate_statements): Only predicate calls with PLF_2. > > > > * g++.dg/torture/pr108888.C: New testcase. > > --- > > gcc/testsuite/g++.dg/torture/pr108888.C | 18 ++++++++++++++++++ > > gcc/tree-if-conv.cc | 17 ++++++++++------- > > 2 files changed, 28 insertions(+), 7 deletions(-) > > create mode 100644 gcc/testsuite/g++.dg/torture/pr108888.C > > > > diff --git a/gcc/testsuite/g++.dg/torture/pr108888.C > > b/gcc/testsuite/g++.dg/torture/pr108888.C > > new file mode 100644 > > index 00000000000..29a22e21102 > > --- /dev/null > > +++ b/gcc/testsuite/g++.dg/torture/pr108888.C > > @@ -0,0 +1,18 @@ > > +// { dg-do compile } > > + > > +int scaleValueSaturate_scalefactor, scaleValueSaturate___trans_tmp_2, > > + scaleValuesSaturate_i; > > +int scaleValueSaturate(int value) { > > + int result = __builtin_clz(value); > > + if (value) > > + if (-result <= scaleValueSaturate_scalefactor) > > + return 0; > > + return scaleValueSaturate___trans_tmp_2; > > +} > > +short scaleValuesSaturate_dst; > > +short *scaleValuesSaturate_src; > > +void scaleValuesSaturate() { > > + for (; scaleValuesSaturate_i; scaleValuesSaturate_i++) > > + scaleValuesSaturate_dst = > > + scaleValueSaturate(scaleValuesSaturate_src[scaleValuesSaturate_i]); > > +} > > diff --git a/gcc/tree-if-conv.cc b/gcc/tree-if-conv.cc > > index a7a8406374d..0e384e36394 100644 > > --- a/gcc/tree-if-conv.cc > > +++ b/gcc/tree-if-conv.cc > > @@ -1099,6 +1099,7 @@ if_convertible_stmt_p (gimple *stmt, > > vec<data_reference_p> refs) > > n = n->simdclone->next_clone) > > if (n->simdclone->inbranch) > > { > > + gimple_set_plf (stmt, GF_PLF_2, true); > > need_to_predicate = true; > > return true; > > } > > @@ -2541,7 +2542,8 @@ predicate_statements (loop_p loop) > > release_defs (stmt); > > continue; > > } > > - else if (gimple_plf (stmt, GF_PLF_2)) > > + else if (gimple_plf (stmt, GF_PLF_2) > > + && is_gimple_assign (stmt)) > > { > > tree lhs = gimple_assign_lhs (stmt); > > tree mask; > > @@ -2625,13 +2627,14 @@ predicate_statements (loop_p loop) > > gimple_assign_set_rhs1 (stmt, ifc_temp_var (type, rhs, &gsi)); > > update_stmt (stmt); > > } > > - > > - /* Convert functions that have a SIMD clone to IFN_MASK_CALL. This > > - will cause the vectorizer to match the "in branch" clone > > variants, > > - and serves to build the mask vector in a natural way. */ > > - gcall *call = dyn_cast <gcall *> (gsi_stmt (gsi)); > > - if (call && !gimple_call_internal_p (call)) > > + else if (gimple_plf (stmt, GF_PLF_2) > > + && is_gimple_call (stmt)) > > { > > + /* Convert functions that have a SIMD clone to IFN_MASK_CALL. > > + This will cause the vectorizer to match the "in branch" > > + clone variants, and serves to build the mask vector > > + in a natural way. */ > > + gcall *call = dyn_cast <gcall *> (gsi_stmt (gsi)); > > tree orig_fn = gimple_call_fn (call); > > int orig_nargs = gimple_call_num_args (call); > > auto_vec<tree> args; > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman; HRB 36809 (AG Nuernberg)