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