From: Alexandre Oliva Date: Sat, 19 Feb 2011 21:14:49 +0000 (+0000) Subject: re PR tree-optimization/46620 (32-bit structures containing bitfields are not copied... X-Git-Tag: releases/gcc-4.4.6~117 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=aaea2f902a38b7aeb7971ed041cb85c5e2be0b7a;p=thirdparty%2Fgcc.git re PR tree-optimization/46620 (32-bit structures containing bitfields are not copied correctly on -O2 , x86 backend) PR tree-optimization/46620 * gcc.dg/pr46620.c: New. From-SVN: r170327 --- diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 19146f9ca383..b9fc19c50611 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-02-19 Alexandre Oliva + + PR tree-optimization/46620 + * gcc.dg/pr46620.c: New. + 2011-02-19 Tobias Burnus PR fortran/47775 diff --git a/gcc/testsuite/gcc.dg/pr46620.c b/gcc/testsuite/gcc.dg/pr46620.c new file mode 100644 index 000000000000..8cc71ebbb180 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr46620.c @@ -0,0 +1,76 @@ +/* PR tree-optimization/46620 */ +/* SRA bitfield grouping used to lose track at padding bitfields in + the middle of a word. */ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +#include + +struct PCT +{ + unsigned char pi1 : 4; + unsigned char pi2 : 3; + unsigned char pif : 5; + + unsigned char sl : 2; + unsigned char uc : 1; + unsigned char st : 1; + + unsigned char p : 1; + unsigned char cs : 1; + unsigned char ss : 1; + + unsigned char pc : 3; + unsigned char dmv : 4; + unsigned char cv : 4; +}; + +struct rt +{ + struct rt* d; + void (*edo)(void * const); + short lId; + char dac; +}; + +struct pedr +{ + struct rt re; + struct PCT pc; + unsigned char mid; +} ; + +void __attribute__((__noinline__)) +rei(struct rt* const me, unsigned short anId, void *ad ) +{ + asm volatile (""); +} + +void __attribute__((__noinline__)) +pedrdo(void * const p) +{ + asm volatile (""); +} + +void __attribute__((__noinline__)) +pedri (struct pedr* const me, struct PCT ppc, unsigned char pmid) +{ + rei(&(me->re), 0x7604, 0); + me->pc = ppc; + me->mid = pmid; + (me)->re.edo = pedrdo; +} + +int main() +{ + struct PCT ps; + struct pedr pm; + + pm.pc.dmv = 0; + ps.dmv = 1; + pedri(&pm, ps, 32); + + if (pm.pc.dmv != 1) + abort (); + exit (0); +}