Fix GROUP_GAP for single-element interleaving
authorRichard Sandiford <richard.sandiford@arm.com>
Tue, 24 May 2016 10:13:35 +0000 (10:13 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 24 May 2016 10:13:35 +0000 (10:13 +0000)
vectorizable_load had a curious "force_peeling" variable, with no
comment explaining why we need it for single-element interleaving
but not for other cases.  I think it's simply because we weren't
initialising the GROUP_GAP correctly for single loads.

Tested on aarch64-linux-gnu and x86_64-linux-gnu.

gcc/
* tree-vect-data-refs.c (vect_analyze_group_access_1): Set
GROUP_GAP for single-element interleaving.
* tree-vect-stmts.c (vectorizable_load): Remove force_peeling
variable.

From-SVN: r236631

gcc/ChangeLog
gcc/tree-vect-data-refs.c
gcc/tree-vect-stmts.c

index d94460e9419d843af1932d2eac16491441a8d2b9..a61b6cd97d0a289349d34bf8388236f4d93551e7 100644 (file)
@@ -1,3 +1,10 @@
+2016-05-24  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * tree-vect-data-refs.c (vect_analyze_group_access_1): Set
+       GROUP_GAP for single-element interleaving.
+       * tree-vect-stmts.c (vectorizable_load): Remove force_peeling
+       variable.
+
 2016-05-24  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/70434
index 7652e216eb6ec7b800967c81c33dc243a844f8bf..36d302a056ca4af0124a6cff9ed0c9e0fc318283 100644 (file)
@@ -2233,6 +2233,7 @@ vect_analyze_group_access_1 (struct data_reference *dr)
        {
          GROUP_FIRST_ELEMENT (vinfo_for_stmt (stmt)) = stmt;
          GROUP_SIZE (vinfo_for_stmt (stmt)) = groupsize;
+         GROUP_GAP (stmt_info) = groupsize - 1;
          if (dump_enabled_p ())
            {
              dump_printf_loc (MSG_NOTE, vect_location,
index 3bcd0ce1946490105f1b7ea84e2d7da5b9843462..f66e18062087c9bc039470d0ad27c5fc8780af56 100644 (file)
@@ -6308,7 +6308,6 @@ vectorizable_load (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt,
          that leaves unused vector loads around punt - we at least create
         very sub-optimal code in that case (and blow up memory,
         see PR65518).  */
-      bool force_peeling = false;
       if (first_stmt == stmt
          && !GROUP_NEXT_ELEMENT (stmt_info))
        {
@@ -6322,7 +6321,7 @@ vectorizable_load (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt,
            }
 
          /* Single-element interleaving requires peeling for gaps.  */
-         force_peeling = true;
+         gcc_assert (GROUP_GAP (stmt_info));
        }
 
       /* If there is a gap in the end of the group or the group size cannot
@@ -6330,8 +6329,7 @@ vectorizable_load (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt,
         elements in the last iteration and thus need to peel that off.  */
       if (loop_vinfo
          && ! STMT_VINFO_STRIDED_P (stmt_info)
-         && (force_peeling
-             || GROUP_GAP (vinfo_for_stmt (first_stmt)) != 0
+         && (GROUP_GAP (vinfo_for_stmt (first_stmt)) != 0
              || (!slp && vf % GROUP_SIZE (vinfo_for_stmt (first_stmt)) != 0)))
        {
          if (dump_enabled_p ())