Jakub Jelinek <ja...@redhat.com> wrote:

>Hi!
>
>On the gomp4 branch I've noticed a miscompilation of the simd-3.C
>testcase I'm adding there, but even say
>int a[1024] __attribute__((aligned (32))) = { 1 };
>int b[1024] __attribute__((aligned (32))) = { 1 };
>unsigned short c[1024] __attribute__((aligned (32))) = { 1 };
>
>__attribute__((noinline, noclone)) void
>foo (int *p)
>{
>  int i;
>  p = (int *) __builtin_assume_aligned (p, 32);
>  for (i = 0; i < 512; i++)
>    {
>      a[i] *= p[i];
>      c[i]++;
>    }
>}
>
>int
>main ()
>{
>  int i;
>  for (i = 0; i < 512; i++)
>    {
>      a[i] = i - 512;
>      b[i] = (i - 51) % 39;
>      c[i] = (unsigned short) i;
>    }
>  foo (b);
>  for (i = 0; i < 512; i++)
>    if (b[i] != (i - 51) % 39
>       || a[i] != (i - 512) * b[i]
>       || c[i] != (unsigned short) (i + 1))
>      __builtin_abort ();
>  return 0;
>}
>without -fopenmp, just -O3 -mavx.  The relevant change was just
>that ptr_incr has been initialized to NULL in both vectorizable_store
>and vectorizable_load, because vect_create_data_ref_ptr doesn't
>initialize
>it if only_init is true.  Looking at it, we just trigger undefined
>behavior
>and are just lucky that it works by accident on the trunk and branches.
>The problem is that if ncopies > 1, vectorizable_store declares the
>variable
>inside of the loop, for j == 0 it initializes it through
>vect_create_data_ref_ptr, but then on the next iteration the variable
>is
>uninitialized again (but just due to luck contains the value from the
>previous iteration, but say if compiler unrolled the loop, it would
>already
>misbehave) and then it is passed to bump_vector_ptr.  Fixed by moving
>the
>var decl outside of the loop.  While not strictly necessary, I find it
>cleaner to initialize it to NULL, though if you disagree with it, I can
>keep
>that change local to gomp4 branch for now (i.e. remove " = NULL" from
>the
>first hunk and the third hunk).
>
>Ok for trunk/4.8?
>
Ok

Thanks,
Richard.
>2013-06-26  Jakub Jelinek  <ja...@redhat.com>
>
>       * tree-vect-stmts.c (vectorizable_store): Move ptr_incr var
>       decl before the loop, initialize to NULL.
>       (vectorizable_load): Initialize ptr_incr to NULL.
>
>--- gcc/tree-vect-stmts.c.jj   2013-04-22 08:06:41.000000000 +0200
>+++ gcc/tree-vect-stmts.c      2013-06-26 21:34:28.609654773 +0200
>@@ -3796,6 +3796,7 @@ vectorizable_store (gimple stmt, gimple_
>   enum vect_def_type dt;
>   stmt_vec_info prev_stmt_info = NULL;
>   tree dataref_ptr = NULL_TREE;
>+  gimple ptr_incr = NULL;
>   int nunits = TYPE_VECTOR_SUBPARTS (vectype);
>   int ncopies;
>   int j;
>@@ -4041,7 +4042,6 @@ vectorizable_store (gimple stmt, gimple_
>   for (j = 0; j < ncopies; j++)
>     {
>       gimple new_stmt;
>-      gimple ptr_incr;
> 
>       if (j == 0)
>       {
>@@ -4314,7 +4314,7 @@ vectorizable_load (gimple stmt, gimple_s
>   tree dummy;
>   enum dr_alignment_support alignment_support_scheme;
>   tree dataref_ptr = NULL_TREE;
>-  gimple ptr_incr;
>+  gimple ptr_incr = NULL;
>   int nunits = TYPE_VECTOR_SUBPARTS (vectype);
>   int ncopies;
>   int i, j, group_size, group_gap;
>
>
>       Jakub


Reply via email to