1/* { dg-do run } */ 2/* { dg-options "-O -fipa-pta -fdump-ipa-pta-details" } */ 3 4static int __attribute__((noinline)) 5foo (int *p, int *q) 6{ 7 *p = 2; 8 *q = 1; 9 return *p; 10} 11 12static int __attribute__((noinline)) 13bar (int *p, int *q) 14{ 15 *p = -2; 16 *q = -1; 17 return *p; 18} 19 20static int __attribute__((noinline,noclone)) 21foobar (int foo_p) 22{ 23 int a; 24 int (*fn)(int *, int *); 25 if (foo_p) 26 fn = foo; 27 else 28 fn = bar; 29 return (*fn)(&a, &a); 30} 31 32extern void abort (void); 33 34int main() 35{ 36 if (foobar (1) != 1) 37 abort (); 38 39 return 0; 40} 41 42/* IPA PTA needs to handle indirect calls properly. Verify that 43 both bar and foo get a (and only a) in their arguments points-to sets. */ 44 45/* { dg-final { scan-ipa-dump "fn_1 = { bar foo }" "pta" } } */ 46/* { dg-final { scan-ipa-dump "bar.arg0 = { a }" "pta" } } */ 47/* { dg-final { scan-ipa-dump "bar.arg1 = { a }" "pta" } } */ 48/* { dg-final { scan-ipa-dump "foo.arg0 = { a }" "pta" } } */ 49/* { dg-final { scan-ipa-dump "foo.arg1 = { a }" "pta" } } */ 50/* { dg-final { cleanup-ipa-dump "pta" } } */ 51