Hi, While investigating a performance issue, I happened to notice that vectorized COND_EXPRs were not contributing to the vectorizer cost model. This patch addresses that.
Bootstrapped and tested on powerpc64le-unknown-linux-gnu. Is this ok for trunk, or should it wait for GCC 8? Thanks, Bill [gcc] 2017-04-18 Bill Schmidt <wschm...@linux.vnet.ibm.com> PR tree-optimization/80457 * tree-vect-stmts.c (vectorizable_condition): Update the cost model when vectorizing a COND_EXPR. [gcc/testsuite] 2017-04-18 Bill Schmidt <wschm...@linux.vnet.ibm.com> PR tree-optimization/80457 * gcc.target/powerpc/pr78604.c: Verify that vectorized COND_EXPRs call vect_model_simple_cost. Index: gcc/testsuite/gcc.target/powerpc/pr78604.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/pr78604.c (revision 246948) +++ gcc/testsuite/gcc.target/powerpc/pr78604.c (working copy) @@ -2,7 +2,7 @@ /* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */ /* { dg-require-effective-target powerpc_p8vector_ok } */ /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */ -/* { dg-options "-mcpu=power8 -O2 -ftree-vectorize" } */ +/* { dg-options "-mcpu=power8 -O2 -ftree-vectorize -fdump-tree-vect-details" } */ #ifndef SIZE #define SIZE 1024 @@ -110,3 +110,4 @@ uns_gte (UNS_TYPE val1, UNS_TYPE val2) /* { dg-final { scan-assembler-times {\mvcmpgtsd\M} 4 } } */ /* { dg-final { scan-assembler-times {\mvcmpgtud\M} 4 } } */ /* { dg-final { scan-assembler-not {\mvcmpequd\M} } } */ +/* { dg-final { scan-tree-dump-times "vect_model_simple_cost" 8 "vect" } } */ Index: gcc/tree-vect-stmts.c =================================================================== --- gcc/tree-vect-stmts.c (revision 246948) +++ gcc/tree-vect-stmts.c (working copy) @@ -7746,7 +7746,7 @@ vectorizable_condition (gimple *stmt, gimple_stmt_ tree vec_compare; tree new_temp; loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_info); - enum vect_def_type dt, dts[4]; + enum vect_def_type dt[2], dts[4]; int ncopies; enum tree_code code, cond_code, bitop1 = NOP_EXPR, bitop2 = NOP_EXPR; stmt_vec_info prev_stmt_info = NULL; @@ -7813,10 +7813,10 @@ vectorizable_condition (gimple *stmt, gimple_stmt_ return false; gimple *def_stmt; - if (!vect_is_simple_use (then_clause, stmt_info->vinfo, &def_stmt, &dt, + if (!vect_is_simple_use (then_clause, stmt_info->vinfo, &def_stmt, &dt[0], &vectype1)) return false; - if (!vect_is_simple_use (else_clause, stmt_info->vinfo, &def_stmt, &dt, + if (!vect_is_simple_use (else_clause, stmt_info->vinfo, &def_stmt, &dt[1], &vectype2)) return false; @@ -7900,8 +7900,12 @@ vectorizable_condition (gimple *stmt, gimple_stmt_ return false; } } - return expand_vec_cond_expr_p (vectype, comp_vectype, - cond_code); + if (expand_vec_cond_expr_p (vectype, comp_vectype, cond_code)) + { + vect_model_simple_cost (stmt_info, ncopies, dt, NULL, NULL); + return true; + } + return false; } /* Transform. */