aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaipeng Zhou <zhoukaipeng3@huawei.com>2020-06-17 20:19:16 +0100
committerRichard Sandiford <richard.sandiford@arm.com>2020-06-17 20:19:16 +0100
commit4a31a8add56d49867c187d90b3a89e97634543c2 (patch)
tree798100e6fd1899ce1c505a151f32fb6f04d398c1
parent44492e248cbff60b12f5cbdaa32b265c5e8c9aff (diff)
downloadgcc-4a31a8add56d49867c187d90b3a89e97634543c2.zip
gcc-4a31a8add56d49867c187d90b3a89e97634543c2.tar.gz
gcc-4a31a8add56d49867c187d90b3a89e97634543c2.tar.bz2
vect: CSE for bump and offset in strided load/store operations.
Every time "vect_get_strided_load_store_ops" is called, new bump and offset variables and a series of stmts are created. And IVOPTs is not able to eliminate them. The patch use "cse_and_gimplify_to_preheader" to CSE them. 2020-06-17 Bin Cheng <bin.cheng@linux.alibaba.com> Kaipeng Zhou <zhoukaipeng3@huawei.com> PR tree-optimization/95199 * tree-vect-stmts.c: Eliminate common stmts for bump and offset in strided load/store operations and remove redundant code. 2020-06-17 Bin Cheng <bin.cheng@linux.alibaba.com> Kaipeng Zhou <zhoukaipeng3@huawei.com> PR tree-optimization/95199 * gcc.target/aarch64/sve/pr95199.c: New test.
-rw-r--r--gcc/testsuite/gcc.target/aarch64/sve/pr95199.c17
-rw-r--r--gcc/tree-vect-stmts.c17
2 files changed, 22 insertions, 12 deletions
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pr95199.c b/gcc/testsuite/gcc.target/aarch64/sve/pr95199.c
new file mode 100644
index 0000000..adcd512
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sve/pr95199.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -march=armv8.2-a+sve -fdump-tree-vect" } */
+
+void
+foo (double *a, double *b, double m, int inc_x, int inc_y)
+{
+ int ix = 0, iy = 0;
+ for (int i = 0; i < 1000; ++i)
+ {
+ a[ix] += m * b[iy];
+ ix += inc_x;
+ iy += inc_y;
+ }
+ return ;
+}
+
+/* { dg-final { scan-tree-dump-times "VEC_SERIES_EXPR" 2 "vect" } } */
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index 4a0a907..c917439 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -2846,33 +2846,26 @@ vect_get_strided_load_store_ops (stmt_vec_info stmt_info,
tree *dataref_bump, tree *vec_offset)
{
struct data_reference *dr = STMT_VINFO_DATA_REF (stmt_info);
- class loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
tree vectype = STMT_VINFO_VECTYPE (stmt_info);
- gimple_seq stmts;
tree bump = size_binop (MULT_EXPR,
fold_convert (sizetype, unshare_expr (DR_STEP (dr))),
size_int (TYPE_VECTOR_SUBPARTS (vectype)));
- *dataref_bump = force_gimple_operand (bump, &stmts, true, NULL_TREE);
- if (stmts)
- gsi_insert_seq_on_edge_immediate (loop_preheader_edge (loop), stmts);
+ *dataref_bump = cse_and_gimplify_to_preheader (loop_vinfo, bump);
/* The offset given in GS_INFO can have pointer type, so use the element
type of the vector instead. */
- tree offset_type = TREE_TYPE (gs_info->offset);
- offset_type = TREE_TYPE (gs_info->offset_vectype);
+ tree offset_type = TREE_TYPE (gs_info->offset_vectype);
/* Calculate X = DR_STEP / SCALE and convert it to the appropriate type. */
tree step = size_binop (EXACT_DIV_EXPR, unshare_expr (DR_STEP (dr)),
ssize_int (gs_info->scale));
step = fold_convert (offset_type, step);
- step = force_gimple_operand (step, &stmts, true, NULL_TREE);
/* Create {0, X, X*2, X*3, ...}. */
- *vec_offset = gimple_build (&stmts, VEC_SERIES_EXPR, gs_info->offset_vectype,
- build_zero_cst (offset_type), step);
- if (stmts)
- gsi_insert_seq_on_edge_immediate (loop_preheader_edge (loop), stmts);
+ tree offset = fold_build2 (VEC_SERIES_EXPR, gs_info->offset_vectype,
+ build_zero_cst (offset_type), step);
+ *vec_offset = cse_and_gimplify_to_preheader (loop_vinfo, offset);
}
/* Return the amount that should be added to a vector pointer to move