blob: 0adff8d5325b44e5a693b1629a828dd9e4853760 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
#define ANNOTATE(property) __attribute__((annotate(property)))
extern void GC() ANNOTATE("GC Call");
void GC() {
// If the implementation is too trivial, the function body won't be emitted at
// all.
asm("");
}
extern void g(int x);
extern void h(int x);
void f(int x) {
if (x % 3) {
GC();
g(x);
}
h(x);
}
void g(int x) {
if (x % 2) f(x);
h(x);
}
void h(int x) {
if (x) {
f(x - 1);
g(x - 1);
}
}
void leaf() { asm(""); }
void nonrecursive_root() {
leaf();
leaf();
GC();
}
void self_recursive(int x) {
if (x) self_recursive(x - 1);
}
// Set up the graph
//
// n1 <--> n2 n4 <--> n5
// \ /
// --> n3 <---------
// \
// ---> n6 --> n7 <---> n8 --> n9
//
// So recursive roots are one of (n1, n2) plus one of (n4, n5).
extern void n1(int x);
extern void n2(int x);
extern void n3(int x);
extern void n4(int x);
extern void n5(int x);
extern void n6(int x);
extern void n7(int x);
extern void n8(int x);
extern void n9(int x);
void n1(int x) { n2(x); }
void n2(int x) {
if (x) n1(x - 1);
n3(x);
}
void n4(int x) { n5(x); }
void n5(int x) {
if (x) n4(x - 1);
n3(x);
}
void n3(int x) { n6(x); }
void n6(int x) { n7(x); }
void n7(int x) { n8(x); }
void n8(int x) {
if (x) n7(x - 1);
n9(x);
}
void n9(int x) { asm(""); }
|