| /* { dg-do run } */ |
| /* { dg-options "-O2 -fomit-frame-pointer" } */ |
| /* { dg-options "-O2 -fomit-frame-pointer -march=i386" { target { { i?86-*-* x86_64-*-* } && ia32 } } } */ |
| |
| extern void abort (void); |
| extern void exit (int); |
| |
| struct S |
| { |
| int *a; |
| unsigned char *b, c; |
| }; |
| |
| int u, v, w; |
| |
| void |
| foo (unsigned short x) |
| { |
| u += x; |
| } |
| |
| int |
| bar (struct S **x, int *y) |
| { |
| w += *y; |
| *y = w + 25; |
| return 0; |
| } |
| |
| int |
| baz (struct S **x) |
| { |
| struct S *y = *x; |
| unsigned char *a = y->b; |
| |
| foo (*a); |
| |
| if (__builtin_expect (y->c != 0 || y->a == &v, 0)) |
| return 1; |
| |
| if (__builtin_expect (*a == 1, 0)) |
| { |
| int a, b = bar (x, &a); |
| |
| if (a) |
| return b; |
| } |
| |
| return 0; |
| } |
| |
| int |
| main (void) |
| { |
| struct S a, *b = &a; |
| unsigned char c; |
| |
| __builtin_memset (b, 0, sizeof (a)); |
| a.a = &v; |
| a.b = &c; |
| if (baz (&b) != 1) |
| abort (); |
| exit (0); |
| } |