diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 525a8f013d819f7847f37dd68596d5a8374ac8c5..e30f6bbef78be620e13113c655d384cfa1a769e4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-12-27 Richard Sandiford <richard.sandiford@arm.com> + + * tree-vect-loop.c (vectorizable_reduction): Check whether the + target supports the required VEC_COND_EXPR operation before + allowing the fallback handling of masked fold-left reductions. + 2019-12-24 Jiufu Guo <guojiufu@linux.ibm.com> * config/rs6000/rs6000.c (rs6000_option_override_internal): Enable diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0db2e22e369efeb8347db5791e73a804036b545e..d47dd3bdc8dbf93b3189d45b9c3afc5835b2058e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2019-12-27 Richard Sandiford <richard.sandiford@arm.com> + + * gcc.target/aarch64/sve/mixed_size_10.c: New test. + 2019-12-26 Jakub Jelinek <jakub@redhat.com> PR c++/92438 diff --git a/gcc/testsuite/gcc.target/aarch64/sve/mixed_size_10.c b/gcc/testsuite/gcc.target/aarch64/sve/mixed_size_10.c new file mode 100644 index 0000000000000000000000000000000000000000..bf22428549f125c1c3c869ecd132da36ff9efb07 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/mixed_size_10.c @@ -0,0 +1,13 @@ +/* { dg-options "-O3 -msve-vector-bits=256 -fno-tree-loop-distribution" } */ + +float +f (float *restrict x, double *restrict y) +{ + float res = 0.0; + for (int i = 0; i < 100; ++i) + { + res += x[i]; + y[i] += y[i - 4] * 11; + } + return res; +} diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 68699f2d814c3c12685a7b52d1c8882078a79dbd..9b0cbccb721873bebf153361e90640056f398361 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -6718,6 +6718,18 @@ vectorizable_reduction (stmt_vec_info stmt_info, slp_tree slp_node, " conditional operation is available.\n"); LOOP_VINFO_CAN_FULLY_MASK_P (loop_vinfo) = false; } + else if (reduction_type == FOLD_LEFT_REDUCTION + && reduc_fn == IFN_LAST + && !expand_vec_cond_expr_p (vectype_in, + truth_type_for (vectype_in), + SSA_NAME)) + { + if (dump_enabled_p ()) + dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, + "can't use a fully-masked loop because no" + " conditional operation is available.\n"); + LOOP_VINFO_CAN_FULLY_MASK_P (loop_vinfo) = false; + } else vect_record_loop_mask (loop_vinfo, masks, ncopies * vec_num, vectype_in, NULL);