re PR tree-optimization/63530 (GCC generates incorrect aligned store on ARM after...
authorGuozhi Wei <carrot@google.com>
Wed, 22 Oct 2014 15:56:59 +0000 (15:56 +0000)
committerWei Guozhi <carrot@gcc.gnu.org>
Wed, 22 Oct 2014 15:56:59 +0000 (15:56 +0000)
PR tree-optimization/63530
tree-vect-data-refs.c (vect_create_addr_base_for_vector_ref): Set
pointer alignment according to DR_MISALIGNMENT.
gcc.dg/vect/pr63530.c: New testcase.

From-SVN: r216562

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/pr63530.c [new file with mode: 0644]
gcc/tree-vect-data-refs.c

index 1a460237294a10797d280180eed8d0cb4a5b521c..3687418c5b04bcb9b8fa2d2d6138156436e4a022 100644 (file)
@@ -1,3 +1,9 @@
+2014-10-22  Guozhi Wei  <carrot@google.com>
+
+       PR tree-optimization/63530
+       tree-vect-data-refs.c (vect_create_addr_base_for_vector_ref): Set
+       pointer alignment according to DR_MISALIGNMENT.
+
 2014-10-22  David Malcolm  <dmalcolm@redhat.com>
 
        * ipa-icf.c (ipa_icf_driver): Set optimizer to NULL when done.
index 964037a1e966736a94275e7c04467786ef6e8fd7..5762e8fa608c19432c29f8679f14a1731db19b1d 100644 (file)
@@ -1,3 +1,8 @@
+2014-10-22  Guozhi Wei  <carrot@google.com>
+
+       PR tree-optimization/63530
+       gcc.dg/vect/pr63530.c: New testcase.
+
 2014-10-22  Richard Sandiford  <richard.sandiford@arm.com>
 
        * gcc.target/i386/conversion-2.c: New test.
diff --git a/gcc/testsuite/gcc.dg/vect/pr63530.c b/gcc/testsuite/gcc.dg/vect/pr63530.c
new file mode 100644 (file)
index 0000000..b583b9b
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-options "-O2 -ftree-vectorize -funroll-loops --param \"max-completely-peeled-insns=400\"" } */
+
+/* PR tree-optimization/63530 */
+/* On armv7 hardware, following options cause run time failure  */
+/*   -march=armv7-a -mfloat-abi=hard -mfpu=neon -marm -O2 -ftree-vectorize  */
+/*   -funroll-loops --param "max-completely-peeled-insns=400"  */
+
+#include <stdlib.h>
+
+typedef struct {
+  unsigned char map[256];
+  int i;
+} A, *AP;
+
+AP __attribute__ ((noinline))
+foo (int n)
+{
+  AP b = (AP)calloc (1, sizeof (A));
+  int i;
+  for (i = n; i < 256; i++)
+    b->map[i] = i;
+  return b;
+}
+
+int
+main()
+{
+  AP p = foo(3);
+  return p->map[30] - p->map[20] - p->map[10];
+}
index 0807b95099d57a885137f58716825d6f021b7b6e..66ba70a58559932c63adf36b04bce9ca12ed0623 100644 (file)
@@ -3960,8 +3960,12 @@ vect_create_addr_base_for_vector_ref (gimple stmt,
       && TREE_CODE (addr_base) == SSA_NAME)
     {
       duplicate_ssa_name_ptr_info (addr_base, DR_PTR_INFO (dr));
-      if (offset)
+      unsigned int align = TYPE_ALIGN_UNIT (STMT_VINFO_VECTYPE (stmt_info));
+      int misalign = DR_MISALIGNMENT (dr);
+      if (offset || byte_offset || (misalign == -1))
        mark_ptr_info_alignment_unknown (SSA_NAME_PTR_INFO (addr_base));
+      else
+       set_ptr_info_alignment (SSA_NAME_PTR_INFO (addr_base), align, misalign);
     }
 
   if (dump_enabled_p ())