Collect LLVM profile profiles with llvm-prof

I use these commands to compile the code below to collect front / block profiles in trunk-llvm:

clang -emit-llvm -c sort.c -o sort.bc opt -insert-edge-profiling sort.bc -o sort_prof.bc clang sort_prof.bc -lprofile_rt -L/llvms/lib -o sort_prof 

then I run the program and display the profiling information using llvm-prof sort_prof.bc, and the result:

 ===-------------------------------------------------------------------------=== Function execution frequencies: ## Frequency 1. 4.3e+05/708539 main 2. 2.8e+05/708539 quickSort NOTE: 2 functions were never executed! ..... 

My question is about frequencies of execution. Does any sense of basic execution 4.3e + 05 times? Why is that? The code I'm compiling is below.

 ###################### sort.c ######################## #include <stdio.h> #include <stdlib.h> #include <time.h> const int MAX = 1000000; void swap(int* a, int* b) { int tmp; tmp = *a; *a = *b; *b = tmp; } int partition(int vec[], int left, int right) { int i, j; i = left; for (j = left + 1; j <= right; ++j) { if (vec[j] < vec[left]) { ++i; swap(&vec[i], &vec[j]); } } swap(&vec[left], &vec[i]); return i; } void quickSort(int vec[], int left, int right) { int r; if (right > left) { r = partition(vec, left, right); quickSort(vec, left, r - 1); quickSort(vec, r + 1, right); } } int main(void) { int vet[MAX], i=0; srand(time(NULL)); for (i=0; i<MAX; i++) { vet[i] = rand() % 654321; } quickSort(vet, 0, MAX-1); for (i=0; i<MAX; i++) { if ((rand() % 7) > 2) { printf("Num$[%d] = %d\n", i, vet[i]); } else if ((rand() % 4) > 2) { printf(" Num@ [%d] = %d\n", i, vet[i]); } else if ((rand() % 2) > 1) { printf("Num#[%d] = %d\n", i, vet[i]); } } return 0; } 
+6
source share
1 answer

The problem was that I transferred the llvm-prof bitcode file using the toolkit, correctly using the source file (without tools):

 llvm-prof sort.bc 

Another problem associated with llvm-prof is that it rounds up the frequency of the function / block due to scientific notation. I sent the patch to llvm to fix this.

One more tip: llvm-prof by default only shows the top 20 most executable base blocks, and it does not provide the user with any means to change it. I introduced another patch that adds a command line parameter that allows the user to set the number of base blocks that he / she wants to output.

+5
source

All Articles