From: ebotcazou Date: Fri, 30 Apr 2010 21:10:53 +0000 (+0000) Subject: * tree-ssa-loop-ivopts.c (may_be_unaligned_p): Check the alignment of X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=9f5d6ac9c56ca8c00340a41b8fcdae7d8b670a8f * tree-ssa-loop-ivopts.c (may_be_unaligned_p): Check the alignment of the variable part of the offset as well. Use highest_pow2_factor for all alignment checks. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158948 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4d7ece95cfa..9829562456b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-04-30 Eric Botcazou + + * tree-ssa-loop-ivopts.c (may_be_unaligned_p): Check the alignment of + the variable part of the offset as well. Use highest_pow2_factor for + all alignment checks. + 2010-04-30 Richard Guenther PR tree-optimization/43879 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5a026378c11..0fa5ee74e04 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2010-04-30 DJ Delorie + + * gcc.c-torture/execute/20100430-1.c: New test. + 2010-04-30 Jason Merrill PR c++/43868 diff --git a/gcc/testsuite/gcc.c-torture/execute/20100430-1.c b/gcc/testsuite/gcc.c-torture/execute/20100430-1.c new file mode 100644 index 00000000000..d29c6fa1a37 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20100430-1.c @@ -0,0 +1,51 @@ +/* This used to generate unaligned accesses at -O2 because of IVOPTS. */ + +struct packed_struct +{ + struct packed_struct1 + { + unsigned char cc11; + unsigned char cc12; + } __attribute__ ((packed)) pst1; + struct packed_struct2 + { + unsigned char cc21; + unsigned char cc22; + unsigned short ss[104]; + unsigned char cc23[13]; + } __attribute__ ((packed)) pst2[4]; +} __attribute__ ((packed)); + +typedef struct +{ + int ii; + struct packed_struct buf; +} info_t; + +static unsigned short g; + +static void __attribute__((noinline)) +dummy (unsigned short s) +{ + g = s; +} + +static int +foo (info_t *info) +{ + int i, j; + + for (i = 0; i < info->buf.pst1.cc11; i++) + for (j = 0; j < info->buf.pst2[i].cc22; j++) + dummy (info->buf.pst2[i].ss[j]); + + return 0; +} + +int main(void) +{ + info_t info; + info.buf.pst1.cc11 = 2; + info.buf.pst2[0].cc22 = info.buf.pst2[1].cc22 = 8; + return foo (&info); +} diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index a1fdfa46254..8662f4ce30d 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -1536,16 +1536,18 @@ may_be_unaligned_p (tree ref, tree step) if (mode != BLKmode) { - double_int mul; - tree al = build_int_cst (TREE_TYPE (step), - GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT); + unsigned mode_align = GET_MODE_ALIGNMENT (mode); - if (base_align < GET_MODE_ALIGNMENT (mode) - || bitpos % GET_MODE_ALIGNMENT (mode) != 0 - || bitpos % BITS_PER_UNIT != 0) + if (base_align < mode_align + || (bitpos % mode_align) != 0 + || (bitpos % BITS_PER_UNIT) != 0) return true; - if (!constant_multiple_of (step, al, &mul)) + if (toffset + && (highest_pow2_factor (toffset) * BITS_PER_UNIT) < mode_align) + return true; + + if ((highest_pow2_factor (step) * BITS_PER_UNIT) < mode_align) return true; }