From aaea2f902a38b7aeb7971ed041cb85c5e2be0b7a Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Sat, 19 Feb 2011 21:14:49 +0000 Subject: [PATCH] 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 --- gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.dg/pr46620.c | 76 ++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/pr46620.c 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); +} -- 2.47.2