Gentle ping: https://gcc.gnu.org/pipermail/gcc-patches/2021-December/587309.html
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 >