There is no longer a good reason to restrict the memory references
we perform strided loads on during vectorization.  In particular
a bug(?) in the current restriction makes it not apply for
array loads from decls (as opposed to array loads from pointers
which happens for fortran or VLA pointer loads only...).

Bootstrap and regtest running on x86_64-linux-gnu.

Richard.

2013-04-04  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/56213
        * tree-vect-data-refs.c (vect_check_strided_load): Remove.
        (vect_analyze_data_refs): Allow all non-nested loads as
        strided loads.

        * gcc.dg/vect/vect-123.c: New testcase.

Index: gcc/tree-vect-data-refs.c
===================================================================
*** gcc/tree-vect-data-refs.c   (revision 197475)
--- gcc/tree-vect-data-refs.c   (working copy)
*************** vect_check_gather (gimple stmt, loop_vec
*** 2816,2871 ****
    return decl;
  }
  
- /* Check wether a non-affine load in STMT (being in the loop referred to
-    in LOOP_VINFO) is suitable for handling as strided load.  That is the case
-    if its address is a simple induction variable.  If so return the base
-    of that induction variable in *BASEP and the (loop-invariant) step
-    in *STEPP, both only when that pointer is non-zero.
- 
-    This handles ARRAY_REFs (with variant index) and MEM_REFs (with variant
-    base pointer) only.  */
- 
- static bool
- vect_check_strided_load (gimple stmt, loop_vec_info loop_vinfo)
- {
-   struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
-   stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
-   struct data_reference *dr = STMT_VINFO_DATA_REF (stmt_info);
-   tree base, off;
-   affine_iv iv;
- 
-   if (!DR_IS_READ (dr))
-     return false;
- 
-   base = DR_REF (dr);
- 
-   if (TREE_CODE (base) == REALPART_EXPR
-       || TREE_CODE (base) == IMAGPART_EXPR)
-     base = TREE_OPERAND (base, 0);
- 
-   if (TREE_CODE (base) == ARRAY_REF)
-     {
-       off = TREE_OPERAND (base, 1);
-       base = TREE_OPERAND (base, 0);
-     }
-   else if (TREE_CODE (base) == MEM_REF)
-     {
-       off = TREE_OPERAND (base, 0);
-       base = TREE_OPERAND (base, 1);
-     }
-   else
-     return false;
- 
-   if (TREE_CODE (off) != SSA_NAME)
-     return false;
- 
-   if (!expr_invariant_in_loop_p (loop, base)
-       || !simple_iv (loop, loop_containing_stmt (stmt), off, &iv, true))
-     return false;
- 
-   return true;
- }
- 
  /* Function vect_analyze_data_refs.
  
    Find all the data references in the loop or basic block.
--- 2816,2821 ----
*************** vect_analyze_data_refs (loop_vec_info lo
*** 3291,3300 ****
        else if (loop_vinfo
               && TREE_CODE (DR_STEP (dr)) != INTEGER_CST)
        {
!         bool strided_load = false;
!         if (!nested_in_vect_loop_p (loop, stmt))
!           strided_load = vect_check_strided_load (stmt, loop_vinfo);
!         if (!strided_load)
            {
              if (dump_enabled_p ())
                {
--- 3247,3254 ----
        else if (loop_vinfo
               && TREE_CODE (DR_STEP (dr)) != INTEGER_CST)
        {
!         if (nested_in_vect_loop_p (loop, stmt)
!             || !DR_IS_READ (dr))
            {
              if (dump_enabled_p ())
                {
Index: gcc/testsuite/gcc.dg/vect/vect-123.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/vect-123.c        (revision 0)
--- gcc/testsuite/gcc.dg/vect/vect-123.c        (working copy)
***************
*** 0 ****
--- 1,15 ----
+ /* { dg-do compile } */
+ /* { dg-require-effective-target vect_int } */
+ 
+ int x[4092];
+ int y[1024];
+ 
+ void foo (int s)
+ {
+   int i, j;
+   for (i = 0, j = 0; j < 1023; i += s, j++)
+     y[j] += x[i];
+ }
+ 
+ /* { dg-final { scan-tree-dump "vectorized 1 loops" "vect" } } */
+ /* { dg-final { cleanup-tree-dump "vect" } } */

Reply via email to