/* PRs target/15569, rtl-optimization/15681 */ /* { dg-do compile } */ /* { dg-options "-Os -frename-registers" } */ /* { dg-options "-mconstant-gp -Os -frename-registers" { target ia64-*-* } } */ struct S { struct S *a, *b; }; struct T { struct S e; unsigned long a; int b, c; void *d; } f; unsigned long f1 (unsigned long); void f2 (int, struct T *); void *f3 (void *); unsigned long volatile g; static void f4 (struct T *p) { f1 (f1 (((unsigned long) g - p->a) >> 20)); } static struct T * f5 (void) { struct T *g, *p; struct T *q = 0; for (g = p = &f; (g = p = (struct T *) (g->e.a)) != &f;) if (p->b) { f4 (p); if (p->c & 0x80000) return p; } return q; } static void f6 (struct T *p) { f2 (9, p); } static inline void * f7 (struct T *t) { void *d; d = t->d; if (d) d = f3 (d); return d; } static void * f8 (struct T *p) { void *d = f7 (p); if (!d) return 0; f6 (p); return d; } static void f9 (void) { struct T *p; p = f5 (); f8 (p); } void test (void) { f9 (); }