1 /* { dg-do compile } */
2 /* { dg-options "-O3 -fdump-ipa-cp-details" } */
3
4 #define N 4
5
6 typedef int (* const A[N])(int);
7
8 typedef struct S
9 {
10 int add_offset;
11 A a;
12 } S;
13
14 extern const S *gs, *hs;
15
16 static int __attribute__((noinline))
foo(const S f,int x)17 foo (const S f, int x)
18 {
19 gs = &f;
20 x = f.a[2](x);
21 x = f.a[2](x);
22 x = f.a[2](x);
23 return x;
24 }
25
26 static int __attribute__((noinline))
bar(const S f,int x)27 bar (const S f, int x)
28 {
29 hs = &f;
30 return foo (f, x);
31 }
32
33 static int
zero(int x)34 zero (int x)
35 {
36 return 0;
37 }
38
39 static int
addone(int x)40 addone (int x)
41 {
42 return x + 1;
43 }
44
45 static int
sq(int x)46 sq (int x)
47 {
48 return x * x;
49 }
50
51 static int
cube(int x)52 cube (int x)
53 {
54 return x * x * x;
55 }
56
57 static const S s = {64, {zero, addone, sq, cube}};
58
59 int
h(int x)60 h (int x)
61 {
62 return bar (s, x);
63 }
64
65 /* { dg-final { scan-ipa-dump-times "Discovered an indirect call to a known target" 3 "cp" { xfail { hppa*-*-* && { ! lp64 } } } } } */
66