1; Firstly test uncompression(--compress-recursion=0)
2; RUN: llvm-profgen --perfscript=%S/Inputs/recursion-compression-pseudoprobe.perfscript --binary=%S/Inputs/recursion-compression-pseudoprobe.perfbin --output=%t --compress-recursion=0 --csprof-cold-thres=0
3; RUN: FileCheck %s --input-file %t -check-prefix=CHECK-UNCOMPRESS
4; RUN: llvm-profgen --perfscript=%S/Inputs/recursion-compression-pseudoprobe.perfscript --binary=%S/Inputs/recursion-compression-pseudoprobe.perfbin --output=%t --show-unwinder-output --csprof-cold-thres=0 | FileCheck %s --check-prefix=CHECK-UNWINDER
5; RUN: FileCheck %s --input-file %t
6
7; CHECK-UNCOMPRESS: [main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:6 @ fa]:4:1
8; CHECK-UNCOMPRESS:  1: 1
9; CHECK-UNCOMPRESS:  3: 1
10; CHECK-UNCOMPRESS:  5: 1
11; CHECK-UNCOMPRESS:  8: 1 fa:1
12; CHECK-UNCOMPRESS:  !CFGChecksum: 120515930909
13; CHECK-UNCOMPRESS: [main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:6 @ fa:8 @ fa]:4:1
14; CHECK-UNCOMPRESS:  1: 1
15; CHECK-UNCOMPRESS:  3: 1
16; CHECK-UNCOMPRESS:  4: 1
17; CHECK-UNCOMPRESS:  7: 1 fb:1
18; CHECK-UNCOMPRESS:  !CFGChecksum: 120515930909
19; CHECK-UNCOMPRESS: [main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:6 @ fa:8 @ fa:7 @ fb:6 @ fa]:4:1
20; CHECK-UNCOMPRESS:  1: 1
21; CHECK-UNCOMPRESS:  3: 1
22; CHECK-UNCOMPRESS:  4: 1
23; CHECK-UNCOMPRESS:  7: 1 fb:1
24; CHECK-UNCOMPRESS:  !CFGChecksum: 120515930909
25; CHECK-UNCOMPRESS: [main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb]:3:1
26; CHECK-UNCOMPRESS:  1: 1
27; CHECK-UNCOMPRESS:  2: 1
28; CHECK-UNCOMPRESS:  5: 1 fb:1
29; CHECK-UNCOMPRESS:  !CFGChecksum: 72617220756
30; CHECK-UNCOMPRESS: [main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb]:3:1
31; CHECK-UNCOMPRESS:  1: 1
32; CHECK-UNCOMPRESS:  2: 1
33; CHECK-UNCOMPRESS:  5: 1 fb:1
34; CHECK-UNCOMPRESS:  !CFGChecksum: 72617220756
35; CHECK-UNCOMPRESS: [main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb]:3:1
36; CHECK-UNCOMPRESS:  1: 1
37; CHECK-UNCOMPRESS:  2: 1
38; CHECK-UNCOMPRESS:  5: 1 fb:1
39; CHECK-UNCOMPRESS:  !CFGChecksum: 72617220756
40; CHECK-UNCOMPRESS: [main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb]:3:1
41; CHECK-UNCOMPRESS:  1: 1
42; CHECK-UNCOMPRESS:  3: 1
43; CHECK-UNCOMPRESS:  6: 1 fa:1
44; CHECK-UNCOMPRESS:  !CFGChecksum: 72617220756
45; CHECK-UNCOMPRESS: [main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:6 @ fa:8 @ fa:7 @ fb]:3:1
46; CHECK-UNCOMPRESS:  1: 1
47; CHECK-UNCOMPRESS:  3: 1
48; CHECK-UNCOMPRESS:  6: 1 fa:1
49; CHECK-UNCOMPRESS:  !CFGChecksum: 72617220756
50; CHECK-UNCOMPRESS: [main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:6 @ fa:8 @ fa:7 @ fb:6 @ fa:7 @ fb]:3:1
51; CHECK-UNCOMPRESS:  1: 1
52; CHECK-UNCOMPRESS:  3: 1
53; CHECK-UNCOMPRESS:  6: 1 fa:1
54; CHECK-UNCOMPRESS:  !CFGChecksum: 72617220756
55; CHECK-UNCOMPRESS: [main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb:6 @ fa:8 @ fa:7 @ fb:6 @ fa:7 @ fb:6 @ fa]:2:1
56; CHECK-UNCOMPRESS:  1: 1
57; CHECK-UNCOMPRESS:  3: 1
58; CHECK-UNCOMPRESS:  !CFGChecksum: 120515930909
59; CHECK-UNCOMPRESS: [main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:5 @ fb:5 @ fb:5 @ fb]:1:0
60; CHECK-UNCOMPRESS:  5: 1 fb:1
61; CHECK-UNCOMPRESS:  !CFGChecksum: 72617220756
62
63
64; CHECK: [main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb]:13:4
65; CHECK:  1: 4
66; CHECK:  2: 3
67; CHECK:  3: 1
68; CEHCK:  5: 4 fb:4
69; CHECK:  6: 1 fa:1
70; CHECK !CFGChecksum: 72617220756
71; CHECK: [main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6 @ fa:8 @ fa:7 @ fb:6 @ fa]:6:2
72; CHECK:  1: 2
73; CHECK:  3: 2
74; CHECK:  4: 1
75; CHECK:  7: 1 fb:1
76; CHECK:  !CFGChecksum: 120515930909
77; CHECK: [main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6 @ fa]:4:1
78; CHECK:  1: 1
79; CHECK:  3: 1
80; CHECK:  5: 1
81; CHECK:  8: 1 fa:1
82; CHECK:  !CFGChecksum: 120515930909
83; CHECK: [main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6 @ fa:8 @ fa]:4:1
84; CHECK:  1: 1
85; CHECK:  3: 1
86; CHECK:  4: 1
87; CHECK:  7: 1 fb:1
88; CHECK:  !CFGChecksum: 120515930909
89; CHECK: [main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6 @ fa:8 @ fa:7 @ fb]:3:1
90; CHECK:  1: 1
91; CHECK:  3: 1
92; CHECK:  6: 1 fa:1
93; CHECK:  !CFGChecksum: 72617220756
94; CHECK: [main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6 @ fa:8 @ fa:7 @ fb:6 @ fa:7 @ fb]:3:1
95; CHECK:  1: 1
96; CHECK:  3: 1
97; CHECK:  6: 1 fa:1
98; CHECK:  !CFGChecksum: 72617220756
99
100
101
102; CHECK-UNWINDER: Binary(recursion-compression-pseudoprobe.perfbin)'s Range Counter:
103; CHECK-UNWINDER: main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5
104; CHECK-UNWINDER:   (7a0, 7a7): 1
105; CHECK-UNWINDER:   (7a0, 7ab): 3
106; CHECK-UNWINDER:   (7b2, 7b5): 1
107; CHECK-UNWINDER: main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6
108; CHECK-UNWINDER:   (7c0, 7d4): 1
109; CHECK-UNWINDER: main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6 @ fa:8
110; CHECK-UNWINDER:   (7c0, 7cd): 1
111; CHECK-UNWINDER:   (7db, 7e0): 1
112; CHECK-UNWINDER: main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6 @ fa:8 @ fa:7
113; CHECK-UNWINDER:   (7a0, 7a7): 1
114; CHECK-UNWINDER:   (7b2, 7b5): 1
115; CHECK-UNWINDER: main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6 @ fa:8 @ fa:7 @ fb:6
116; CHECK-UNWINDER:   (7c0, 7cd): 2
117; CHECK-UNWINDER:   (7db, 7e0): 1
118; CHECK-UNWINDER: main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6 @ fa:8 @ fa:7 @ fb:6 @ fa:7
119; CHECK-UNWINDER:   (7a0, 7a7): 1
120; CHECK-UNWINDER:   (7b2, 7b5): 1
121
122; CHECK-UNWINDER: Binary(recursion-compression-pseudoprobe.perfbin)'s Branch Counter:
123; CHECK-UNWINDER: main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5
124; CHECK-UNWINDER:   (7a7, 7b2): 1
125; CHECK-UNWINDER:   (7ab, 7a0): 4
126; CHECK-UNWINDER:   (7b5, 7c0): 1
127; CHECK-UNWINDER: main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6
128; CHECK-UNWINDER:   (7d4, 7c0): 1
129; CHECK-UNWINDER: main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6 @ fa:8
130; CHECK-UNWINDER:   (7cd, 7db): 1
131; CHECK-UNWINDER:   (7e0, 7a0): 1
132; CHECK-UNWINDER: main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6 @ fa:8 @ fa:7
133; CHECK-UNWINDER:   (7a7, 7b2): 1
134; CHECK-UNWINDER:   (7b5, 7c0): 1
135; CHECK-UNWINDER: main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6 @ fa:8 @ fa:7 @ fb:6
136; CHECK-UNWINDER:   (7cd, 7db): 2
137; CHECK-UNWINDER:   (7e0, 7a0): 1
138; CHECK-UNWINDER: main:2 @ foo:5 @ fa:8 @ fa:7 @ fb:5 @ fb:6 @ fa:8 @ fa:7 @ fb:6 @ fa:7
139; CHECK-UNWINDER:   (7a7, 7b2): 1
140; CHECK-UNWINDER:   (7b5, 7c0): 1
141
142
143; clang -O3 -fexperimental-new-pass-manager -fuse-ld=lld -fpseudo-probe-for-profiling
144; -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -Xclang -mdisable-tail-calls
145; -g test.c  -o a.out
146
147#include <stdio.h>
148
149int fb(int n) {
150  if(n > 10) return fb(n / 2);
151  return fa(n - 1);
152}
153
154int fa(int n) {
155  if(n < 2) return n;
156  if(n % 2) return fb(n - 1);
157  return fa(n - 1);
158}
159
160void foo() {
161  int s, i = 0;
162  while (i++ < 10000)
163    s += fa(i);
164  printf("sum is %d\n", s);
165}
166
167int main() {
168  foo();
169  return 0;
170}
171