summaryrefslogtreecommitdiff
path: root/test/profile
diff options
context:
space:
mode:
authorXinliang David Li <davidxl@google.com>2016-05-19 21:35:34 +0000
committerXinliang David Li <davidxl@google.com>2016-05-19 21:35:34 +0000
commit3106ed0cabc1642785d98fe3364e190fa3c53718 (patch)
tree6cf42a249af337734a2faba6b2aa1c45b3c5cd50 /test/profile
parent026203765237829cc13b5a3374c9eb6535507def (diff)
[profile] entry eviction support in value profiler
Differential revision: http://reviews.llvm.org/D20408 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@270141 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/profile')
-rw-r--r--test/profile/Inputs/instrprof-value-prof-evict.c141
-rw-r--r--test/profile/Inputs/instrprof-value-prof-real.c8
-rw-r--r--test/profile/instrprof-value-prof-evict.test10
3 files changed, 155 insertions, 4 deletions
diff --git a/test/profile/Inputs/instrprof-value-prof-evict.c b/test/profile/Inputs/instrprof-value-prof-evict.c
new file mode 100644
index 000000000..3b72e6e8a
--- /dev/null
+++ b/test/profile/Inputs/instrprof-value-prof-evict.c
@@ -0,0 +1,141 @@
+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;
+}
diff --git a/test/profile/Inputs/instrprof-value-prof-real.c b/test/profile/Inputs/instrprof-value-prof-real.c
index 7893b90d4..9ce6aeaa9 100644
--- a/test/profile/Inputs/instrprof-value-prof-real.c
+++ b/test/profile/Inputs/instrprof-value-prof-real.c
@@ -309,7 +309,7 @@ int main() {
// CHECK-NEXT: [ 0, foo_1_2_2_2_2_2_1_2_2, 749 ]
// CHECK-NEXT: [ 0, foo_1_2_2_2_2_2_2_1_1, 748 ]
// CHECK-NEXT: [ 0, foo_1_2_2_2_2_2_2_1_2, 747 ]
-// CHECK-NEXT: [ 0, foo_1_2_2_2_2_2_2_2_1, 746 ]
+// CHECK-NEXT: [ 0, foo
// CHECK-NEXT: [ 1, foo_2_2_2_2_2_2_2_2_2, 2000 ]
// CHECK-NEXT: [ 1, foo_2_2_2_2_2_2_2_2_1, 1999 ]
// CHECK-NEXT: [ 1, foo_2_2_2_2_2_2_2_1_2, 1998 ]
@@ -564,7 +564,7 @@ int main() {
// CHECK-NEXT: [ 1, foo_2_1_1_1_1_1_2_1_1, 1749 ]
// CHECK-NEXT: [ 1, foo_2_1_1_1_1_1_1_2_2, 1748 ]
// CHECK-NEXT: [ 1, foo_2_1_1_1_1_1_1_2_1, 1747 ]
-// CHECK-NEXT: [ 1, foo_2_1_1_1_1_1_1_1_2, 1746 ]
+// CHECK-NEXT: [ 1, foo
// SHARED-LABEL: shared_entry:
// SHARED: [ 0, foo_1_1_1_1_1_1_1_1_1, 1000 ]
@@ -821,7 +821,7 @@ int main() {
// SHARED-NEXT: [ 0, foo_1_2_2_2_2_2_1_2_2, 749 ]
// SHARED-NEXT: [ 0, foo_1_2_2_2_2_2_2_1_1, 748 ]
// SHARED-NEXT: [ 0, foo_1_2_2_2_2_2_2_1_2, 747 ]
-// SHARED-NEXT: [ 0, foo_1_2_2_2_2_2_2_2_1, 746 ]
+// SHARED-NEXT: [ 0, foo
// SHARED-NEXT: [ 1, foo_2_2_2_2_2_2_2_2_2, 2000 ]
// SHARED-NEXT: [ 1, foo_2_2_2_2_2_2_2_2_1, 1999 ]
// SHARED-NEXT: [ 1, foo_2_2_2_2_2_2_2_1_2, 1998 ]
@@ -1076,4 +1076,4 @@ int main() {
// SHARED-NEXT: [ 1, foo_2_1_1_1_1_1_2_1_1, 1749 ]
// SHARED-NEXT: [ 1, foo_2_1_1_1_1_1_1_2_2, 1748 ]
// SHARED-NEXT: [ 1, foo_2_1_1_1_1_1_1_2_1, 1747 ]
-// SHARED-NEXT: [ 1, foo_2_1_1_1_1_1_1_1_2, 1746 ]
+// SHARED-NEXT: [ 1, foo
diff --git a/test/profile/instrprof-value-prof-evict.test b/test/profile/instrprof-value-prof-evict.test
new file mode 100644
index 000000000..ac75d859a
--- /dev/null
+++ b/test/profile/instrprof-value-prof-evict.test
@@ -0,0 +1,10 @@
+// RUN: %clang_profgen -O2 -mllvm -enable-value-profiling=true -o %t %S/Inputs/instrprof-value-prof-evict.c
+// RUN: env LLVM_PROFILE_FILE=%t.profraw %run %t
+// RUN: llvm-profdata merge -o %t.profdata %t.profraw
+// RUN: llvm-profdata show --all-functions -ic-targets %t.profdata | FileCheck %S/Inputs/instrprof-value-prof-evict.c
+
+// IR level instrumentation
+// RUN: %clang_profgen -O2 -mllvm -disable-vp=false -Xclang -fprofile-instrument=llvm -o %t.ir %S/Inputs/instrprof-value-prof-evict.c
+// RUN: env LLVM_PROFILE_FILE=%t.ir.profraw %run %t.ir
+// RUN: llvm-profdata merge -o %t.ir.profdata %t.ir.profraw
+// RUN: llvm-profdata show --all-functions -ic-targets %t.ir.profdata | FileCheck %S/Inputs/instrprof-value-prof-evict.c