xref: /llvm-project/llvm/test/tools/llvm-profgen/inline-noprobe2.test (revision 467652486f24b9f33eca7b4aaa6cb1e8ec6d18a7)
1; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/artificial-branch.perfscript --binary=%S/Inputs/inline-noprobe2.perfbin --output=%t  --skip-symbolization --use-offset=0
2; RUN: FileCheck %s --input-file %t --check-prefix=CHECK-EXT-ADDR
3; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/inline-noprobe2.perfscript --binary=%S/Inputs/inline-noprobe2.perfbin --output=%t  --skip-symbolization --use-offset=0
4; RUN: FileCheck %s --input-file %t --check-prefix=CHECK-RAW-PROFILE
5; RUN: llvm-profgen --format=text --unsymbolized-profile=%t --binary=%S/Inputs/inline-noprobe2.perfbin --output=%t1 --use-offset=0
6; RUN: FileCheck %s --input-file %t1 --check-prefix=CHECK
7
8; RUN: llvm-profgen --format=extbinary --perfscript=%S/Inputs/inline-noprobe2.perfscript --binary=%S/Inputs/inline-noprobe2.perfbin --output=%t --populate-profile-symbol-list=1
9; RUN: llvm-profdata show -show-prof-sym-list -sample %t | FileCheck %s --check-prefix=CHECK-SYM-LIST
10
11; CHECK-EXT-ADDR:      2
12; CHECK-EXT-ADDR-NEXT: 400870-400870:2
13; CHECK-EXT-ADDR-NEXT: 400875-4008bf:1
14; CHECK-EXT-ADDR-NEXT: 2
15; Value 1 is external address
16; CHECK-EXT-ADDR-NEXT: 1->400875:1
17; CHECK-EXT-ADDR-NEXT: 4008bf->400870:2
18
19
20; CHECK-SYM-LIST: Dump profile symbol list
21; CHECK-SYM-LIST: main
22; CHECK-SYM-LIST: partition_pivot_first
23; CHECK-SYM-LIST: partition_pivot_last
24; CHECK-SYM-LIST: quick_sort
25; CHECK-SYM-LIST: swap
26
27
28;CHECK-RAW-PROFILE-NOT: 7f7448e889e4
29;CHECK-RAW-PROFILE-NOT: 7f7448e88826
30
31;CHECK: partition_pivot_first:3022:5
32;CHECK:  0: 5
33;CHECK:  1: 5
34;CHECK:  2: 5
35;CHECK:  3: 5
36;CHECK:  3.1: 83
37;CHECK:  4: 82
38;CHECK:  4.1: 26
39;CHECK:  4.2: 25
40;CHECK:  4.3: 26
41;CHECK:  5: 6
42;CHECK:  6: 6
43;CHECK:  65516: 5
44;CHECK:  4.2: swap:300
45;CHECK:   1: 25
46;CHECK:   2: 25
47;CHECK:   3: 25
48;CHECK:  5: swap:102
49;CHECK:   1: 6
50;CHECK:   2: 6
51;CHECK:   3: 6
52;CHECK: main:1362:0
53;CHECK:  0: 0
54;CHECK:  3: 0
55;CHECK:  4.1: 0
56;CHECK:  4.3: 0
57;CHECK:  5.1: 17
58;CHECK:  5.3: 17
59;CHECK:  6: 17
60;CHECK:  6.1: 17
61;CHECK:  6.3: 17
62;CHECK:  7: 0
63;CHECK:  8: 1 quick_sort:1
64;CHECK:  9: 0
65;CHECK:  11: 0
66;CHECK:  14: 0
67;CHECK:  65499: 0
68;CHECK: partition_pivot_last:1210:7
69;CHECK:  1: 6
70;CHECK:  2: 6
71;CHECK:  3: 6
72
73;w/o duplication factor :  3.1: 18
74;w/o duplication factor :  3.3: 18
75;w/o duplication factor :  4: 19
76;w/o duplication factor :  5: 9
77
78;CHECK:  3.1: 36
79;CHECK:  3.3: 36
80;CHECK:  4: 38
81;CHECK:  5: 18
82;CHECK:  6: 5
83;CHECK:  7: 5
84;CHECK:  65526: 2
85;CHECK:  5: swap:247
86
87;w/o duplication factor :  1: 9
88;w/o duplication factor :  2: 9
89;w/o duplication factor :  3: 9
90
91;CHECK:   1: 18
92;CHECK:   2: 18
93;CHECK:   3: 18
94;CHECK:  6: swap:85
95;CHECK:   1: 5
96;CHECK:   2: 5
97;CHECK:   3: 5
98;CHECK: quick_sort:903:25
99;CHECK:  1: 24
100;CHECK:  2: 12 partition_pivot_last:7 partition_pivot_first:5
101;CHECK:  3: 12 quick_sort:12
102;CHECK:  4: 12 quick_sort:12
103;CHECK:  6: 24
104;CHECK:  65507: 12
105
106
107
108; original code:
109; clang -O3 -g -fno-optimize-sibling-calls -fdebug-info-for-profiling qsort.c -o a.out
110#include <stdio.h>
111#include <stdlib.h>
112
113void swap(int *a, int *b) {
114	int t = *a;
115	*a = *b;
116	*b = t;
117}
118
119int partition_pivot_last(int* array, int low, int high) {
120	int pivot = array[high];
121	int i = low - 1;
122	for (int j = low; j < high; j++)
123		if (array[j] < pivot)
124			swap(&array[++i], &array[j]);
125	swap(&array[i + 1], &array[high]);
126	return (i + 1);
127}
128
129int partition_pivot_first(int* array, int low, int high) {
130	int pivot = array[low];
131	int i = low + 1;
132	for (int j = low + 1; j <= high; j++)
133		if (array[j] < pivot) { if (j != i) swap(&array[i], &array[j]); i++;}
134	swap(&array[i - 1], &array[low]);
135	return i - 1;
136}
137
138void quick_sort(int* array, int low, int high, int (*partition_func)(int *, int, int)) {
139	if (low < high) {
140		int pi = (*partition_func)(array, low, high);
141		quick_sort(array, low, pi - 1, partition_func);
142		quick_sort(array, pi + 1, high, partition_func);
143	}
144}
145
146int main() {
147	const int size = 200;
148	int sum = 0;
149	int *array = malloc(size * sizeof(int));
150	for(int i = 0; i < 100 * 1000; i++) {
151		for(int j = 0; j < size; j++)
152			array[j] = j % 10 ? rand() % size: j;
153		int (*fptr)(int *, int, int) = i % 3 ? partition_pivot_last : partition_pivot_first;
154		quick_sort(array, 0, size - 1, fptr);
155		sum += array[i % size];
156	}
157	printf("sum=%d\n", sum);
158
159	return 0;
160}
161