Since total sample and body sample are used to compute hotness threshold in compiler, we found in some services changing the total samples computation will cause noticeable regression. Hence, here we will revert the changes and just keep all total samples number identical to the old tool. Three changes in this diff: 1. Revert previous diff(https://reviews.llvm.org/D112672: [llvm-profgen] Update total samples by accumulating all its body samples) and put it under a switch. 2. Keep the negative line number. Although compiler doesn't consume the count but it will be used to compute hot threshold. 3. Change to accumulate total samples per byte instead of per instruction. Reviewed By: hoy, wenlei Differential Revision: https://reviews.llvm.org/D115013
65 lines
2.3 KiB
Plaintext
65 lines
2.3 KiB
Plaintext
; RUN: llvm-profgen --format=text --unsymbolized-profile=%S/Inputs/profile-density.raw.prof --binary=%S/Inputs/inline-noprobe2.perfbin --output=%t1 --use-offset=0 --show-density -hot-function-density-threshold=10 --trim-cold-profile=0 &> %t2
|
|
; RUN: FileCheck %s --input-file %t2 --check-prefix=CHECK-DENSITY
|
|
|
|
; RUN: llvm-profgen --format=text --unsymbolized-profile=%S/Inputs/profile-density-cs.raw.prof --binary=%S/Inputs/inline-noprobe2.perfbin --output=%t3 --show-density -hot-function-density-threshold=1 &> %t4
|
|
; RUN: FileCheck %s --input-file %t4 --check-prefix=CHECK-DENSITY-CS
|
|
|
|
;CHECK-DENSITY: AutoFDO is estimated to optimize better with 3.1x more samples. Please consider increasing sampling rate or profiling for longer duration to get more samples.
|
|
;CHECK-DENSITY: Minimum profile density for hot functions with top 99.00% total samples: 3.2
|
|
|
|
;CHECK-DENSITY-CS: Minimum profile density for hot functions with top 99.00% total samples: 128.3
|
|
|
|
; original code:
|
|
; clang -O3 -g -fno-optimize-sibling-calls -fdebug-info-for-profiling qsort.c -o a.out
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
void swap(int *a, int *b) {
|
|
int t = *a;
|
|
*a = *b;
|
|
*b = t;
|
|
}
|
|
|
|
int partition_pivot_last(int* array, int low, int high) {
|
|
int pivot = array[high];
|
|
int i = low - 1;
|
|
for (int j = low; j < high; j++)
|
|
if (array[j] < pivot)
|
|
swap(&array[++i], &array[j]);
|
|
swap(&array[i + 1], &array[high]);
|
|
return (i + 1);
|
|
}
|
|
|
|
int partition_pivot_first(int* array, int low, int high) {
|
|
int pivot = array[low];
|
|
int i = low + 1;
|
|
for (int j = low + 1; j <= high; j++)
|
|
if (array[j] < pivot) { if (j != i) swap(&array[i], &array[j]); i++;}
|
|
swap(&array[i - 1], &array[low]);
|
|
return i - 1;
|
|
}
|
|
|
|
void quick_sort(int* array, int low, int high, int (*partition_func)(int *, int, int)) {
|
|
if (low < high) {
|
|
int pi = (*partition_func)(array, low, high);
|
|
quick_sort(array, low, pi - 1, partition_func);
|
|
quick_sort(array, pi + 1, high, partition_func);
|
|
}
|
|
}
|
|
|
|
int main() {
|
|
const int size = 200;
|
|
int sum = 0;
|
|
int *array = malloc(size * sizeof(int));
|
|
for(int i = 0; i < 100 * 1000; i++) {
|
|
for(int j = 0; j < size; j++)
|
|
array[j] = j % 10 ? rand() % size: j;
|
|
int (*fptr)(int *, int, int) = i % 3 ? partition_pivot_last : partition_pivot_first;
|
|
quick_sort(array, 0, size - 1, fptr);
|
|
sum += array[i % size];
|
|
}
|
|
printf("sum=%d\n", sum);
|
|
|
|
return 0;
|
|
}
|