On December 28, 2019 5:29:20 PM GMT+01:00, Richard Sandiford <richard.sandif...@arm.com> wrote: >The EXTRACT_LAST_REDUCTION handling needs to generate a separate >comparison instruction that feeds the vector mask argument of the >IFN_EXTRACT_LAST call. We weren't checking whether that comparison >was supported, leading to an ICE on the testcase. > >Tested on aarch64-linux-gnu and x86_64-linux-gnu. OK to install?
Ok. Richard. >Richard > > >2019-12-28 Richard Sandiford <richard.sandif...@arm.com> > >gcc/ > * tree-vect-stmts.c (vectorizable_condition): For extract-last > reductions, check that the target supports the required comparison > operation. > >gcc/testsuite/ > * gcc.dg/vect/vect-cond-12.c: New test. > >Index: gcc/tree-vect-stmts.c >=================================================================== >--- gcc/tree-vect-stmts.c 2019-12-27 16:53:46.000000000 +0000 >+++ gcc/tree-vect-stmts.c 2019-12-28 16:28:16.344143831 +0000 >@@ -10081,6 +10081,16 @@ vectorizable_condition (stmt_vec_info st > cond_code = SSA_NAME; > } > >+ if (TREE_CODE_CLASS (cond_code) == tcc_comparison >+ && reduction_type == EXTRACT_LAST_REDUCTION >+ && !expand_vec_cmp_expr_p (comp_vectype, vec_cmp_type, >cond_code)) >+ { >+ if (dump_enabled_p ()) >+ dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, >+ "reduction comparison operation not supported.\n"); >+ return false; >+ } >+ > if (!vec_stmt) > { > if (bitop1 != NOP_EXPR) >Index: gcc/testsuite/gcc.dg/vect/vect-cond-12.c >=================================================================== >--- /dev/null 2019-09-17 11:41:18.176664108 +0100 >+++ gcc/testsuite/gcc.dg/vect/vect-cond-12.c 2019-12-28 >16:28:16.344143831 +0000 >@@ -0,0 +1,14 @@ >+/* { dg-do compile } */ >+ >+int >+f (int *x, short *y) >+{ >+ int res = 100; >+ for (int i = 0; i < 40; ++i) >+ { >+ if (y[i] > 1) >+ res = x[i]; >+ x[i] += y[i]; >+ } >+ return res; >+}