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