callee_0()1*7c3d14c8STreehugger Robot void callee_0() {}
callee_1()2*7c3d14c8STreehugger Robot void callee_1() {}
callee_2()3*7c3d14c8STreehugger Robot void callee_2() {}
callee_3()4*7c3d14c8STreehugger Robot void callee_3() {}
5*7c3d14c8STreehugger Robot
6*7c3d14c8STreehugger Robot void *CalleeAddrs[] = {callee_0, callee_1, callee_2, callee_3};
7*7c3d14c8STreehugger Robot extern void lprofSetMaxValsPerSite(unsigned);
8*7c3d14c8STreehugger Robot
9*7c3d14c8STreehugger Robot // sequences of callee ids
10*7c3d14c8STreehugger Robot
11*7c3d14c8STreehugger Robot // In the following sequences,
12*7c3d14c8STreehugger Robot // there are two targets, the dominating target is
13*7c3d14c8STreehugger Robot // target 0.
14*7c3d14c8STreehugger Robot int CallSeqTwoTarget_1[] = {0, 0, 0, 0, 0, 1, 1};
15*7c3d14c8STreehugger Robot int CallSeqTwoTarget_2[] = {1, 1, 0, 0, 0, 0, 0};
16*7c3d14c8STreehugger Robot int CallSeqTwoTarget_3[] = {1, 0, 0, 1, 0, 0, 0};
17*7c3d14c8STreehugger Robot int CallSeqTwoTarget_4[] = {0, 0, 0, 1, 0, 1, 0};
18*7c3d14c8STreehugger Robot
19*7c3d14c8STreehugger Robot // In the following sequences, there are three targets
20*7c3d14c8STreehugger Robot // The dominating target is 0 and has > 50% of total
21*7c3d14c8STreehugger Robot // counts.
22*7c3d14c8STreehugger Robot int CallSeqThreeTarget_1[] = {0, 0, 0, 0, 0, 0, 1, 2, 1};
23*7c3d14c8STreehugger Robot int CallSeqThreeTarget_2[] = {1, 2, 1, 0, 0, 0, 0, 0, 0};
24*7c3d14c8STreehugger Robot int CallSeqThreeTarget_3[] = {1, 0, 0, 2, 0, 0, 0, 1, 0};
25*7c3d14c8STreehugger Robot int CallSeqThreeTarget_4[] = {0, 0, 0, 1, 0, 1, 0, 0, 2};
26*7c3d14c8STreehugger Robot
27*7c3d14c8STreehugger Robot // Four target sequence --
28*7c3d14c8STreehugger Robot // There are two cold targets which occupies the value counters
29*7c3d14c8STreehugger Robot // early. There is also a very hot target and a medium hot target
30*7c3d14c8STreehugger Robot // which are invoked in an interleaved fashion -- the length of each
31*7c3d14c8STreehugger Robot // hot period in the sequence is shorter than the cold targets' count.
32*7c3d14c8STreehugger Robot // 1. If only two values are tracked, the Hot and Medium hot targets
33*7c3d14c8STreehugger Robot // should surive in the end
34*7c3d14c8STreehugger Robot // 2. If only three values are tracked, the top three targets should
35*7c3d14c8STreehugger Robot // surive in the end.
36*7c3d14c8STreehugger Robot int CallSeqFourTarget_1[] = {1, 1, 1, 2, 2, 2, 2, 0, 0, 3, 0, 0, 3, 0, 0, 3,
37*7c3d14c8STreehugger Robot 0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0, 3};
38*7c3d14c8STreehugger Robot
39*7c3d14c8STreehugger Robot // Same as above, but the cold entries are invoked later.
40*7c3d14c8STreehugger Robot int CallSeqFourTarget_2[] = {0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0, 3, 0,
41*7c3d14c8STreehugger Robot 0, 3, 0, 0, 3, 0, 0, 3, 1, 1, 1, 2, 2, 2, 2};
42*7c3d14c8STreehugger Robot
43*7c3d14c8STreehugger Robot // Same as above, but all the targets are interleaved.
44*7c3d14c8STreehugger Robot int CallSeqFourTarget_3[] = {0, 3, 0, 0, 1, 3, 0, 0, 0, 2, 0, 0, 3, 3, 0, 3,
45*7c3d14c8STreehugger Robot 2, 2, 0, 3, 3, 1, 0, 0, 1, 0, 0, 3, 0, 2, 0};
46*7c3d14c8STreehugger Robot
47*7c3d14c8STreehugger Robot typedef void (*FPT)(void);
48*7c3d14c8STreehugger Robot
49*7c3d14c8STreehugger Robot
50*7c3d14c8STreehugger Robot // Testing value profiling eviction algorithm.
getCalleeFunc(int I)51*7c3d14c8STreehugger Robot FPT getCalleeFunc(int I) { return CalleeAddrs[I]; }
52*7c3d14c8STreehugger Robot
main()53*7c3d14c8STreehugger Robot int main() {
54*7c3d14c8STreehugger Robot int I;
55*7c3d14c8STreehugger Robot
56*7c3d14c8STreehugger Robot #define INDIRECT_CALLSITE(Sequence, NumValsTracked) \
57*7c3d14c8STreehugger Robot lprofSetMaxValsPerSite(NumValsTracked); \
58*7c3d14c8STreehugger Robot for (I = 0; I < sizeof(Sequence) / sizeof(*Sequence); I++) { \
59*7c3d14c8STreehugger Robot FPT FP = getCalleeFunc(Sequence[I]); \
60*7c3d14c8STreehugger Robot FP(); \
61*7c3d14c8STreehugger Robot }
62*7c3d14c8STreehugger Robot
63*7c3d14c8STreehugger Robot // check site, target patterns
64*7c3d14c8STreehugger Robot // CHECK: 0, callee_0
65*7c3d14c8STreehugger Robot INDIRECT_CALLSITE(CallSeqTwoTarget_1, 1);
66*7c3d14c8STreehugger Robot
67*7c3d14c8STreehugger Robot // CHECK-NEXT: 1, callee_0
68*7c3d14c8STreehugger Robot INDIRECT_CALLSITE(CallSeqTwoTarget_2, 1);
69*7c3d14c8STreehugger Robot
70*7c3d14c8STreehugger Robot // CHECK-NEXT: 2, callee_0
71*7c3d14c8STreehugger Robot INDIRECT_CALLSITE(CallSeqTwoTarget_3, 1);
72*7c3d14c8STreehugger Robot
73*7c3d14c8STreehugger Robot // CHECK-NEXT: 3, callee_0
74*7c3d14c8STreehugger Robot INDIRECT_CALLSITE(CallSeqTwoTarget_4, 1);
75*7c3d14c8STreehugger Robot
76*7c3d14c8STreehugger Robot // CHECK-NEXT: 4, callee_0
77*7c3d14c8STreehugger Robot INDIRECT_CALLSITE(CallSeqThreeTarget_1, 1);
78*7c3d14c8STreehugger Robot
79*7c3d14c8STreehugger Robot // CHECK-NEXT: 5, callee_0
80*7c3d14c8STreehugger Robot INDIRECT_CALLSITE(CallSeqThreeTarget_2, 1);
81*7c3d14c8STreehugger Robot
82*7c3d14c8STreehugger Robot // CHECK-NEXT: 6, callee_0
83*7c3d14c8STreehugger Robot INDIRECT_CALLSITE(CallSeqThreeTarget_3, 1);
84*7c3d14c8STreehugger Robot
85*7c3d14c8STreehugger Robot // CHECK-NEXT: 7, callee_0
86*7c3d14c8STreehugger Robot INDIRECT_CALLSITE(CallSeqThreeTarget_4, 1);
87*7c3d14c8STreehugger Robot
88*7c3d14c8STreehugger Robot // CHECK-NEXT: 8, callee_0
89*7c3d14c8STreehugger Robot // CHECK-NEXT: 8, callee_1
90*7c3d14c8STreehugger Robot INDIRECT_CALLSITE(CallSeqThreeTarget_1, 2);
91*7c3d14c8STreehugger Robot
92*7c3d14c8STreehugger Robot // CHECK-NEXT: 9, callee_0
93*7c3d14c8STreehugger Robot // CHECK-NEXT: 9, callee_1
94*7c3d14c8STreehugger Robot INDIRECT_CALLSITE(CallSeqThreeTarget_2, 2);
95*7c3d14c8STreehugger Robot
96*7c3d14c8STreehugger Robot // CHECK-NEXT: 10, callee_0
97*7c3d14c8STreehugger Robot // CHECK-NEXT: 10, callee_1
98*7c3d14c8STreehugger Robot INDIRECT_CALLSITE(CallSeqThreeTarget_3, 2);
99*7c3d14c8STreehugger Robot
100*7c3d14c8STreehugger Robot // CHECK-NEXT: 11, callee_0
101*7c3d14c8STreehugger Robot // CHECK-NEXT: 11, callee_1
102*7c3d14c8STreehugger Robot INDIRECT_CALLSITE(CallSeqThreeTarget_4, 2);
103*7c3d14c8STreehugger Robot
104*7c3d14c8STreehugger Robot // CHECK-NEXT: 12, callee_0
105*7c3d14c8STreehugger Robot INDIRECT_CALLSITE(CallSeqFourTarget_1, 1);
106*7c3d14c8STreehugger Robot
107*7c3d14c8STreehugger Robot // CHECK-NEXT: 13, callee_0
108*7c3d14c8STreehugger Robot INDIRECT_CALLSITE(CallSeqFourTarget_2, 1);
109*7c3d14c8STreehugger Robot
110*7c3d14c8STreehugger Robot // CHECK-NEXT: 14, callee_0
111*7c3d14c8STreehugger Robot INDIRECT_CALLSITE(CallSeqFourTarget_3, 1);
112*7c3d14c8STreehugger Robot
113*7c3d14c8STreehugger Robot // CHECK-NEXT: 15, callee_0
114*7c3d14c8STreehugger Robot // CHECK-NEXT: 15, callee_3
115*7c3d14c8STreehugger Robot INDIRECT_CALLSITE(CallSeqFourTarget_1, 2);
116*7c3d14c8STreehugger Robot
117*7c3d14c8STreehugger Robot // CHECK-NEXT: 16, callee_0
118*7c3d14c8STreehugger Robot // CHECK-NEXT: 16, callee_3
119*7c3d14c8STreehugger Robot INDIRECT_CALLSITE(CallSeqFourTarget_2, 2);
120*7c3d14c8STreehugger Robot
121*7c3d14c8STreehugger Robot // CHECK-NEXT: 17, callee_0
122*7c3d14c8STreehugger Robot // CHECK-NEXT: 17, callee_3
123*7c3d14c8STreehugger Robot INDIRECT_CALLSITE(CallSeqFourTarget_3, 2);
124*7c3d14c8STreehugger Robot
125*7c3d14c8STreehugger Robot // CHECK-NEXT: 18, callee_0
126*7c3d14c8STreehugger Robot // CHECK-NEXT: 18, callee_3
127*7c3d14c8STreehugger Robot // CHECK-NEXT: 18, callee_2
128*7c3d14c8STreehugger Robot INDIRECT_CALLSITE(CallSeqFourTarget_1, 3);
129*7c3d14c8STreehugger Robot
130*7c3d14c8STreehugger Robot // CHECK-NEXT: 19, callee_0
131*7c3d14c8STreehugger Robot // CHECK-NEXT: 19, callee_3
132*7c3d14c8STreehugger Robot // CHECK-NEXT: 19, callee_2
133*7c3d14c8STreehugger Robot INDIRECT_CALLSITE(CallSeqFourTarget_2, 3);
134*7c3d14c8STreehugger Robot
135*7c3d14c8STreehugger Robot // CHECK-NEXT: 20, callee_0
136*7c3d14c8STreehugger Robot // CHECK-NEXT: 20, callee_3
137*7c3d14c8STreehugger Robot // CHECK-NEXT: 20, callee_2
138*7c3d14c8STreehugger Robot INDIRECT_CALLSITE(CallSeqFourTarget_3, 3);
139*7c3d14c8STreehugger Robot
140*7c3d14c8STreehugger Robot return 0;
141*7c3d14c8STreehugger Robot }
142