From f0657516067909d688dc2424a876c1c894cbc182 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Sun, 29 Dec 2019 09:28:34 +0000 Subject: [PATCH] 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 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 --- gcc/ChangeLog | 5 +++++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/vect/vect-strided-epilogue-1.c | 8 ++++++++ gcc/tree-vect-stmts.c | 4 ++-- 4 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/vect/vect-strided-epilogue-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fc7af98..1630efd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2019-12-29 Richard Sandiford + * tree-vect-stmts.c (vect_get_strided_load_store_ops): Copy + DR_STEP before gimplifying it. + +2019-12-29 Richard Sandiford + * tree-vect-stmts.c (vectorizable_condition): For extract-last reductions, check that the target supports the required comparison operation. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2e0f364..d3079d3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2019-12-29 Richard Sandiford + * gcc.dg/vect/vect-strided-epilogue-1.c: New test. + +2019-12-29 Richard Sandiford + * gcc.dg/vect/vect-cond-12.c: New test. 2019-12-27 Richard Sandiford diff --git a/gcc/testsuite/gcc.dg/vect/vect-strided-epilogue-1.c b/gcc/testsuite/gcc.dg/vect/vect-strided-epilogue-1.c new file mode 100644 index 0000000..e316706 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-strided-epilogue-1.c @@ -0,0 +1,8 @@ +/* { dg-do compile } */ + +void +f (int *x, short *y, int z) +{ + for (int i = 0; i < 0x82; ++i) + x[-i] += x[z * i]; +} diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index feb0b7e..d446808 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -2993,7 +2993,7 @@ vect_get_strided_load_store_ops (stmt_vec_info stmt_info, gimple_seq stmts; 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))); *dataref_bump = force_gimple_operand (bump, &stmts, true, NULL_TREE); if (stmts) @@ -3005,7 +3005,7 @@ vect_get_strided_load_store_ops (stmt_vec_info stmt_info, 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, DR_STEP (dr), + 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); -- 2.7.4