1 /* PR tree-optimization/27285 */
2 
3 extern void abort (void);
4 
5 struct S { unsigned char a, b, c, d[16]; };
6 
7 void __attribute__ ((noinline))
foo(struct S * x,struct S * y)8 foo (struct S *x, struct S *y)
9 {
10   int a, b;
11   unsigned char c, *d, *e;
12 
13   b = x->b;
14   d = x->d;
15   e = y->d;
16   a = 0;
17   while (b)
18     {
19       if (b >= 8)
20 	{
21 	  c = 0xff;
22 	  b -= 8;
23 	}
24       else
25 	{
26 	  c = 0xff << (8 - b);
27 	  b = 0;
28 	}
29 
30       e[a] = d[a] & c;
31       a++;
32     }
33 }
34 
35 int
main(void)36 main (void)
37 {
38   struct S x = { 0, 25, 0, { 0xaa, 0xbb, 0xcc, 0xdd }};
39   struct S y = { 0, 0, 0, { 0 }};
40 
41   foo (&x, &y);
42   if (x.d[0] != y.d[0] || x.d[1] != y.d[1]
43       || x.d[2] != y.d[2] || (x.d[3] & 0x80) != y.d[3])
44     abort ();
45    return 0;
46 }
47