1# This test verifies the effect of -icp-inline option: that ICP is only 2# performed for call targets eligible for inlining. 3 4# The assembly was produced from C code compiled with clang-15 -O1 -S: 5 6# int foo(int x) { return x + 1; } 7# int bar(int x) { return x*100 + 42; } 8# typedef int (*const fn)(int); 9# fn funcs[] = { foo, bar }; 10# 11# int main(int argc, char *argv[]) { 12# fn func = funcs[argc]; 13# return func(0); 14# } 15 16# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown %s -o %t.o 17# RUN: link_fdata %s %t.o %t.fdata 18# RUN: llvm-strip --strip-unneeded %t.o 19# RUN: %clang %cflags %t.o -o %t.exe -Wl,-q -nostdlib -pie 20 21# Without -icp-inline option, ICP is performed 22# RUN: llvm-bolt %t.exe --icp=calls --icp-calls-topn=1 --inline-small-functions\ 23# RUN: -o /dev/null --lite=0 \ 24# RUN: --inline-small-functions-bytes=4 --print-icp --data %t.fdata \ 25# RUN: | FileCheck %s --check-prefix=CHECK-NO-ICP-INLINE 26# CHECK-NO-ICP-INLINE: Binary Function "main" after indirect-call-promotion 27# CHECK-NO-ICP-INLINE: callq bar 28# CHECK-NO-ICP-INLINE: End of Function "main" 29 30# With -icp-inline option, ICP is not performed (size of bar > inline threshold) 31# RUN: llvm-bolt %t.exe --icp=calls --icp-calls-topn=1 --inline-small-functions\ 32# RUN: -o /dev/null --lite=0 \ 33# RUN: --inline-small-functions-bytes=4 --icp-inline --print-icp \ 34# RUN: --data %t.fdata | FileCheck %s --check-prefix=CHECK-ICP-INLINE 35# CHECK-ICP-INLINE: Binary Function "main" after indirect-call-promotion 36# CHECK-ICP-INLINE: callq *(%rcx,%rax,8) 37# CHECK-ICP-INLINE-NOT: callq bar 38# CHECK-ICP-INLINE: End of Function "main" 39 .globl bar 40bar: 41 .cfi_startproc 42 imull $0x64, %edi, %eax 43 addl $0x2a, %eax 44 retq 45 .cfi_endproc 46.size bar, .-bar 47 48 .globl foo 49foo: 50 .cfi_startproc 51 leal 0x1(%rdi), %eax 52 retq 53 .cfi_endproc 54.size foo, .-foo 55 56 .globl main 57main: 58 .cfi_startproc 59 pushq %rax 60 .cfi_def_cfa_offset 16 61 movslq %edi, %rax 62 leaq funcs(%rip), %rcx 63 xorl %edi, %edi 64LBB00_br: 65 callq *(%rcx,%rax,8) 66# FDATA: 1 main #LBB00_br# 1 foo 0 0 1 67# FDATA: 1 main #LBB00_br# 1 bar 0 0 2 68 popq %rcx 69 .cfi_def_cfa_offset 8 70 retq 71 .cfi_endproc 72.size main, .-main 73 74 .data 75 .globl funcs 76funcs: 77 .quad foo 78 .quad bar 79