xref: /llvm-project/bolt/test/runtime/meta-merge-fdata.test (revision 6678f602c243fe8a9c9db9d02b162f02ecec5173)
1d1df113eSAmir Ayupov# Meta test using merge-fdata binary
2d1df113eSAmir AyupovUNSUPPORTED: asan
3d1df113eSAmir Ayupov# Instrumentation currently only works on X86
4*6678f602SElvina YakubovaREQUIRES: x86_64-linux,bolt-runtime
5d1df113eSAmir Ayupov
6d1df113eSAmir Ayupov# Instrumentation, should test:
7d1df113eSAmir Ayupov# - Direct branches
8d1df113eSAmir Ayupov# - Unmapped calls coming from uninstrumented code (libc)
9d1df113eSAmir Ayupov# - Direct calls
10d648aa1bSMaksim PanchenkoRUN: llvm-bolt merge-fdata -o %t.inst --instrument \
11d648aa1bSMaksim PanchenkoRUN:   --instrumentation-file=%t.fdata
12d1df113eSAmir Ayupov
13d1df113eSAmir Ayupov# Execute with no input
14d1df113eSAmir AyupovRUN: %t.inst --version
15d1df113eSAmir AyupovRUN: mv %t.fdata %t.fdata1
16d1df113eSAmir Ayupov
17d1df113eSAmir Ayupov# Check unmapped calls coverage - libc should be calling _start via
18d1df113eSAmir Ayupov# uninstrumented code
19d1df113eSAmir AyupovRUN: cat %t.fdata1 | FileCheck %s --check-prefix=CHECK-FDATA
20d1df113eSAmir AyupovCHECK-FDATA: 0 [unknown] 0 1 _start 0 0 1
21d1df113eSAmir Ayupov
22d1df113eSAmir Ayupov# Check that BOLT works with this profile
23d648aa1bSMaksim PanchenkoRUN: llvm-bolt merge-fdata -o %t.bolt --data %t.fdata1 \
24d648aa1bSMaksim PanchenkoRUN:   --reorder-blocks=ext-tsp --reorder-functions=hfsort+ \
252dea832eSAmir AyupovRUN:   --split-functions 2>&1 \
26d648aa1bSMaksim PanchenkoRUN:   | FileCheck %s --check-prefix=CHECK-BOLT1
27d1df113eSAmir AyupovCHECK-BOLT1-NOT: invalid (possibly stale) profile
28d1df113eSAmir Ayupov
29d1df113eSAmir Ayupov# Execute again
30d1df113eSAmir AyupovRUN: %t.inst --help
31d1df113eSAmir AyupovRUN: mv %t.fdata %t.fdata2
32d1df113eSAmir Ayupov
33d1df113eSAmir Ayupov# Check profile coverage
34d1df113eSAmir AyupovRUN: llvm-boltdiff merge-fdata merge-fdata \
35d648aa1bSMaksim PanchenkoRUN:   --data %t.fdata1 --data2 %t.fdata2 --display-count=20 | \
36d1df113eSAmir AyupovRUN:   FileCheck %s --check-prefix=CHECK-BOLTDIFF
37d1df113eSAmir AyupovCHECK-BOLTDIFF: Inputs share [[#]] functions
38d1df113eSAmir Ayupov
39d1df113eSAmir Ayupov# Check that instrumented binary produces the same result
40d1df113eSAmir AyupovRUN: merge-fdata %t.fdata1 %t.fdata2 > %t.fdata.base
41d1df113eSAmir AyupovRUN: %t.inst %t.fdata1 %t.fdata2 > %t.fdata.inst
42d1df113eSAmir AyupovRUN: cmp %t.fdata.base %t.fdata.inst
43d1df113eSAmir Ayupov
44d1df113eSAmir Ayupov# Optimize using merged fdata
45d648aa1bSMaksim PanchenkoRUN: llvm-bolt merge-fdata -o %t.opt --data %t.fdata.base \
46d648aa1bSMaksim PanchenkoRUN:   --reorder-blocks=ext-tsp --reorder-functions=hfsort+ \
472dea832eSAmir AyupovRUN:   --split-functions 2>&1 \
48d648aa1bSMaksim PanchenkoRUN:   | FileCheck %s --check-prefix=CHECK-BOLT2
49d1df113eSAmir AyupovCHECK-BOLT2-NOT: invalid (possibly stale) profile
50d1df113eSAmir Ayupov
51d1df113eSAmir Ayupov# Check that optimized binary produces the same result
52d1df113eSAmir AyupovRUN: %t.opt %t.fdata1 %t.fdata2 > %t.fdata.opt
53d1df113eSAmir AyupovRUN: cmp %t.fdata.base %t.fdata.opt
54