xref: /aosp_15_r20/external/compiler-rt/test/profile/Inputs/instrprof-value-prof-evict.c (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)

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