Hi!

The vec-cmp SLP patch added
+                 if (VECTOR_BOOLEAN_TYPE_P (vector_type))
+                   {
+                     /* Can't use VIEW_CONVERT_EXPR for booleans because
+                        of possibly different sizes of scalar value and
+                        vector element.  */
...
+                   }
hunk a few lines above this spot, but that only handles constants.
For non-constants, the problem is similar, boolean vector element type might
have different size from the op's type, but it really should be fold
convertible to that, so while we can't use VCE, we can use a NOP_EXPR
instead.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2016-01-04  Jakub Jelinek  <ja...@redhat.com>

        PR tree-optimization/69083
        * tree-vect-slp.c (vect_get_constant_vectors): For
        VECTOR_BOOLEAN_TYPE_P assert op is fold_convertible_p to vector_type's
        element type.  If op is fold_convertible_p to vector_type's element
        type, use NOP_EXPR instead of VCE.

        * gcc.dg/vect/pr69083.c: New test.

--- gcc/tree-vect-slp.c.jj      2015-12-18 09:38:27.000000000 +0100
+++ gcc/tree-vect-slp.c 2016-01-04 12:56:20.800412147 +0100
@@ -2967,9 +2967,22 @@ vect_get_constant_vectors (tree op, slp_
                {
                  tree new_temp = make_ssa_name (TREE_TYPE (vector_type));
                  gimple *init_stmt;
-                 op = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (vector_type), op);
-                 init_stmt
-                   = gimple_build_assign (new_temp, VIEW_CONVERT_EXPR, op);
+                 if (VECTOR_BOOLEAN_TYPE_P (vector_type))
+                   {
+                     gcc_assert (fold_convertible_p (TREE_TYPE (vector_type),
+                                                     op));
+                     init_stmt = gimple_build_assign (new_temp, NOP_EXPR, op);
+                   }
+                 else if (fold_convertible_p (TREE_TYPE (vector_type), op))
+                   init_stmt = gimple_build_assign (new_temp, NOP_EXPR, op);
+                 else
+                   {
+                     op = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (vector_type),
+                                  op);
+                     init_stmt
+                       = gimple_build_assign (new_temp, VIEW_CONVERT_EXPR,
+                                              op);
+                   }
                  gimple_seq_add_stmt (&ctor_seq, init_stmt);
                  op = new_temp;
                }
--- gcc/testsuite/gcc.dg/vect/pr69083.c.jj      2016-01-04 13:11:51.958279240 
+0100
+++ gcc/testsuite/gcc.dg/vect/pr69083.c 2016-01-04 13:12:36.142663787 +0100
@@ -0,0 +1,20 @@
+/* PR tree-optimization/69083 */
+/* { dg-do compile } */
+/* { dg-additional-options "-O3" } */
+
+int d;
+short f;
+
+void
+foo (int a, int b, int e, short c)
+{
+  for (; e; e++)
+    {
+      int j;
+      for (j = 0; j < 3; j++)
+       {
+         f = 7 >> b ? a : b;
+         d |= c == 1 ^ 1 == f;
+       }
+    }
+}

        Jakub

Reply via email to