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

Reply via email to