cmake -G Ninja ../llvm -DLLVM_TARGETS_TO_BUILD="X86;AArch64" -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_ENABLE_PROJECTS="bolt" -DCMAKE_INSTALL_PREFIX=/home/apollo/install/llvm1818
ninja bolt
ninja install
export PATH=/home/prometheus/source-code/llvm-project-llvmorg-18.1.4/build-bolt/bin:$PATH
sort.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#define ARRAY_LEN 30000
static struct timeval tm1;
static inline void start() {
gettimeofday(&tm1, NULL);
}
static inline void stop() {
struct timeval tm2;
gettimeofday(&tm2, NULL);
unsigned long long t = 1000 * (tm2.tv_sec - tm1.tv_sec) +\
(tm2.tv_usec - tm1.tv_usec) / 1000;
printf("%llu ms\n", t);
}
void bubble_sort (int *a, int n) {
int i, t, s = 1;
while (s) {
s = 0;
for (i = 1; i < n; i++) {
if (a[i] < a[i - 1]) {
t = a[i];
a[i] = a[i - 1];
a[i - 1] = t;
s = 1;
}
}
}
}
void sort_array() {
printf("Bubble sorting array of %d elements\n", ARRAY_LEN);
int data[ARRAY_LEN], i;
for(i=0; i<ARRAY_LEN; ++i){
data[i] = rand();
}
bubble_sort(data, ARRAY_LEN);
}
int main(){
start();
sort_array();
stop();
return 0;
}
#!/bin/bash
gcc sort.c -O0 -g -Wl,--emit-relocs -o sort
gcc sort.c -O3 -g -Wl,--emit-relocs -o sort_optimized
perf record -e cycles -Fmax -j any,u -o perf.data -- ./sort_optimized
perf2bolt -p perf.data -o perf.fdata ./sort_optimized
llvm-bolt ./sort_optimized -o sort_bolt -data=perf.fdata -reorder-blocks=ext-tsp -reorder-functions=hfsort -split-functions -split-all-cold -split-eh -dyno-stats
./sort
./sort_optimized
./sort_bolt