Hi,
  The problem is that even though expand knows how to expand
VEC_COND<a, b, c> when there is no vcond_mask pattern,
expand_vec_cond_expr_p returns false.  So this patch allows
expand_vec_cond_expr_p to try the next part of the function if there
is no vcond_mask pattern.

OK? Bootstrapped and tested on aarch64-linux-gnu with no regressions.

Thanks,
Andrew Pinski

ChangeLog:
* optabs-tree.c (expand_vec_cond_expr_p): Don't early return if
get_vcond_mask_icode returns false.

Testsuite/ChangeLog:
* gcc.c-torture/compile/20160205-1.c: New testcase.
Index: optabs-tree.c
===================================================================
--- optabs-tree.c       (revision 233202)
+++ optabs-tree.c       (working copy)
@@ -323,8 +323,11 @@ expand_vec_cond_expr_p (tree value_type,
   machine_mode value_mode = TYPE_MODE (value_type);
   machine_mode cmp_op_mode = TYPE_MODE (cmp_op_type);
   if (VECTOR_BOOLEAN_TYPE_P (cmp_op_type))
-    return get_vcond_mask_icode (TYPE_MODE (value_type),
-                                TYPE_MODE (cmp_op_type)) != CODE_FOR_nothing;
+    {
+      if (get_vcond_mask_icode (TYPE_MODE (value_type),
+                               TYPE_MODE (cmp_op_type)) != CODE_FOR_nothing)
+       return true;
+    }
   if (GET_MODE_SIZE (value_mode) != GET_MODE_SIZE (cmp_op_mode)
       || GET_MODE_NUNITS (value_mode) != GET_MODE_NUNITS (cmp_op_mode)
       || get_vcond_icode (TYPE_MODE (value_type), TYPE_MODE (cmp_op_type),
Index: testsuite/gcc.c-torture/compile/20160205-1.c
===================================================================
--- testsuite/gcc.c-torture/compile/20160205-1.c        (revision 0)
+++ testsuite/gcc.c-torture/compile/20160205-1.c        (working copy)
@@ -0,0 +1,8 @@
+int a[32];
+int fn1(int d) {
+  int c = 1;
+  for (int b = 0; b < 32; b++)
+    if (a[b])
+      c = 0;
+  return c;
+}

Reply via email to