blob: f50ffa58221f3d6eefb43ea6fecc663fba95bee5 [file] [log] [blame]
/* Verify that simple indirect calls are inlined even without early
inlining.. */
/* { dg-do compile } */
/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-icf" } */
struct S
{
int i;
void (*f)(struct S *);
unsigned u;
};
struct U
{
struct U *next;
struct S s;
short a[8];
};
extern void non_existent(struct S *p, int);
/* ----- 1 ----- */
static void hooray1 (struct S *p)
{
non_existent (p, 1);
}
static void hiphip1 (struct S *p)
{
p->f (p);
}
int test1 (void)
{
struct S s;
s.i = 1234;
s.f = hooray1;
s.u = 1001;
hiphip1 (&s);
return 0;
}
/* ----- 2 ----- */
struct S *gp;
static void hooray2 (struct S *p)
{
non_existent (p, 2);
}
static void hip2 (struct S *p)
{
p->f (p);
}
static void hiphip2 (struct S *p)
{
hip2 (p);
}
int test2 (void)
{
struct S *p = gp;
p->i = 2341;
p->f = hooray2;
p->u = 1002;
hiphip2 (p);
return 0;
}
/* ----- 3 ----- */
static void hooray3 (struct S *p)
{
non_existent (p, 2);
}
static void hip3 (struct S *p)
{
p->f (p);
}
static __attribute__ ((flatten)) void hiphip3 (struct S *p)
{
hip3 (p);
}
int test3 (void)
{
struct S *p = gp;
p->i = 2341;
p->f = hooray3;
p->u = 1003;
hiphip3 (p);
return 0;
}
/* ----- 4 ----- */
static void hooray4 (struct S *p)
{
non_existent (p, 3);
}
static void hiphip4 (struct S s)
{
s.f (&s);
}
int test4(void)
{
struct S s;
s.i = 3412;
s.f = hooray4;
s.u = 1004;
hiphip4 (s);
return 0;
}
/* ----- 5 ----- */
struct U *gu;
static void hooray5 (struct S *p)
{
non_existent (p, 5);
}
static void hip5 (struct S *p)
{
p->f (p);
}
static void hiphip5 (struct U *u)
{
hip5 (&u->s);
}
int test5 (void)
{
struct U *u = gu;
u->next = u;
u->s.i = 9876;
u->s.f = hooray5;
u->s.u = 1005;
hiphip5 (u);
return 0;
}
/* ----- 6 ----- */
static void hooray6 (struct S *p)
{
non_existent (p, 6);
}
static void hip6 (struct S *p)
{
p->f (p);
}
static __attribute__ ((flatten)) void hiphip6 (struct U *u)
{
hip6 (&u->s);
}
int test6 (void)
{
struct U *u = gu;
u->next = u;
u->s.i = 9876;
u->s.f = hooray6;
u->s.u = 1006;
hiphip6 (u);
return 0;
}
/* ----- 7 ----- */
struct S **gdp;
static void hooray7 (struct S *p)
{
non_existent (p, 7);
}
static void hip7 (struct S *p)
{
p->f (p);
gdp = &p;
}
static void hiphip7 (struct S *p)
{
hip7 (p);
gdp = &p;
}
int test7 (void)
{
struct S *p = gp;
p->i = 7341;
p->f = hooray7;
p->u = 1007;
hiphip7 (p);
return 0;
}
/* { dg-final { scan-ipa-dump "hooray1\[^\\n\]*inline copy in test1" "inline" } } */
/* { dg-final { scan-ipa-dump "hooray2\[^\\n\]*inline copy in test2" "inline" } } */
/* { dg-final { scan-ipa-dump "hooray3\[^\\n\]*inline copy in test3" "inline" } } */
/* { dg-final { scan-ipa-dump "hooray4\[^\\n\]*inline copy in test4" "inline" { xfail { { hppa*-*-* } && { ! lp64 } } } } } */
/* { dg-final { scan-ipa-dump "hooray5\[^\\n\]*inline copy in test5" "inline" } } */
/* { dg-final { scan-ipa-dump "hooray6\[^\\n\]*inline copy in test6" "inline" } } */
/* { dg-final { scan-ipa-dump "hooray7\[^\\n\]*inline copy in test7" "inline" } } */