This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix vect_init_vector regression (PR tree-optimization/91063)
- From: Richard Biener <rguenther at suse dot de>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Thu, 4 Jul 2019 09:11:57 +0200 (CEST)
- Subject: Re: [PATCH] Fix vect_init_vector regression (PR tree-optimization/91063)
- References: <20190704045417.GD815@tucnak>
On Thu, 4 Jul 2019, Jakub Jelinek wrote:
> Hi!
>
> A recent change in vect_init_vector emits new statements into a gimple_seq
> stmts and then calls vect_init_vector_1 on each of those statements.
>
> This doesn't work well, because vect_init_vector_1 places the given
> statement into another sequence (body of some bb, on the edge, ...),
> and when the caller holds a gimple_stmt_iterator pointing to that statement
> across its insertion into another sequence the ->prev/->next bookkeeping may
> go wrong, such as on the testcase where stmt == stmt->prev == stmt->next
> because of that.
Whoops... probably worked as long as there was only a single
stmt in the sequence...
> Fixed by first removing the statement from the stmts sequence (thus
> gsi_remove already updates the iterator to the next statement).
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK.
Thanks,
Richard.
> 2019-07-04 Jakub Jelinek <jakub@redhat.com>
>
> PR tree-optimization/91063
> * tree-vect-stmts.c (vect_init_vector): Call gsi_remove to remove
> stmt from stmts sequence before calling vect_init_vector_1.
> Formatting fix.
>
> * gcc.dg/gomp/pr91063.c: New test.
>
> --- gcc/tree-vect-stmts.c.jj 2019-07-03 10:24:33.463768431 +0200
> +++ gcc/tree-vect-stmts.c 2019-07-03 12:35:48.998435660 +0200
> @@ -1496,15 +1496,19 @@ vect_init_vector (stmt_vec_info stmt_inf
> promotion of invariant/external defs. */
> val = gimple_convert (&stmts, TREE_TYPE (type), val);
> for (gimple_stmt_iterator gsi2 = gsi_start (stmts);
> - !gsi_end_p (gsi2); gsi_next (&gsi2))
> - vect_init_vector_1 (stmt_info, gsi_stmt (gsi2), gsi);
> + !gsi_end_p (gsi2); )
> + {
> + init_stmt = gsi_stmt (gsi2);
> + gsi_remove (&gsi2, false);
> + vect_init_vector_1 (stmt_info, init_stmt, gsi);
> + }
> }
> }
> val = build_vector_from_val (type, val);
> }
>
> new_temp = vect_get_new_ssa_name (type, vect_simple_var, "cst_");
> - init_stmt = gimple_build_assign (new_temp, val);
> + init_stmt = gimple_build_assign (new_temp, val);
> vect_init_vector_1 (stmt_info, init_stmt, gsi);
> return new_temp;
> }
> --- gcc/testsuite/gcc.dg/gomp/pr91063.c.jj 2019-07-03 12:50:55.123799217 +0200
> +++ gcc/testsuite/gcc.dg/gomp/pr91063.c 2019-07-03 12:50:43.320989864 +0200
> @@ -0,0 +1,17 @@
> +/* PR tree-optimization/91063 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fopenmp-simd" } */
> +/* { dg-additional-options "-mavx512f" { target { i?86-*-* x86_64-*-* } } } */
> +
> +struct S { void *s; };
> +
> +int
> +foo (struct S *x)
> +{
> + int r = 0;
> + int i;
> +#pragma omp simd reduction (+ : r)
> + for (i = 0; i < 64; ++i)
> + r += (int) (x->s != 0);
> + return r;
> +}