1/* PR tree-optimization/46620 */
2/* SRA bitfield grouping used to lose track at padding bitfields in
3   the middle of a word.  */
4/* { dg-do run } */
5/* { dg-options "-O2" } */
6
7#include <stdlib.h>
8
9struct PCT
10{
11  unsigned char	pi1	: 4;
12  unsigned char	pi2	: 3;
13  unsigned char	pif	: 5;
14
15  unsigned char	sl	: 2;
16  unsigned char	uc	: 1;
17  unsigned char	st	: 1;
18
19  unsigned char	p	: 1;
20  unsigned char	cs	: 1;
21  unsigned char	ss	: 1;
22
23  unsigned char	pc	: 3;
24  unsigned char	dmv	: 4;
25  unsigned char	cv	: 4;
26};
27
28struct rt
29{
30  struct rt*		d;
31  void (*edo)(void * const);
32  short			lId;
33  char          dac;
34};
35
36struct pedr
37{
38  struct rt re;
39  struct PCT pc;
40  unsigned char mid;
41} ;
42
43void __attribute__((__noinline__))
44rei(struct rt* const me, unsigned short anId, void *ad )
45{
46  asm volatile ("");
47}
48
49void __attribute__((__noinline__))
50pedrdo(void * const p)
51{
52  asm volatile ("");
53}
54
55void __attribute__((__noinline__))
56pedri (struct pedr* const  me, struct PCT ppc, unsigned char pmid)
57{
58  rei(&(me->re), 0x7604, 0);
59  me->pc = ppc;
60  me->mid = pmid;
61  (me)->re.edo = pedrdo;
62}
63
64int main()
65{
66  struct PCT ps;
67  struct pedr pm;
68
69  pm.pc.dmv = 0;
70  ps.dmv = 1;
71  pedri(&pm, ps, 32);
72
73  if (pm.pc.dmv != 1)
74    abort ();
75  exit (0);
76}
77