/* { dg-do run } */ /* { dg-options "-O3 -fno-early-inlining" } */ int array[128]; volatile int v = 0; volatile int blah = 0; int __attribute__((noipa)) obscured_zero () { return 0; } int __attribute__((noipa)) obscured_one () { return 1; } int __attribute__((noipa)) obscured_two () { return 2; } static void cb1 (int l) { v = 25; } static void cb2 (int l) { v = 125; } typedef void (*silly_callback)(int); silly_callback __attribute__((noipa)) get_callback () { return cb1; } static void f (int c, int l, silly_callback p) { int i; for (i = 0; i < c; i++) array[i] = 455; for (i = 0; i < 200; i++) { p (l); if (obscured_one ()) break; } if (l > 0) f (c * 2, l - 1, p); blah = l; } int main (int argc, char *argv[]) { int i; for (i = 0; i < 1000; i++) { f (0, 5, get_callback ()); if (v != 25) __builtin_abort (); if (obscured_one ()) break; } for (i = 0; i < 1000; i++) { f (obscured_zero (), obscured_two (), cb2); if (v != 125) __builtin_abort (); if (obscured_one ()) break; } return 0; }