Hi!

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.

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk?

2020-01-16  Jakub Jelinek  <ja...@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/tree-vect-stmts.c.jj    2020-01-12 11:54:38.522381590 +0100
+++ gcc/tree-vect-stmts.c       2020-01-16 19:42:30.608888882 +0100
@@ -10492,7 +10492,7 @@ vectorizable_comparison (stmt_vec_info s
     {
       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)))
--- gcc/testsuite/g++.dg/opt/pr93292.C.jj       2020-01-16 19:48:51.110144613 
+0100
+++ gcc/testsuite/g++.dg/opt/pr93292.C  2020-01-16 19:47:57.351956177 +0100
@@ -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);
+    }
+}

        Jakub

Reply via email to