brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · 45e23d1 Raw
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