This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix vect_init_vector regression (PR tree-optimization/91063)


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;
> +}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]