From 77b72fbc71638d5610923bcfae096ff308cd85e1 Mon Sep 17 00:00:00 2001 From: Amir Ayupov Date: Fri, 15 Jul 2022 20:41:03 -0700 Subject: [PATCH] [BOLT][TEST] Add icp-inline.s test Add a test for `-icp-inline` knob, which ensures that ICP is only performed for functions that can be subsequently inlined. Reviewed By: rafauler Differential Revision: https://reviews.llvm.org/D129803 --- bolt/test/X86/icp-inline.s | 78 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 bolt/test/X86/icp-inline.s diff --git a/bolt/test/X86/icp-inline.s b/bolt/test/X86/icp-inline.s new file mode 100644 index 0000000..318318f --- /dev/null +++ b/bolt/test/X86/icp-inline.s @@ -0,0 +1,78 @@ +# This test verifies the effect of -icp-inline option: that ICP is only +# performed for call targets eligible for inlining. + +# The assembly was produced from C code compiled with clang-15 -O1 -S: + +# int foo(int x) { return x + 1; } +# int bar(int x) { return x*100 + 42; } +# typedef int (*const fn)(int); +# fn funcs[] = { foo, bar }; +# +# int main(int argc, char *argv[]) { +# fn func = funcs[argc]; +# return func(0); +# } + +# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown %s -o %t.o +# RUN: link_fdata %s %t.o %t.fdata +# RUN: llvm-strip --strip-unneeded %t.o +# RUN: %clang %cflags %t.o -o %t.exe -Wl,-q -nostdlib -pie + +# Without -icp-inline option, ICP is performed +# RUN: llvm-bolt %t.exe --icp=calls --icp-calls-topn=1 --inline-small-functions\ +# RUN: -o /dev/null --lite=0 \ +# RUN: --inline-small-functions-bytes=4 --print-icp --data %t.fdata \ +# RUN: | FileCheck %s --check-prefix=CHECK-NO-ICP-INLINE +# CHECK-NO-ICP-INLINE: Binary Function "main" after indirect-call-promotion +# CHECK-NO-ICP-INLINE: callq bar +# CHECK-NO-ICP-INLINE: End of Function "main" + +# With -icp-inline option, ICP is not performed (size of bar > inline threshold) +# RUN: llvm-bolt %t.exe --icp=calls --icp-calls-topn=1 --inline-small-functions\ +# RUN: -o /dev/null --lite=0 \ +# RUN: --inline-small-functions-bytes=4 --icp-inline --print-icp \ +# RUN: --data %t.fdata | FileCheck %s --check-prefix=CHECK-ICP-INLINE +# CHECK-ICP-INLINE: Binary Function "main" after indirect-call-promotion +# CHECK-ICP-INLINE: callq *(%rcx,%rax,8) +# CHECK-ICP-INLINE-NOT: callq bar +# CHECK-ICP-INLINE: End of Function "main" + .globl bar +bar: + .cfi_startproc + imull $0x64, %edi, %eax + addl $0x2a, %eax + retq + .cfi_endproc +.size bar, .-bar + + .globl foo +foo: + .cfi_startproc + leal 0x1(%rdi), %eax + retq + .cfi_endproc +.size foo, .-foo + + .globl main +main: + .cfi_startproc + pushq %rax + .cfi_def_cfa_offset 16 + movslq %edi, %rax + leaq funcs(%rip), %rcx + xorl %edi, %edi +LBB00_br: + callq *(%rcx,%rax,8) +# FDATA: 1 main #LBB00_br# 1 foo 0 0 1 +# FDATA: 1 main #LBB00_br# 1 bar 0 0 2 + popq %rcx + .cfi_def_cfa_offset 8 + retq + .cfi_endproc +.size main, .-main + + .data + .globl funcs +funcs: + .quad foo + .quad bar -- 2.7.4