xref: /llvm-project/bolt/test/X86/split-func-jump-table-fragment-bidirection.s (revision 11791ae7b0b05b8bd8d806331ff51da618912cf8)
1*11791ae7SSayhaan Siddiqui## This reproduces an issue where two fragments of same function access same
2*11791ae7SSayhaan Siddiqui## jump table, which means at least one fragment visits the other, i.e., one
3*11791ae7SSayhaan Siddiqui## of them has split jump table. As a result, all of them will be marked as
4*11791ae7SSayhaan Siddiqui## non-simple function.
528b1dcb1SHuan Nguyen
628b1dcb1SHuan Nguyen# REQUIRES: system-linux
728b1dcb1SHuan Nguyen
828b1dcb1SHuan Nguyen# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown %s -o %t.o
928b1dcb1SHuan Nguyen# RUN: llvm-strip --strip-unneeded %t.o
1028b1dcb1SHuan Nguyen# RUN: %clang %cflags %t.o -o %t.exe -Wl,-q
1105523dc3SHuan Nguyen# RUN: llvm-bolt -print-cfg -v=3 %t.exe -o %t.out 2>&1 | FileCheck %s
1228b1dcb1SHuan Nguyen
1305523dc3SHuan Nguyen# CHECK: BOLT-INFO: Multiple fragments access same jump table: main; main.cold.1
1405523dc3SHuan Nguyen# CHECK: PIC Jump table JUMP_TABLE1 for function main, main.cold.1 at {{.*}}  with a total count of 0:
1528b1dcb1SHuan Nguyen
1628b1dcb1SHuan Nguyen  .text
1728b1dcb1SHuan Nguyen  .globl main
1828b1dcb1SHuan Nguyen  .type main, %function
1928b1dcb1SHuan Nguyen  .p2align 2
2028b1dcb1SHuan Nguyenmain:
2128b1dcb1SHuan NguyenLBB0:
2228b1dcb1SHuan Nguyen  andl $0xf, %ecx
2328b1dcb1SHuan Nguyen  cmpb $0x4, %cl
24*11791ae7SSayhaan Siddiqui  ## exit through ret
2528b1dcb1SHuan Nguyen  ja LBB3
2628b1dcb1SHuan Nguyen
27*11791ae7SSayhaan Siddiqui## jump table dispatch, jumping to label indexed by val in %ecx
2828b1dcb1SHuan NguyenLBB1:
2928b1dcb1SHuan Nguyen  leaq JUMP_TABLE1(%rip), %r8
3028b1dcb1SHuan Nguyen  movzbl %cl, %ecx
3128b1dcb1SHuan Nguyen  movslq (%r8,%rcx,4), %rax
3228b1dcb1SHuan Nguyen  addq %rax, %r8
3328b1dcb1SHuan Nguyen  jmpq *%r8
3428b1dcb1SHuan Nguyen
3528b1dcb1SHuan NguyenLBB2:
3628b1dcb1SHuan Nguyen  xorq %rax, %rax
3728b1dcb1SHuan NguyenLBB3:
3828b1dcb1SHuan Nguyen  addq $0x8, %rsp
3928b1dcb1SHuan Nguyen  ret
4028b1dcb1SHuan Nguyen.size main, .-main
4128b1dcb1SHuan Nguyen
42*11791ae7SSayhaan Siddiqui## cold fragment is only reachable
4328b1dcb1SHuan Nguyen  .globl main.cold.1
4428b1dcb1SHuan Nguyen  .type main.cold.1, %function
4528b1dcb1SHuan Nguyen  .p2align 2
4628b1dcb1SHuan Nguyenmain.cold.1:
47*11791ae7SSayhaan Siddiqui  ## load bearing nop: pad LBB8 so that it can't be treated
48*11791ae7SSayhaan Siddiqui  ## as __builtin_unreachable by analyzeJumpTable
4928b1dcb1SHuan Nguyen  nop
5028b1dcb1SHuan NguyenLBB4:
5128b1dcb1SHuan Nguyen  andl $0xb, %ebx
5228b1dcb1SHuan Nguyen  cmpb $0x1, %cl
5328b1dcb1SHuan Nguyen  # exit through ret
5428b1dcb1SHuan Nguyen  ja LBB7
5528b1dcb1SHuan Nguyen
56*11791ae7SSayhaan Siddiqui## jump table dispatch, jumping to label indexed by val in %ecx
5728b1dcb1SHuan NguyenLBB5:
5828b1dcb1SHuan Nguyen  leaq JUMP_TABLE1(%rip), %r8
5928b1dcb1SHuan Nguyen  movzbl %cl, %ecx
6028b1dcb1SHuan Nguyen  movslq (%r8,%rcx,4), %rax
6128b1dcb1SHuan Nguyen  addq %rax, %r8
6228b1dcb1SHuan Nguyen  jmpq *%r8
6328b1dcb1SHuan Nguyen
6428b1dcb1SHuan NguyenLBB6:
6528b1dcb1SHuan Nguyen  xorq %rax, %rax
6628b1dcb1SHuan NguyenLBB7:
6728b1dcb1SHuan Nguyen  addq $0x8, %rsp
6828b1dcb1SHuan Nguyen  ret
6928b1dcb1SHuan NguyenLBB8:
7028b1dcb1SHuan Nguyen  callq abort
7128b1dcb1SHuan Nguyen.size main.cold.1, .-main.cold.1
7228b1dcb1SHuan Nguyen
7328b1dcb1SHuan Nguyen  .rodata
74*11791ae7SSayhaan Siddiqui## jmp table, entries must be R_X86_64_PC32 relocs
7528b1dcb1SHuan Nguyen  .globl JUMP_TABLE1
7628b1dcb1SHuan NguyenJUMP_TABLE1:
7728b1dcb1SHuan Nguyen  .long LBB2-JUMP_TABLE1
7828b1dcb1SHuan Nguyen  .long LBB3-JUMP_TABLE1
7928b1dcb1SHuan Nguyen  .long LBB8-JUMP_TABLE1
8028b1dcb1SHuan Nguyen  .long LBB6-JUMP_TABLE1
8128b1dcb1SHuan Nguyen  .long LBB7-JUMP_TABLE1
82