tree-vect-stmts.c (get_group_load_store_type): If the access is aligned do not trigge...
authorRichard Biener <rguenther@suse.de>
Tue, 8 Nov 2016 10:23:57 +0000 (10:23 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 8 Nov 2016 10:23:57 +0000 (10:23 +0000)
2016-11-08  Richard Biener  <rguenther@suse.de>

* tree-vect-stmts.c (get_group_load_store_type): If the
access is aligned do not trigger peeling for gaps.
* tree-vect-data-refs.c (vect_compute_data_ref_alignment): Do not
force alignment of vars with DECL_USER_ALIGN.

* gcc.dg/vect/vect-nb-iter-ub-2.c: Adjust.

From-SVN: r241959

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/vect-nb-iter-ub-2.c
gcc/tree-vect-data-refs.c
gcc/tree-vect-stmts.c

index 4f5c464cec4b3bf1a781c64f08a9170c43b3381b..694c8e4cfa4093a4cfd6c141fa90715504c73104 100644 (file)
@@ -1,3 +1,10 @@
+2016-11-08  Richard Biener  <rguenther@suse.de>
+
+       * tree-vect-stmts.c (get_group_load_store_type): If the
+       access is aligned do not trigger peeling for gaps.
+       * tree-vect-data-refs.c (vect_compute_data_ref_alignment): Do not
+       force alignment of vars with DECL_USER_ALIGN.
+
 2016-11-08  James Greenhalgh  <james.greenhalgh@arm.com>
 
        * config/aarch64/t-aarch64 (aarch64-c.o): Depend on TARGET_H.
index 060b1a7d29103de5c3a461b58c20d8d1d784f61e..36b0d33776fad3d28df700e045cc861096c798ee 100644 (file)
@@ -1,3 +1,7 @@
+2016-11-08  Richard Biener  <rguenther@suse.de>
+
+       * gcc.dg/vect/vect-nb-iter-ub-2.c: Adjust.
+
 2016-11-08  Tamar Christina  <tamar.christina@arm.com>
 
        PR testsuite/78136
index bc07b4bea0fce82b068a363ff0644c6a73de5b81..4e13702621f08d6f2be82e8012284737243528a8 100644 (file)
@@ -3,7 +3,7 @@
 #include "tree-vect.h"
 
 int ii[32];
-char cc[66] =
+char cc[66] __attribute__((aligned(1))) =
   { 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 0,
     10, 0, 11, 0, 12, 0, 13, 0, 14, 0, 15, 0, 16, 0, 17, 0, 18, 0, 19, 0,
     20, 0, 21, 0, 22, 0, 23, 0, 24, 0, 25, 0, 26, 0, 27, 0, 28, 0, 29, 0,
index b03cb1ec637c427f215cd6408707d7e46b6e0764..f014d688036cee3d6e0d6ef5eb32c64e7a6b70e6 100644 (file)
@@ -831,6 +831,19 @@ vect_compute_data_ref_alignment (struct data_reference *dr)
          return true;
        }
 
+      if (DECL_USER_ALIGN (base))
+       {
+         if (dump_enabled_p ())
+           {
+             dump_printf_loc (MSG_NOTE, vect_location,
+                              "not forcing alignment of user-aligned "
+                              "variable: ");
+             dump_generic_expr (MSG_NOTE, TDF_SLIM, base);
+             dump_printf (MSG_NOTE, "\n");
+           }
+         return true;
+       }
+
       /* Force the alignment of the decl.
         NOTE: This is the only change to the code we make during
         the analysis phase, before deciding to vectorize the loop.  */
index 15aec2197b33618f652c8c60a62cf48aa657ec2f..c29e73df9462d2674bc1c37ed034b583f3bb5209 100644 (file)
@@ -1770,6 +1770,11 @@ get_group_load_store_type (gimple *stmt, tree vectype, bool slp,
                               " non-consecutive accesses\n");
              return false;
            }
+         /* If the access is aligned an overrun is fine.  */
+         if (overrun_p
+             && aligned_access_p
+                  (STMT_VINFO_DATA_REF (vinfo_for_stmt (first_stmt))))
+           overrun_p = false;
          if (overrun_p && !can_overrun_p)
            {
              if (dump_enabled_p ())
@@ -1789,6 +1794,10 @@ get_group_load_store_type (gimple *stmt, tree vectype, bool slp,
       /* If there is a gap at the end of the group then these optimizations
         would access excess elements in the last iteration.  */
       bool would_overrun_p = (gap != 0);
+      /* If the access is aligned an overrun is fine.  */
+      if (would_overrun_p
+         && aligned_access_p (STMT_VINFO_DATA_REF (stmt_info)))
+       would_overrun_p = false;
       if (!STMT_VINFO_STRIDED_P (stmt_info)
          && (can_overrun_p || !would_overrun_p)
          && compare_step_with_zero (stmt) > 0)