On Wed, Jan 26, 2022 at 3:15 AM Kewen.Lin via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > Gentle ping: > > https://gcc.gnu.org/pipermail/gcc-patches/2021-December/587309.html
OK. Thanks, Richard. > BR, > Kewen > > > on 2021/12/23 上午10:06, Kewen.Lin via Gcc-patches wrote: > >> Hi, > >> > >> This patch is to fix one wrong assertion which is too aggressive. > >> Vectorizer can do vec_construct costing for the vector type which > >> only has one unit. For the failed case, the passed-in vector type > >> is "vector(1) int", though it doesn't end up with any construction > >> eventually. We have to handle this kind of input in function > >> rs6000_cost_data::update_target_cost_per_stmt. > >> > >> Bootstrapped and regtested on powerpc64le-linux-gnu P9 and > >> powerpc64-linux-gnu P8. > >> > >> Is it ok for trunk? > >> > >> BR, > >> Kewen > >> ----- > >> gcc/ChangeLog: > >> > >> PR target/103702 > >> * config/rs6000/rs6000.c > >> (rs6000_cost_data::update_target_cost_per_stmt): Fix one wrong > >> assertion with early return. > >> > >> gcc/testsuite/ChangeLog: > >> > >> PR target/103702 > >> * gcc.target/powerpc/pr103702.c: New test. > >> --- > >> gcc/config/rs6000/rs6000.c | 7 ++++-- > >> gcc/testsuite/gcc.target/powerpc/pr103702.c | 24 +++++++++++++++++++++ > >> 2 files changed, 29 insertions(+), 2 deletions(-) > >> create mode 100644 gcc/testsuite/gcc.target/powerpc/pr103702.c > >> > >> diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c > >> index 0b09713b2f5..37f07fe5358 100644 > >> --- a/gcc/config/rs6000/rs6000.c > >> +++ b/gcc/config/rs6000/rs6000.c > >> @@ -5461,8 +5461,11 @@ rs6000_cost_data::update_target_cost_per_stmt > >> (vect_cost_for_stmt kind, > >> { > >> tree vectype = STMT_VINFO_VECTYPE (stmt_info); > >> unsigned int nunits = vect_nunits_for_cost (vectype); > >> - /* We don't expect strided/elementwise loads for just 1 nunit. */ > >> - gcc_assert (nunits > 1); > >> + /* As PR103702 shows, it's possible that vectorizer wants to do > >> + costings for only one unit here, it's no need to do any > >> + penalization for it, so simply early return here. */ > >> + if (nunits == 1) > >> + return; > >> /* i386 port adopts nunits * stmt_cost as the penalized cost > >> for this kind of penalization, we used to follow it but > >> found it could result in an unreliable body cost especially > >> diff --git a/gcc/testsuite/gcc.target/powerpc/pr103702.c > >> b/gcc/testsuite/gcc.target/powerpc/pr103702.c > >> new file mode 100644 > >> index 00000000000..585946fd64b > >> --- /dev/null > >> +++ b/gcc/testsuite/gcc.target/powerpc/pr103702.c > >> @@ -0,0 +1,24 @@ > >> +/* We don't have one powerpc.*_ok for Power6, use altivec_ok > >> conservatively. */ > >> +/* { dg-require-effective-target powerpc_altivec_ok } */ > >> +/* { dg-options "-mdejagnu-cpu=power6 -O2 -ftree-loop-vectorize > >> -fno-tree-scev-cprop" } */ > >> + > >> +/* Verify there is no ICE. */ > >> + > >> +unsigned short a, e; > >> +int *b, *d; > >> +int c; > >> +extern int fn2 (); > >> +void > >> +fn1 () > >> +{ > >> + void *f; > >> + for (;;) > >> + { > >> + fn2 (); > >> + b = f; > >> + e = 0; > >> + for (; e < a; ++e) > >> + b[e] = d[e * c]; > >> + } > >> +} > >> + > >> -- > >> 2.27.0 > >> >