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 <ja...@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; > +}