97 lines · plain
1## Check that BOLT handles correctly folding functions with --icf=safe that can be referenced by non-control flow instructions.2## It invokes BOLT twice first testing CFG path, and second when functions have to be disassembled.3 4# REQUIRES: system-linux, asserts5# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %s -o %t1.o6# RUN: %clang %cflags %t1.o -o %t.exe -Wl,-q7# RUN: llvm-bolt --no-threads %t.exe --icf -debug-only=bolt-icf \8# RUN: -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s9# RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug-only=bolt-icf \10# RUN: -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s11# RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug-only=bolt-icf \12# RUN: --skip-funcs=helper1Func,main -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECKNOCFG %s13 14# ICFCHECK: ICF iteration 115# ICFCHECK-NEXT: folding barAddFunc into fooAddFunc16# ICFCHECK-NEXT: folding barSubFunc into fooSubFunc17 18# SAFEICFCHECK: skipping function with reference taken barAddFunc19# SAFEICFCHECK-NEXT: ICF iteration 120# SAFEICFCHECK-NEXT: folding barSubFunc into fooSubFunc21 22# SAFEICFCHECKNOCFG: skipping function with reference taken barAddFunc23# SAFEICFCHECKNOCFG-NEXT: ICF iteration 124# SAFEICFCHECKNOCFG-NEXT: folding barSubFunc into fooSubFunc25 26## clang++ -c main.cpp -o main.o27## extern int FooVar;28## extern int BarVar;29## [[clang::noinline]]30## int fooSub(int a, int b) {31## return a - b;32## }33## [[clang::noinline]]34## int barSub(int a, int b) {35## return a - b;36## }37## [[clang::noinline]]38## int fooAdd(int a, int b) {39## return a + b;40## }41## [[clang::noinline]]42## int barAdd(int a, int b) {43## return a + b;44## }45## int main(int argc, char **argv) {46## int temp = helper1(barAdd, FooVar, BarVar) +47## fooSub(FooVar, BarVar) +48## barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);49## return temp;50## }51 .globl fooSubFunc52 .type fooSubFunc,@function53fooSubFunc:54 subl -8(%rbp), %eax55 retq56 .size fooSubFunc, .-fooSubFunc57 58 .globl barSubFunc59 .type barSubFunc,@function60barSubFunc:61 subl -8(%rbp), %eax62 retq63 .size barSubFunc, .-barSubFunc64 65 .globl fooAddFunc66 .type fooAddFunc,@function67fooAddFunc:68 addl -8(%rbp), %eax69 retq70 .size fooAddFunc, .-fooAddFunc71 72 .globl barAddFunc73 .type barAddFunc,@function74barAddFunc:75 addl -8(%rbp), %eax76 retq77 .size barAddFunc, .-barAddFunc78 79 .globl helper1Func80 .type helper1Func,@function81helper1Func:82 leaq barAddFunc(%rip), %rax83 cmpq %rax, -16(%rbp)84 retq85 .size helper1Func, .-helper1Func86 87 .globl main88 .type main,@function89main:90 leaq barAddFunc(%rip), %rdi91 callq helper1Func92 callq fooSubFunc93 callq barSubFunc94 callq fooAddFunc95 retq96 .size main, .-main97