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; +}