1 /* Verify that IPA-CP can clone mark_cell without miscompiling it despite its
2 type_attributes. */
3 /* { dg-do run } */
4 /* { dg-options "-O3 -fdump-ipa-cp" } */
5
6
7 struct PMC {
8 unsigned flags;
9 };
10
11 typedef struct Pcc_cell
12 {
13 struct PMC *p;
14 long bla;
15 long type;
16 } Pcc_cell;
17
18 int gi;
19
20 extern void abort ();
21 extern void never_ever(int * interp, struct PMC *pmc)
22 __attribute__((noinline));
23
never_ever(int * interp,struct PMC * pmc)24 void never_ever (int * interp, struct PMC *pmc)
25 {
26 abort ();
27 }
28
29 static void mark_cell(int * interp, Pcc_cell *c)
30 __attribute__((__nonnull__(1)))
31 __attribute__((noinline));
32
33 static void
mark_cell(int * interp,Pcc_cell * c)34 mark_cell(int * interp, Pcc_cell *c)
35 {
36 if (c && c->type == 4 && c->p
37 && !(c->p->flags & (1<<14)))
38 never_ever(interp, c->p);
39 }
40
41 static void foo(int * interp, Pcc_cell *c)
42 __attribute__((noinline));
43
44 static void
foo(int * interp,Pcc_cell * c)45 foo(int * interp, Pcc_cell *c)
46 {
47 mark_cell(interp, c);
48 }
49
50 static struct Pcc_cell *
51 __attribute__((noinline,noclone))
getnull(void)52 getnull(void)
53 {
54 return (struct Pcc_cell *) 0;
55 }
56
57
main()58 int main()
59 {
60 int i;
61
62 for (i = 0; i < 100; i++)
63 foo (&gi, getnull ());
64 return 0;
65 }
66
67
68 /* { dg-final { scan-ipa-dump "Creating a specialized node of mark_cell" "cp" } } */
69
70