The following fixes an ICE with 188.ammp and AVX2.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.

Richard.

2015-06-23  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/66636
        * tree-vect-stmts.c (vectorizable_store): Properly compute the
        def type for further defs for strided stores.

        * gcc.dg/vect/pr66636.c: New testcase.

Index: gcc/tree-vect-stmts.c
===================================================================
*** gcc/tree-vect-stmts.c       (revision 224834)
--- gcc/tree-vect-stmts.c       (working copy)
*************** vectorizable_store (gimple stmt, gimple_
*** 5365,5371 ****
                  if (slp)
                    vec_oprnd = vec_oprnds[j];
                  else
!                   vec_oprnd = vect_get_vec_def_for_stmt_copy (dt, vec_oprnd);
                }
  
              for (i = 0; i < nstores; i++)
--- 5365,5375 ----
                  if (slp)
                    vec_oprnd = vec_oprnds[j];
                  else
!                   {
!                     vect_is_simple_use (vec_oprnd, NULL, loop_vinfo,
!                                         bb_vinfo, &def_stmt, &def, &dt);
!                     vec_oprnd = vect_get_vec_def_for_stmt_copy (dt, 
vec_oprnd);
!                   }
                }
  
              for (i = 0; i < nstores; i++)
Index: gcc/testsuite/gcc.dg/vect/pr66636.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/pr66636.c (revision 0)
--- gcc/testsuite/gcc.dg/vect/pr66636.c (working copy)
***************
*** 0 ****
--- 1,29 ----
+ /* { dg-additional-options "-mavx2" { target avx_runtime } } */
+ 
+ #include "tree-vect.h"
+ 
+ extern void abort (void);
+ 
+ struct X { double x; double y; };
+ 
+ void foo (struct X *x, double px, int s)
+ {
+   int i;
+   for (i = 0; i < 256; ++i)
+     {
+       x[i*s].x = px;
+       x[i*s].y = i + px;
+     }
+ }
+ 
+ int main()
+ {
+   struct X x[512];
+   int i;
+   check_vect ();
+   foo (x, 1., 2);
+   if (x[0].x != 1. || x[0].y != 1.
+       || x[510].x != 1. || x[510].y != 256.)
+     abort ();
+   return 0;
+ }

Reply via email to