xref: /llvm-project/bolt/test/X86/unreachable-jmp.s (revision 11791ae7b0b05b8bd8d806331ff51da618912cf8)
1## This checks that we don't create an invalid CFG when there is an
2## unreachable direct jump right after an indirect one.
3
4# REQUIRES: system-linux
5
6# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown \
7# RUN:   %s -o %t.o
8# RUN: link_fdata %s %t.o %t.fdata
9# RUN: llvm-strip --strip-unneeded %t.o
10# RUN: %clang %cflags -no-pie %t.o -o %t.exe -Wl,-q -nostdlib
11# RUN: llvm-bolt %t.exe -o %t.out --data %t.fdata \
12# RUN:     --eliminate-unreachable --print-cfg | FileCheck %s
13
14  .globl _start
15  .type _start, %function
16_start:
17  .cfi_startproc
18# FDATA: 0 [unknown] 0 1 _start 0 0 1
19  push  %rbp
20  mov   %rsp, %rbp
21  push  %rbx
22  push  %r14
23  subq  $0x20, %rsp
24  movq  %rdi, %rcx
25b:
26  jmpq  *JUMP_TABLE(,%rcx,8)
27# FDATA: 1 _start #b# 1 _start #hotpath# 0 20
28## Unreachable direct jump here. Our CFG should still make sense and properly
29## place this instruction in a new basic block.
30  jmp  .lbb2
31.lbb1:  je  .lexit
32.lbb2:
33  xorq  %rax, %rax
34  addq  $0x20, %rsp
35  pop %r14
36  pop %rbx
37  pop %rbp
38  ret
39hotpath:
40  movq  $2, %rax
41  addq  $0x20, %rsp
42  pop %r14
43  pop %rbx
44  pop %rbp
45  ret
46.lexit:
47  movq  $1, %rax
48  addq  $0x20, %rsp
49  pop %r14
50  pop %rbx
51  pop %rbp
52  ret
53  .cfi_endproc
54  .size _start, .-_start
55
56  .rodata
57  .globl JUMP_TABLE
58JUMP_TABLE:
59  .quad .lbb1
60  .quad .lbb2
61  .quad hotpath
62
63## No basic blocks above should have 4 successors! That is a bug.
64# CHECK-NOT:   Successors: {{.*}} (mispreds: 0, count: 20), {{.*}} (mispreds: 0, count: 0), {{.*}} (mispreds: 0, count: 0), {{.*}} (mispreds: 0, count: 0)
65# Check successful removal of stray direct jmp
66#  CHECK:  UCE removed 1 block
67