1/* { dg-do compile { target nonpic } } */ 2/* { dg-options "-O3 -fdump-tree-local-pure-const1 -fdump-ipa-pure-const -fdump-tree-optimized -fno-early-inlining -fgnu89-inline" } */ 3void abort (void); 4int error_code; 5static int val; 6__attribute__ ((noinline, noclone)) 7static int 8i_am_pure1 (int a) 9{ 10 if (a > 50) 11 abort (); 12 return a; 13} 14 15__attribute__ ((noinline, noclone)) 16static int 17i_am_const2 (int a) 18{ 19 return a+val; 20} 21 22__attribute__ ((noinline, noclone)) 23int 24call_me(int a) 25{ 26 return a; 27} 28 29inline int 30call_callback(int (*fn)(int), int a) 31{ 32 return fn(a); 33} 34 35__attribute__ ((noinline, noclone)) int 36i_am_const3(int a) 37{ 38 return call_callback (call_me, a); 39} 40 41__attribute__ ((noinline)) int 42explode_badly() 43{ 44 error_code = 0xbad; 45 abort (); 46} 47 48__attribute__ ((noinline, noclone)) int 49i_am_pure4(int a) 50{ 51 if (a > 50) 52 explode_badly (); 53 return a; 54} 55 56int 57test() 58{ 59 int s; 60 s = i_am_pure1(5); 61 s += i_am_pure1(5); 62 s += i_am_const2(5); 63 s += i_am_const2(5); 64 s += i_am_const3(5); 65 s += i_am_const3(5); 66 s += i_am_pure4(5); 67 s += i_am_pure4(5); 68 return s; 69} 70/* { dg-final { scan-tree-dump-times "i_am_pure1 .5" 1 "optimized"} } */ 71/* { dg-final { scan-tree-dump-times "i_am_const2 .5" 1 "optimized"} } */ 72/* { dg-final { scan-tree-dump-times "i_am_const3 .5" 1 "optimized"} } */ 73/* { dg-final { scan-tree-dump-times "i_am_pure4 .5" 1 "optimized"} } */ 74/* { dg-final { scan-tree-dump "found to be looping pure: i_am_pure1" "local-pure-const1"} } */ 75/* { dg-final { scan-tree-dump "found to be looping pure: i_am_pure4" "local-pure-const1"} } */ 76/* { dg-final { scan-ipa-dump "found to be const: i_am_const2" "pure-const"} } */ 77/* { dg-final { scan-ipa-dump "found to be const: i_am_const3" "pure-const"} } */ 78/* { dg-final { cleanup-tree-dump "local-pure-const1" } } */ 79/* { dg-final { cleanup-tree-dump "optimized" } } */ 80/* { dg-final { cleanup-ipa-dump "pure-const" } } */ 81 82