tree-ssa-loop-ivopts.c (may_be_unaligned_p): Check the alignment of the variable part of the offset as well.
* 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. From-SVN: r158948
This commit is contained in:
parent
5cb6410a27
commit
ce276b614c
|
@ -1,3 +1,9 @@
|
|||
2010-04-30 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* 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 <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/43879
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2010-04-30 DJ Delorie <dj@redhat.com>
|
||||
|
||||
* gcc.c-torture/execute/20100430-1.c: New test.
|
||||
|
||||
2010-04-30 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/43868
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue