diff options
Diffstat (limited to 'gcc/testsuite/gcc.dg/pr46620.c')
-rw-r--r-- | gcc/testsuite/gcc.dg/pr46620.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/pr46620.c b/gcc/testsuite/gcc.dg/pr46620.c new file mode 100644 index 000000000..8cc71ebbb --- /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 <stdlib.h> + +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); +} |