1 /* PR tree-optimization/91597 */
2 
3 enum E { A, B, C };
4 struct __attribute__((aligned (4))) S { enum E e; };
5 
6 enum E
foo(struct S * o)7 foo (struct S *o)
8 {
9   if (((__UINTPTR_TYPE__) (o) & 1) == 0)
10     return o->e;
11   else
12     return A;
13 }
14 
15 int
bar(struct S * o)16 bar (struct S *o)
17 {
18   return foo (o) == B || foo (o) == C;
19 }
20 
21 static inline void
baz(struct S * o,int d)22 baz (struct S *o, int d)
23 {
24   if (__builtin_expect (!bar (o), 0))
25     __builtin_abort ();
26   if (d > 2) return;
27   baz (o, d + 1);
28 }
29 
30 void
qux(struct S * o)31 qux (struct S *o)
32 {
33   switch (o->e)
34     {
35     case A: return;
36     case B: baz (o, 0); break;
37     case C: baz (o, 0); break;
38     }
39 }
40 
41 struct S s = { C };
42 
43 int
main()44 main ()
45 {
46   qux (&s);
47   return 0;
48 }
49