| /* PR tree-optimization/33763 */ |
| /* { dg-do compile } */ |
| /* { dg-options "-O2" } */ |
| |
| typedef struct |
| { |
| void *a; |
| void *b; |
| } T; |
| extern void *foo (const char *, const char *); |
| extern void *bar (void *, const char *, T); |
| extern int baz (const char *, int); |
| |
| extern inline __attribute__ ((always_inline, gnu_inline)) int |
| baz (const char *x, int y) |
| { |
| return 2; |
| } |
| |
| int |
| baz (const char *x, int y) |
| { |
| return 1; |
| } |
| |
| int xa, xb; |
| |
| static void * |
| inl (const char *x, const char *y) |
| { |
| T t = { &xa, &xb }; |
| int *f = (int *) __builtin_malloc (sizeof (int)); |
| const char *z; |
| int o = 0; |
| void *r = 0; |
| |
| for (z = y; *z; z++) |
| { |
| if (*z == 'r') |
| o |= 1; |
| if (*z == 'w') |
| o |= 2; |
| } |
| if (o == 1) |
| *f = baz (x, 0); |
| if (o == 2) |
| *f = baz (x, 1); |
| if (o == 3) |
| *f = baz (x, 2); |
| |
| if (o && *f > 0) |
| r = bar (f, "w", t); |
| return r; |
| } |
| |
| void * |
| foo (const char *x, const char *y) |
| { |
| return inl (x, y); |
| } |