xref: /llvm-project/bolt/test/X86/shrinkwrapping-pop-order.s (revision 11791ae7b0b05b8bd8d806331ff51da618912cf8)
1## This test reproduces a POP reordering issue in shrink wrapping where we would
2## incorrectly put a store after a load (instead of before) when having multiple
3## insertions at the same point. Check that the order is correct in this test.
4
5# REQUIRES: system-linux
6
7# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown %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 %t.o -o %t.exe -Wl,-q -nostdlib
11# RUN: llvm-bolt %t.exe -o %t.out --data %t.fdata --frame-opt=all --lite=0 \
12# RUN:           --print-fop 2>&1 | FileCheck %s
13
14  .globl _start
15_start:
16    .cfi_startproc
17# FDATA: 0 [unknown] 0 1 _start 0 0 6
18    je a
19b:  jne _start
20# FDATA: 1 _start #b# 1 _start #c# 0 3
21
22c:
23  push  %rbx
24  push  %rbp
25  pop   %rbp
26  pop   %rbx
27
28## This basic block is treated as having 0 execution count.
29## push and pop will be sinked into this block.
30a:
31    ud2
32    .cfi_endproc
33
34
35## Check shrink wrapping results:
36# CHECK: BOLT-INFO: Shrink wrapping moved 0 spills inserting load/stores and 2 spills inserting push/pops
37# CHECK: BOLT-INFO: Shrink wrapping reduced 6 store executions (28.6% total instructions executed, 100.0% store instructions)
38# CHECK: BOLT-INFO: Shrink wrapping failed at reducing 0 store executions (0.0% total instructions executed, 0.0% store instructions)
39
40## Check that order is correct
41# CHECK:      Binary Function "_start" after frame-optimizer
42# Pushes are ordered according to their reg number and come first
43# CHECK:      pushq   %rbp
44# CHECK:      pushq   %rbx
45## Pops are ordered according to their dominance relation and come last
46# CHECK:      popq    %rbx
47# CHECK:      popq    %rbp
48