From 554f1948b9c4fdbf3920666dc5b2814fe821b627 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 8 Apr 2011 13:38:19 +0200 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/vect/pr48377.c | 25 +++++++++++++++++++++++++ gcc/tree-vect-data-refs.c | 5 ++++- 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/vect/pr48377.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 14bc365f801..d149898ba13 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2011-04-08 Jakub Jelinek + + 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 PR bootstrap/48513 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 436404b0136..ca8666ad80a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-04-08 Jakub Jelinek + + PR tree-optimization/48377 + * gcc.dg/vect/pr48377.c: New test. + 2011-04-07 Jason Merrill * 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 00000000000..e0cde43a777 --- /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 8f411140880..760bc41a30f 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 and Ira Rosen @@ -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)) -- 2.30.2