Commit f0657516 by Richard Sandiford Committed by Richard Sandiford

Unshare DR_STEP before gimplifying it

In this testcase we use an unmasked SVE loop with an Advanced SIMD
epilogue (because we don't yet support fully-masked downward loops).
The main loop uses a gather load for the strided access while the
epilogue loop builds the access from scalars instead.  In both cases
we gimplify expressions based on the DR_STEP and insert them in the
loop preheader.

The problem was that the gather load code didn't copy the DR_STEP before
gimplifying it, meaning that the epilogue loop tried to reuse a result
from the (non-dominating) main loop preheader.

It looks at first glance like there could be other instances of this too,
but this patch just deals with the gather/scatter case.

2019-12-29  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* tree-vect-stmts.c (vect_get_strided_load_store_ops): Copy
	DR_STEP before gimplifying it.

gcc/testsuite/
	* gcc.dg/vect/vect-strided-epilogue-1.c: New test.

From-SVN: r279753
parent 4bbd661e
2019-12-29 Richard Sandiford <richard.sandiford@arm.com> 2019-12-29 Richard Sandiford <richard.sandiford@arm.com>
* tree-vect-stmts.c (vect_get_strided_load_store_ops): Copy
DR_STEP before gimplifying it.
2019-12-29 Richard Sandiford <richard.sandiford@arm.com>
* tree-vect-stmts.c (vectorizable_condition): For extract-last * tree-vect-stmts.c (vectorizable_condition): For extract-last
reductions, check that the target supports the required comparison reductions, check that the target supports the required comparison
operation. operation.
2019-12-29 Richard Sandiford <richard.sandiford@arm.com> 2019-12-29 Richard Sandiford <richard.sandiford@arm.com>
* gcc.dg/vect/vect-strided-epilogue-1.c: New test.
2019-12-29 Richard Sandiford <richard.sandiford@arm.com>
* gcc.dg/vect/vect-cond-12.c: New test. * gcc.dg/vect/vect-cond-12.c: New test.
2019-12-27 Richard Sandiford <richard.sandiford@arm.com> 2019-12-27 Richard Sandiford <richard.sandiford@arm.com>
......
/* { dg-do compile } */
void
f (int *x, short *y, int z)
{
for (int i = 0; i < 0x82; ++i)
x[-i] += x[z * i];
}
...@@ -2993,7 +2993,7 @@ vect_get_strided_load_store_ops (stmt_vec_info stmt_info, ...@@ -2993,7 +2993,7 @@ vect_get_strided_load_store_ops (stmt_vec_info stmt_info,
gimple_seq stmts; gimple_seq stmts;
tree bump = size_binop (MULT_EXPR, tree bump = size_binop (MULT_EXPR,
fold_convert (sizetype, DR_STEP (dr)), fold_convert (sizetype, unshare_expr (DR_STEP (dr))),
size_int (TYPE_VECTOR_SUBPARTS (vectype))); size_int (TYPE_VECTOR_SUBPARTS (vectype)));
*dataref_bump = force_gimple_operand (bump, &stmts, true, NULL_TREE); *dataref_bump = force_gimple_operand (bump, &stmts, true, NULL_TREE);
if (stmts) if (stmts)
...@@ -3005,7 +3005,7 @@ vect_get_strided_load_store_ops (stmt_vec_info stmt_info, ...@@ -3005,7 +3005,7 @@ vect_get_strided_load_store_ops (stmt_vec_info stmt_info,
offset_type = TREE_TYPE (gs_info->offset_vectype); offset_type = TREE_TYPE (gs_info->offset_vectype);
/* Calculate X = DR_STEP / SCALE and convert it to the appropriate type. */ /* Calculate X = DR_STEP / SCALE and convert it to the appropriate type. */
tree step = size_binop (EXACT_DIV_EXPR, DR_STEP (dr), tree step = size_binop (EXACT_DIV_EXPR, unshare_expr (DR_STEP (dr)),
ssize_int (gs_info->scale)); ssize_int (gs_info->scale));
step = fold_convert (offset_type, step); step = fold_convert (offset_type, step);
step = force_gimple_operand (step, &stmts, true, NULL_TREE); step = force_gimple_operand (step, &stmts, true, NULL_TREE);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment