1 /* Verify that simple indirect calls are inlined even without early
4 /* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-icf" } */
6 extern void abort (void);
11 void (*f
)(struct S
*);
25 void (*f
)(struct Z
*, int);
34 static __attribute__ ((noinline
, noclone
)) struct U
*
37 return (struct U
*) &gc
;
40 static void wrong_target_1 (struct S
*s
)
45 static void wrong_target_2 (struct S
*s
)
50 static void wrong_target_3 (struct S
*s
)
55 static void wrong_target_4 (struct S
*s
)
60 static void good_target (struct Z
*z
, int i
)
65 static void good_target_4 (struct S
*s
)
70 static void g1 (struct S
*s
)
72 struct Z
*z
= (struct Z
*) s
;
76 static void f1 (struct U
*u
)
82 static void g2 (struct Z
*z
)
87 static void f2 (struct U
*u
)
90 g2 ((struct Z
*) &u
->s
);
93 static void h3 (struct Z
*z
)
98 static void g3 (struct S
*s
)
103 static void f3 (struct U
*u
)
109 static void h4 (struct S
*s
)
114 static void g4 (struct U
*u
)
119 static inline __attribute__ ((flatten
)) void f4 (struct Z
*z
)
121 gu
->s
.f
= good_target_4
;
125 int main (int argc
, char **argv
)
127 struct U
*u
= get_u ();
130 u
->s
.f
= wrong_target_1
;
132 gz
= (struct Z
*) &u
->s
;
137 u
->s
.f
= wrong_target_2
;
138 gz
= (struct Z
*) &u
->s
;
143 u
->s
.f
= wrong_target_3
;
144 gz
= (struct Z
*) &u
->s
;
149 u
->s
.f
= wrong_target_4
;
156 /* { dg-final { scan-ipa-dump-not "wrong_target\[^\\n\]*inline copy in" "inline" } } */