forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			142 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
void callee_0() {}
 | 
						|
void callee_1() {}
 | 
						|
void callee_2() {}
 | 
						|
void callee_3() {}
 | 
						|
 | 
						|
void *CalleeAddrs[] = {callee_0, callee_1, callee_2, callee_3};
 | 
						|
extern void lprofSetMaxValsPerSite(unsigned);
 | 
						|
 | 
						|
// sequences of callee ids
 | 
						|
 | 
						|
// In the following sequences,
 | 
						|
// there are two targets, the dominating target is
 | 
						|
// target 0.
 | 
						|
int CallSeqTwoTarget_1[] = {0, 0, 0, 0, 0, 1, 1};
 | 
						|
int CallSeqTwoTarget_2[] = {1, 1, 0, 0, 0, 0, 0};
 | 
						|
int CallSeqTwoTarget_3[] = {1, 0, 0, 1, 0, 0, 0};
 | 
						|
int CallSeqTwoTarget_4[] = {0, 0, 0, 1, 0, 1, 0};
 | 
						|
 | 
						|
// In the following sequences, there are three targets
 | 
						|
// The dominating target is 0 and has > 50% of total
 | 
						|
// counts.
 | 
						|
int CallSeqThreeTarget_1[] = {0, 0, 0, 0, 0, 0, 1, 2, 1};
 | 
						|
int CallSeqThreeTarget_2[] = {1, 2, 1, 0, 0, 0, 0, 0, 0};
 | 
						|
int CallSeqThreeTarget_3[] = {1, 0, 0, 2, 0, 0, 0, 1, 0};
 | 
						|
int CallSeqThreeTarget_4[] = {0, 0, 0, 1, 0, 1, 0, 0, 2};
 | 
						|
 | 
						|
// Four target sequence --
 | 
						|
// There are two cold targets which occupies the value counters
 | 
						|
// early. There is also a very hot target and a medium hot target
 | 
						|
// which are invoked in an interleaved fashion -- the length of each
 | 
						|
// hot period in the sequence is shorter than the cold targets' count.
 | 
						|
//  1. If only two values are tracked, the Hot and Medium hot targets
 | 
						|
//     should surive in the end
 | 
						|
//  2. If only three values are tracked, the top three targets should
 | 
						|
//     surive in the end.
 | 
						|
int CallSeqFourTarget_1[] = {1, 1, 1, 2, 2, 2, 2, 0, 0, 3, 0, 0, 3, 0, 0, 3,
 | 
						|
                             0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0, 3};
 | 
						|
 | 
						|
// Same as above, but the cold entries are invoked later.
 | 
						|
int CallSeqFourTarget_2[] = {0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0, 3, 0,
 | 
						|
                             0, 3, 0, 0, 3, 0, 0, 3, 1, 1, 1, 2, 2, 2, 2};
 | 
						|
 | 
						|
// Same as above, but all the targets are interleaved.
 | 
						|
int CallSeqFourTarget_3[] = {0, 3, 0, 0, 1, 3, 0, 0, 0, 2, 0, 0, 3, 3, 0, 3,
 | 
						|
                             2, 2, 0, 3, 3, 1, 0, 0, 1, 0, 0, 3, 0, 2, 0};
 | 
						|
 | 
						|
typedef void (*FPT)(void);
 | 
						|
 | 
						|
 | 
						|
// Testing value profiling eviction algorithm.
 | 
						|
FPT getCalleeFunc(int I) { return CalleeAddrs[I]; }
 | 
						|
 | 
						|
