1 /* { dg-do run } */
2 /* { dg-options "-O -fipa-pta -fdump-ipa-pta2-details" } */
3 
4 static int __attribute__((noinline))
foo(int * p,int * q)5 foo (int *p, int *q)
6 {
7   *p = 2;
8   *q = 1;
9   return *p;
10 }
11 
12 static int __attribute__((noinline))
bar(int * p,int * q)13 bar (int *p, int *q)
14 {
15   *p = -2;
16   *q = -1;
17   return *p;
18 }
19 
20 static int __attribute__((noinline,noclone))
foobar(int foo_p)21 foobar (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 
32 extern void abort (void);
33 
main()34 int 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 }" "pta2" } } */
46 /* { dg-final { scan-ipa-dump "bar.arg0 = { a }" "pta2" } } */
47 /* { dg-final { scan-ipa-dump "bar.arg1 = { a }" "pta2" } } */
48 /* { dg-final { scan-ipa-dump "foo.arg0 = { a }" "pta2" } } */
49 /* { dg-final { scan-ipa-dump "foo.arg1 = { a }" "pta2" } } */
50