1 struct PMC {
2 unsigned flags;
3 };
4
5 typedef struct Pcc_cell
6 {
7 struct PMC *p;
8 long bla;
9 long type;
10 } Pcc_cell;
11
12 int gi;
13 int cond;
14
15 extern void abort ();
16 extern void never_ever(int interp, struct PMC *pmc)
17 __attribute__((noinline,noclone));
18
never_ever(int interp,struct PMC * pmc)19 void never_ever (int interp, struct PMC *pmc)
20 {
21 abort ();
22 }
23
24 static void mark_cell(int * interp, Pcc_cell *c)
25 __attribute__((__nonnull__(1)));
26
27 static void
mark_cell(int * interp,Pcc_cell * c)28 mark_cell(int * interp, Pcc_cell *c)
29 {
30 if (!cond)
31 return;
32
33 if (c && c->type == 4 && c->p
34 && !(c->p->flags & (1<<18)))
35 never_ever(gi + 1, c->p);
36 if (c && c->type == 4 && c->p
37 && !(c->p->flags & (1<<17)))
38 never_ever(gi + 2, c->p);
39 if (c && c->type == 4 && c->p
40 && !(c->p->flags & (1<<16)))
41 never_ever(gi + 3, c->p);
42 if (c && c->type == 4 && c->p
43 && !(c->p->flags & (1<<15)))
44 never_ever(gi + 4, c->p);
45 if (c && c->type == 4 && c->p
46 && !(c->p->flags & (1<<14)))
47 never_ever(gi + 5, c->p);
48 if (c && c->type == 4 && c->p
49 && !(c->p->flags & (1<<13)))
50 never_ever(gi + 6, c->p);
51 if (c && c->type == 4 && c->p
52 && !(c->p->flags & (1<<12)))
53 never_ever(gi + 7, c->p);
54 if (c && c->type == 4 && c->p
55 && !(c->p->flags & (1<<11)))
56 never_ever(gi + 8, c->p);
57 if (c && c->type == 4 && c->p
58 && !(c->p->flags & (1<<10)))
59 never_ever(gi + 9, c->p);
60 }
61
62 static void
foo(int * interp,Pcc_cell * c)63 foo(int * interp, Pcc_cell *c)
64 {
65 mark_cell(interp, c);
66 }
67
68 static struct Pcc_cell *
69 __attribute__((noinline,noclone))
getnull(void)70 getnull(void)
71 {
72 return (struct Pcc_cell *) 0;
73 }
74
75
main()76 int main()
77 {
78 int i;
79
80 cond = 1;
81 for (i = 0; i < 100; i++)
82 foo (&gi, getnull ());
83 return 0;
84 }
85
86
87 void
bar_1(int * interp,Pcc_cell * c)88 bar_1 (int * interp, Pcc_cell *c)
89 {
90 c->bla += 1;
91 mark_cell(interp, c);
92 }
93
94 void
bar_2(int * interp,Pcc_cell * c)95 bar_2 (int * interp, Pcc_cell *c)
96 {
97 c->bla += 2;
98 mark_cell(interp, c);
99 }
100
101