16b4eb0b9SAmir Ayupov# Test BOLT does not crash by trying to change the direction of a JRCXZ 26b4eb0b9SAmir Ayupov 36b4eb0b9SAmir Ayupov# REQUIRES: system-linux 46b4eb0b9SAmir Ayupov 56b4eb0b9SAmir Ayupov# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown \ 66b4eb0b9SAmir Ayupov# RUN: %s -o %t.o 76b4eb0b9SAmir Ayupov# RUN: link_fdata %s %t.o %t.fdata 86b4eb0b9SAmir Ayupov# RUN: llvm-strip --strip-unneeded %t.o 9487570fbSAmir Ayupov# RUN: %clang %cflags -no-pie %t.o -o %t.exe -Wl,-q 10*d648aa1bSMaksim Panchenko# RUN: llvm-bolt %t.exe --relocs=1 --reorder-blocks=ext-tsp --print-finalized \ 11*d648aa1bSMaksim Panchenko# RUN: -o %t.out --data %t.fdata | FileCheck %s 126b4eb0b9SAmir Ayupov# RUN: %t.out 1 2 3 136b4eb0b9SAmir Ayupov 146b4eb0b9SAmir Ayupov# CHECK: BOLT-INFO 156b4eb0b9SAmir Ayupov 166b4eb0b9SAmir Ayupov .text 176b4eb0b9SAmir Ayupov .section .text.startup,"ax",@progbits 186b4eb0b9SAmir Ayupov .p2align 5,,31 196b4eb0b9SAmir Ayupov .globl main 206b4eb0b9SAmir Ayupov .type main, %function 216b4eb0b9SAmir Ayupovmain: 226b4eb0b9SAmir Ayupov jmp test_function 236b4eb0b9SAmir Ayupov 246b4eb0b9SAmir Ayupov.globl test_function 256b4eb0b9SAmir Ayupov.hidden test_function 266b4eb0b9SAmir Ayupov.type test_function,@function 276b4eb0b9SAmir Ayupov.align 32 286b4eb0b9SAmir Ayupovtest_function: 296b4eb0b9SAmir Ayupov# FDATA: 0 main 0 1 test_function 0 0 510 306b4eb0b9SAmir Ayupov xorq %rcx, %rcx 316b4eb0b9SAmir Ayupov andq $3, %rdi 326b4eb0b9SAmir Ayupov jmpq *jumptbl(,%rdi,8) 336b4eb0b9SAmir Ayupov 346b4eb0b9SAmir Ayupov# Here are the 4 possible targets of the indirect branch to simulate a simple 356b4eb0b9SAmir Ayupov# CFG. What is important here is that BB1, the first block, conditionally 366b4eb0b9SAmir Ayupov# transfers control to the exit block with JRCXZ (.J1). We create a mock profile 376b4eb0b9SAmir Ayupov# saying that this branch is taken more often than not, causing BOLT to try to 386b4eb0b9SAmir Ayupov# put the exit block after it, which would require us to change the direction 396b4eb0b9SAmir Ayupov# of JRCXZ. 406b4eb0b9SAmir Ayupov.BB1: 416b4eb0b9SAmir Ayupov movl $0x0, %eax 426b4eb0b9SAmir Ayupov.J1: 436b4eb0b9SAmir Ayupov jrcxz .BBend 446b4eb0b9SAmir Ayupov# FDATA: 1 test_function #.J1# 1 test_function #.BB2# 0 10 456b4eb0b9SAmir Ayupov# FDATA: 1 test_function #.J1# 1 test_function #.BBend# 0 500 466b4eb0b9SAmir Ayupov.BB2: 476b4eb0b9SAmir Ayupov movl $0x2, %eax 486b4eb0b9SAmir Ayupov jmp .BBend 496b4eb0b9SAmir Ayupov.Lbb3: 506b4eb0b9SAmir Ayupov movl $0x3, %eax 516b4eb0b9SAmir Ayupov jmp .BBend 526b4eb0b9SAmir Ayupov.Lbb4: 536b4eb0b9SAmir Ayupov movl $0x4, %eax 546b4eb0b9SAmir Ayupov.BBend: 556b4eb0b9SAmir Ayupov retq 566b4eb0b9SAmir Ayupov.Lend1: 576b4eb0b9SAmir Ayupov 586b4eb0b9SAmir Ayupov .section .rodata 596b4eb0b9SAmir Ayupov .globl jumptbl 606b4eb0b9SAmir Ayupovjumptbl: 616b4eb0b9SAmir Ayupov .quad .BB1 626b4eb0b9SAmir Ayupov .quad .BB2 636b4eb0b9SAmir Ayupov .quad .Lbb3 646b4eb0b9SAmir Ayupov .quad .Lbb4 65