This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR80457
- From: Bill Schmidt <wschmidt at linux dot vnet dot ibm dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Cc: Richard Biener <richard dot guenther at gmail dot com>
- Date: Tue, 18 Apr 2017 17:38:48 -0500
- Subject: [PATCH] Fix PR80457
- Authentication-results: sourceware.org; auth=none
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 <wschmidt@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 <wschmidt@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. */