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 
9 struct 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 
28 struct rt
29 {
30   struct rt*		d;
31   void (*edo)(void * const);
32   short			lId;
33   char          dac;
34 };
35 
36 struct pedr
37 {
38   struct rt re;
39   struct PCT pc;
40   unsigned char mid;
41 } ;
42 
43 void __attribute__((__noinline__))
rei(struct rt * const me,unsigned short anId,void * ad)44 rei(struct rt* const me, unsigned short anId, void *ad )
45 {
46   asm volatile ("");
47 }
48 
49 void __attribute__((__noinline__))
pedrdo(void * const p)50 pedrdo(void * const p)
51 {
52   asm volatile ("");
53 }
54 
55 void __attribute__((__noinline__))
pedri(struct pedr * const me,struct PCT ppc,unsigned char pmid)56 pedri (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 
main()64 int 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