Re: [PATCH] tree-optimization/108888 - call if-conversion
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/10 > * 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/10 > > * 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/pr10.C: New testcase. > > --- > > gcc/testsuite/g++.dg/torture/pr10.C | 18 ++ > > gcc/tree-if-conv.cc | 17 ++--- > > 2 files changed, 28 insertions(+), 7 deletions(-) > > create mode 100644 gcc/testsuite/g++.dg/torture/pr10.C > > > > diff --git a/gcc/testsuite/g++.dg/torture/pr10.C > > b/gcc/testsuite/g++.dg/torture/pr10.C > > new file mode 100644 > > index 000..29a22e21102 > > --- /dev/null > > +++ b/gcc/testsuite/g++.dg/torture/pr10.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 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, )); > > 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 (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 (gsi_stmt (gsi)); > > tree orig_fn = gimple_call_fn (call); > > int orig_nargs = gimple_call_num_args (call); > > auto_vec args; > -- Richard Biener SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman; HRB 36809 (AG Nuernberg)
Re: [PATCH] tree-optimization/108888 - call if-conversion
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. Bootstrapped and regression tested on aarch64-none-linux-gnu and x86_64-pc-linux-gnu. Is this OK for trunk? gcc/ChangeLog: PR tree-optimization/10 * 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/10 * 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/pr10.C: New testcase. --- gcc/testsuite/g++.dg/torture/pr10.C | 18 ++ gcc/tree-if-conv.cc | 17 ++--- 2 files changed, 28 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/g++.dg/torture/pr10.C diff --git a/gcc/testsuite/g++.dg/torture/pr10.C b/gcc/testsuite/g++.dg/torture/pr10.C new file mode 100644 index 000..29a22e21102 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr10.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 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, )); 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 (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 (gsi_stmt (gsi)); tree orig_fn = gimple_call_fn (call); int orig_nargs = gimple_call_num_args (call); auto_vec args;diff --git a/gcc/testsuite/gcc.dg/vect/vect-simd-clone-16.c b/gcc/testsuite/gcc.dg/vect/vect-simd-clone-16.c index 3ff1cfee05951609d8ca93291d5d7c47cb07ec0d..125ff4f6c8d7df5e289187e523d32e0d12db9769 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-simd-clone-16.c +++ b/gcc/testsuite/gcc.dg/vect/vect-simd-clone-16.c @@ -9,7 +9,7 @@ #endif /* A simple function that will be cloned. */ -#pragma omp declare simd +#pragma omp declare simd inbranch TYPE __attribute__((noinline)) foo (TYPE a) { diff --git a/gcc/testsuite/gcc.dg/vect/vect-simd-clone-17.c b/gcc/testsuite/gcc.dg/vect/vect-simd-clone-17.c index 803e0f25d45c1069633486c7b7d805638db83482..3430d6f5aa4f3ae3ed8bdfda80ef99d5517f15c6 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-simd-clone-17.c +++ b/gcc/testsuite/gcc.dg/vect/vect-simd-clone-17.c @@ -9,7 +9,7 @@ #endif /* A simple function that will be cloned. */ -#pragma omp declare simd
[PATCH] tree-optimization/108888 - call if-conversion
The following makes sure to only predicate calls necessary. Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed. PR tree-optimization/10 * 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/pr10.C: New testcase. --- gcc/testsuite/g++.dg/torture/pr10.C | 18 ++ gcc/tree-if-conv.cc | 17 ++--- 2 files changed, 28 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/g++.dg/torture/pr10.C diff --git a/gcc/testsuite/g++.dg/torture/pr10.C b/gcc/testsuite/g++.dg/torture/pr10.C new file mode 100644 index 000..29a22e21102 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr10.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 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, )); 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 (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 (gsi_stmt (gsi)); tree orig_fn = gimple_call_fn (call); int orig_nargs = gimple_call_num_args (call); auto_vec args; -- 2.35.3