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