aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2011-04-08 13:38:19 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2011-04-08 13:38:19 +0200
commit554f1948b9c4fdbf3920666dc5b2814fe821b627 (patch)
treebf2fe054bea423fc3d65be0e7b74f00fc932add1
parentddf723888e5a2cd7714832efb90ada82713a66e0 (diff)
downloadgcc-554f1948b9c4fdbf3920666dc5b2814fe821b627.zip
gcc-554f1948b9c4fdbf3920666dc5b2814fe821b627.tar.gz
gcc-554f1948b9c4fdbf3920666dc5b2814fe821b627.tar.bz2
re PR tree-optimization/48377 (miscompilation at -O3)
PR tree-optimization/48377 * tree-vect-data-refs.c (vector_alignment_reachable_p): Set is_packed to true even for types with smaller TYPE_ALIGN than TYPE_SIZE. * gcc.dg/vect/pr48377.c: New test. From-SVN: r172172
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr48377.c25
-rw-r--r--gcc/tree-vect-data-refs.c5
4 files changed, 41 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 14bc365..d149898 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2011-04-08 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/48377
+ * tree-vect-data-refs.c (vector_alignment_reachable_p): Set
+ is_packed to true even for types with smaller TYPE_ALIGN than
+ TYPE_SIZE.
+
2011-04-08 Richard Guenther <rguenther@suse.de>
PR bootstrap/48513
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 436404b..ca8666a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-04-08 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/48377
+ * gcc.dg/vect/pr48377.c: New test.
+
2011-04-07 Jason Merrill <jason@redhat.com>
* g++.dg/cpp0x/regress/call1.C: New.
diff --git a/gcc/testsuite/gcc.dg/vect/pr48377.c b/gcc/testsuite/gcc.dg/vect/pr48377.c
new file mode 100644
index 0000000..e0cde43
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr48377.c
@@ -0,0 +1,25 @@
+/* PR tree-optimization/48377 */
+/* { dg-do run } */
+
+typedef unsigned int U __attribute__((__aligned__ (1), __may_alias__));
+
+__attribute__((noinline, noclone)) unsigned int
+foo (const char *s, int len)
+{
+ const U *p = (const U *) s;
+ unsigned int f = len / sizeof (unsigned int), hash = len, i;
+
+ for (i = 0; i < f; ++i)
+ hash += *p++;
+ return hash;
+}
+
+char buf[64] __attribute__((aligned (32)));
+
+int
+main (void)
+{
+ return foo (buf + 1, 26) != 26;
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c
index 8f41114..760bc41 100644
--- a/gcc/tree-vect-data-refs.c
+++ b/gcc/tree-vect-data-refs.c
@@ -1,5 +1,5 @@
/* Data References Analysis and Manipulation Utilities for Vectorization.
- Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+ Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
Free Software Foundation, Inc.
Contributed by Dorit Naishlos <dorit@il.ibm.com>
and Ira Rosen <irar@il.ibm.com>
@@ -1110,6 +1110,9 @@ vector_alignment_reachable_p (struct data_reference *dr)
if (ba)
is_packed = contains_packed_reference (ba);
+ if (compare_tree_int (TYPE_SIZE (type), TYPE_ALIGN (type)) > 0)
+ is_packed = true;
+
if (vect_print_dump_info (REPORT_DETAILS))
fprintf (vect_dump, "Unknown misalignment, is_packed = %d",is_packed);
if (targetm.vectorize.vector_alignment_reachable (type, is_packed))