int main() {
 | 
						|
  int I;
 | 
						|
 | 
						|
#define INDIRECT_CALLSITE(Sequence, NumValsTracked)                            \
 | 
						|
  lprofSetMaxValsPerSite(NumValsTracked);                                      \
 | 
						|
  for (I = 0; I < sizeof(Sequence) / sizeof(*Sequence); I++) {                 \
 | 
						|
    FPT FP = getCalleeFunc(Sequence[I]);                                       \
 | 
						|
    FP();                                                                      \
 | 
						|
  }
 | 
						|
 | 
						|
  // check site, target patterns
 | 
						|
  // CHECK: 0, callee_0
 | 
						|
  INDIRECT_CALLSITE(CallSeqTwoTarget_1, 1);
 | 
						|
 | 
						|
  // CHECK-NEXT: 1, callee_0
 | 
						|
  INDIRECT_CALLSITE(CallSeqTwoTarget_2, 1);
 | 
						|
 | 
						|
  // CHECK-NEXT: 2, callee_0
 | 
						|
  INDIRECT_CALLSITE(CallSeqTwoTarget_3, 1);
 | 
						|
 | 
						|
  // CHECK-NEXT: 3, callee_0
 | 
						|
  INDIRECT_CALLSITE(CallSeqTwoTarget_4, 1);
 | 
						|
 | 
						|
  // CHECK-NEXT: 4, callee_0
 | 
						|
  INDIRECT_CALLSITE(CallSeqThreeTarget_1, 1);
 | 
						|
 | 
						|
  // CHECK-NEXT: 5, callee_0
 | 
						|
  INDIRECT_CALLSITE(CallSeqThreeTarget_2, 1);
 | 
						|
 | 
						|
  // CHECK-NEXT: 6, callee_0
 | 
						|
  INDIRECT_CALLSITE(CallSeqThreeTarget_3, 1);
 | 
						|
 | 
						|
  // CHECK-NEXT: 7, callee_0
 | 
						|
  INDIRECT_CALLSITE(CallSeqThreeTarget_4, 1);
 | 
						|
 | 
						|
  // CHECK-NEXT: 8, callee_0
 | 
						|
  // CHECK-NEXT: 8, callee_1
 | 
						|
  INDIRECT_CALLSITE(CallSeqThreeTarget_1, 2);
 | 
						|
 | 
						|
  // CHECK-NEXT: 9, callee_0
 | 
						|
  // CHECK-NEXT: 9, callee_1
 | 
						|
  INDIRECT_CALLSITE(CallSeqThreeTarget_2, 2);
 | 
						|
 | 
						|
  // CHECK-NEXT: 10, callee_0
 | 
						|
  // CHECK-NEXT: 10, callee_1
 | 
						|
  INDIRECT_CALLSITE(CallSeqThreeTarget_3, 2);
 | 
						|
 | 
						|
  // CHECK-NEXT: 11, callee_0
 | 
						|
  // CHECK-NEXT: 11, callee_1
 | 
						|
  INDIRECT_CALLSITE(CallSeqThreeTarget_4, 2);
 | 
						|
 | 
						|
  // CHECK-NEXT: 12, callee_0
 | 
						|
  INDIRECT_CALLSITE(CallSeqFourTarget_1, 1);
 | 
						|
 | 
						|
  // CHECK-NEXT: 13, callee_0
 | 
						|
  INDIRECT_CALLSITE(CallSeqFourTarget_2, 1);
 | 
						|
 | 
						|
  // CHECK-NEXT: 14, callee_0
 | 
						|
  INDIRECT_CALLSITE(CallSeqFourTarget_3, 1);
 | 
						|
 | 
						|
  // CHECK-NEXT: 15, callee_0
 | 
						|
  // CHECK-NEXT: 15, callee_3
 | 
						|
  INDIRECT_CALLSITE(CallSeqFourTarget_1, 2);
 | 
						|
 | 
						|
  // CHECK-NEXT: 16, callee_0
 | 
						|
  // CHECK-NEXT: 16, callee_3
 | 
						|
  INDIRECT_CALLSITE(CallSeqFourTarget_2, 2);
 | 
						|
 | 
						|
  // CHECK-NEXT: 17, callee_0
 | 
						|
  // CHECK-NEXT: 17, callee_3
 | 
						|
  INDIRECT_CALLSITE(CallSeqFourTarget_3, 2);
 | 
						|
 | 
						|
  // CHECK-NEXT: 18, callee_0
 | 
						|
  // CHECK-NEXT: 18, callee_3
 | 
						|
  // CHECK-NEXT: 18, callee_2
 | 
						|
  INDIRECT_CALLSITE(CallSeqFourTarget_1, 3);
 | 
						|
 | 
						|
  // CHECK-NEXT: 19, callee_0
 | 
						|
  // CHECK-NEXT: 19, callee_3
 | 
						|
  // CHECK-NEXT: 19, callee_2
 | 
						|
  INDIRECT_CALLSITE(CallSeqFourTarget_2, 3);
 | 
						|
 | 
						|
  // CHECK-NEXT: 20, callee_0
 | 
						|
  // CHECK-NEXT: 20, callee_3
 | 
						|
  // CHECK-NEXT: 20, callee_2
 | 
						|
  INDIRECT_CALLSITE(CallSeqFourTarget_3, 3);
 | 
						|
 | 
						|
  return 0;
 | 
						|
}
 |