16b4eb0b9SAmir Ayupov# This reproduces a bug with shrink wrapping when trying to move 26b4eb0b9SAmir Ayupov# push-pops in a function where we are not allowed to modify the 36b4eb0b9SAmir Ayupov# stack layout for alignment reasons. In this bug, we failed to 46b4eb0b9SAmir Ayupov# propagate alignment requirement upwards in the call graph for 56b4eb0b9SAmir Ayupov# some functions when there is a cycle in the call graph. 66b4eb0b9SAmir Ayupov 76b4eb0b9SAmir Ayupov# REQUIRES: system-linux 86b4eb0b9SAmir Ayupov 96b4eb0b9SAmir Ayupov# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown \ 106b4eb0b9SAmir Ayupov# RUN: %s -o %t.o 116b4eb0b9SAmir Ayupov# RUN: link_fdata %s %t.o %t.fdata 126b4eb0b9SAmir Ayupov# Delete our BB symbols so BOLT doesn't mark them as entry points 136b4eb0b9SAmir Ayupov# RUN: llvm-strip --strip-unneeded %t.o 14487570fbSAmir Ayupov# RUN: %clang %cflags -no-pie %t.o -o %t.exe -Wl,-q 156b4eb0b9SAmir Ayupov 16*d648aa1bSMaksim Panchenko# RUN: llvm-bolt %t.exe --relocs=1 --frame-opt=all --print-finalized \ 17*d648aa1bSMaksim Panchenko# RUN: --lite=0 --print-only=main --data %t.fdata -o %t.out | FileCheck %s 186b4eb0b9SAmir Ayupov 196b4eb0b9SAmir Ayupov# RUN: %t.out 206b4eb0b9SAmir Ayupov 216b4eb0b9SAmir Ayupov# CHECK: BOLT-INFO: Shrink wrapping moved 1 spills inserting load/stores and 0 spills inserting push/pops 226b4eb0b9SAmir Ayupov 236b4eb0b9SAmir Ayupov .text 246b4eb0b9SAmir Ayupov .globl bar 256b4eb0b9SAmir Ayupov .type bar, %function 266b4eb0b9SAmir Ayupov .p2align 4 276b4eb0b9SAmir Ayupovbar: 286b4eb0b9SAmir Ayupov# FDATA: 0 [unknown] 0 1 bar 0 0 510 296b4eb0b9SAmir Ayupov pushq %rbp 306b4eb0b9SAmir Ayupov movq %rsp, %rbp 316b4eb0b9SAmir Ayupov pushq %rbx # We save rbx here, but there is an 326b4eb0b9SAmir Ayupov # opportunity to move it to .BB2 336b4eb0b9SAmir Ayupov subq $0x18, %rsp 346b4eb0b9SAmir Ayupov cmpl $0x2, %edi 356b4eb0b9SAmir Ayupov.J1: 366b4eb0b9SAmir Ayupov jb .BBend 376b4eb0b9SAmir Ayupov# FDATA: 1 bar #.J1# 1 bar #.BB2# 0 10 386b4eb0b9SAmir Ayupov# FDATA: 1 bar #.J1# 1 bar #.BBend# 0 500 396b4eb0b9SAmir Ayupov.BB2: 406b4eb0b9SAmir Ayupov movq $2, %rbx # Use rbx in a cold block 416b4eb0b9SAmir Ayupov xorq %rax, %rax 426b4eb0b9SAmir Ayupov movb mystring, %al 436b4eb0b9SAmir Ayupov addq %rbx, %rax 446b4eb0b9SAmir Ayupov movb %al, mystring 456b4eb0b9SAmir Ayupov leaq mystring, %rdi 466b4eb0b9SAmir Ayupov #callq puts 476b4eb0b9SAmir Ayupov 486b4eb0b9SAmir Ayupov.BBend: 496b4eb0b9SAmir Ayupov addq $0x18, %rsp 506b4eb0b9SAmir Ayupov pop %rbx # Restore 516b4eb0b9SAmir Ayupov xorq %rax, %rax 526b4eb0b9SAmir Ayupov cmpq $0x0, %rax 536b4eb0b9SAmir Ayupov jne .BBnever 546b4eb0b9SAmir Ayupov jmp .BBbarend 556b4eb0b9SAmir Ayupov.BBnever: 566b4eb0b9SAmir Ayupov # This is a path that is never executed, but we add a call to main here 576b4eb0b9SAmir Ayupov # to force a cycle in the call graph and to require us to have an aligned 586b4eb0b9SAmir Ayupov # stack 596b4eb0b9SAmir Ayupov callq main 606b4eb0b9SAmir Ayupov.BBbarend: 616b4eb0b9SAmir Ayupov leaveq 626b4eb0b9SAmir Ayupov retq 636b4eb0b9SAmir Ayupov .size bar, .-bar 646b4eb0b9SAmir Ayupov 656b4eb0b9SAmir Ayupov# Frame alignedness information needs to be transmitted from foo to main to bar 666b4eb0b9SAmir Ayupov .globl main 676b4eb0b9SAmir Ayupov .type main, %function 686b4eb0b9SAmir Ayupov .p2align 4 696b4eb0b9SAmir Ayupovmain: 706b4eb0b9SAmir Ayupov # Call a function that requires an aligned stack 716b4eb0b9SAmir Ayupov callq foo 726b4eb0b9SAmir Ayupov # Call a function that can be shrink-wrapped 736b4eb0b9SAmir Ayupov callq bar 746b4eb0b9SAmir Ayupov retq 756b4eb0b9SAmir Ayupov .size main, .-main 766b4eb0b9SAmir Ayupov 776b4eb0b9SAmir Ayupov# Frame alignedness information needs to be transmitted from foo to main to bar 786b4eb0b9SAmir Ayupov .globl foo 796b4eb0b9SAmir Ayupov .type foo, %function 806b4eb0b9SAmir Ayupov .p2align 4 816b4eb0b9SAmir Ayupovfoo: 826b4eb0b9SAmir Ayupov # Use an instruction that requires an aligned stack 836b4eb0b9SAmir Ayupov movdqa -0x10(%rsp), %xmm0 846b4eb0b9SAmir Ayupov retq 856b4eb0b9SAmir Ayupov .size foo, .-foo 866b4eb0b9SAmir Ayupov 876b4eb0b9SAmir Ayupov .data 886b4eb0b9SAmir Ayupovmystring: .asciz "0 is rbx mod 10 contents in decimal\n" 89