vect: Fix ICE in vectorizable_comparison PR93292
authorJakub Jelinek <jakub@redhat.com>
Fri, 17 Jan 2020 08:39:45 +0000 (09:39 +0100)
committerJakub Jelinek <jakub@redhat.com>
Fri, 17 Jan 2020 08:39:45 +0000 (09:39 +0100)
The following testcase ICEs on powerpc64le-linux.  The problem is that
get_vectype_for_scalar_type returns NULL, and while most places in
tree-vect-stmts.c handle that case, this spot doesn't and punts only
if it is non-NULL, but with different number of elts than expected.

2020-01-17  Jakub Jelinek  <jakub@redhat.com>

PR tree-optimization/93292
* tree-vect-stmts.c (vectorizable_comparison): Punt also if
get_vectype_for_scalar_type returns NULL.

* g++.dg/opt/pr93292.C: New test.

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/pr93292.C [new file with mode: 0644]
gcc/tree-vect-stmts.c

index e364f616fd9ae2952ae7efbe7a88e2e715c4bc66..d8c34b283bd84ce346888e62f939de527ae82a1f 100644 (file)
@@ -1,3 +1,9 @@
+2020-01-17  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/93292
+       * tree-vect-stmts.c (vectorizable_comparison): Punt also if
+       get_vectype_for_scalar_type returns NULL.
+
 2020-01-16  Jan Hubicka  <hubicka@ucw.cz>
 
        * params.opt (-param=max-predicted-iterations): Increase range from 0.
index eea3bd2ccb371e0202166d34ffc21135527a3c3d..5bd1ab21271bddad9000955b73674b8797cb159d 100644 (file)
@@ -1,5 +1,8 @@
 2020-01-17  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/93292
+       * g++.dg/opt/pr93292.C: New test.
+
        PR testsuite/93294
        * lib/c-compat.exp (compat-use-alt-compiler): Handle
        -fdiagnostics-urls=never similarly to -fdiagnostics-color=never.
diff --git a/gcc/testsuite/g++.dg/opt/pr93292.C b/gcc/testsuite/g++.dg/opt/pr93292.C
new file mode 100644 (file)
index 0000000..a368319
--- /dev/null
@@ -0,0 +1,18 @@
+// PR tree-optimization/93292
+// { dg-do compile }
+// { dg-options "-O3 -w" }
+
+struct A {
+  static int foo (float x) { static int b; b = x ? x + 0.5 : 0; return b; }
+};
+
+void
+bar (int *d, float e)
+{
+  float g;
+  for (int h = 0; h < 64; h++)
+    {
+      d[h] += A::foo (g < 0 ? : g > 5 ? : g);
+      A::foo (e);
+    }
+}
index df2899b476399cccc3c17afc9b016692e28c1632..2ca8e494680d45dea486d91c97627acda941c879 100644 (file)
@@ -10492,7 +10492,7 @@ vectorizable_comparison (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
     {
       vectype = get_vectype_for_scalar_type (vinfo, TREE_TYPE (rhs1),
                                             slp_node);
-      if (maybe_ne (TYPE_VECTOR_SUBPARTS (vectype), nunits))
+      if (!vectype || maybe_ne (TYPE_VECTOR_SUBPARTS (vectype), nunits))
        return false;
     }
   else if (maybe_ne (nunits, TYPE_VECTOR_SUBPARTS (vectype)))