Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[BOLT] Fix shrink wrapping to check pops
Summary: Shrink wrapping has a mode where it will directly move push pop pairs, instead of replacing them with stores/loads. This is an ambitious mode that is triggered sometimes, but whenever matching with a push, it would operate with the assumption that the restoring instruction was a pop, not a load, otherwise it would assert. Fix this assertion to bail nicely back to non-pushpop mode (use regular store and load instructions). (cherry picked from FBD20085905)
- Loading branch information
1 parent
2df4e7b
commit 340da8f
Showing
6 changed files
with
104 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
# This reproduces a bug with shrink wrapping when trying to move | ||
# push-pops where restores were not validated to be POPs (and could be | ||
# a regular load, which violated our assumptions). Check that we | ||
# identify those cases. | ||
|
||
# REQUIRES: system-linux | ||
|
||
# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown \ | ||
# RUN: %s -o %t.o | ||
# RUN: link_fdata %s %t.o %t.fdata | ||
# Delete our BB symbols so BOLT doesn't mark them as entry points | ||
# RUN: strip --strip-unneeded %t.o | ||
# RUN: %host_cc %t.o -o %t.exe -Wl,-q | ||
|
||
# RUN: llvm-bolt %t.exe -relocs=1 -frame-opt=all -print-finalized \ | ||
# RUN: -print-only=main -data %t.fdata -o %t.out | FileCheck %s | ||
|
||
# RUN: %t.out | ||
|
||
# CHECK: BOLT-INFO: Shrink wrapping moved 1 spills inserting load/stores and 0 spills inserting push/pops | ||
|
||
.text | ||
.globl main | ||
.type main, %function | ||
.p2align 4 | ||
main: | ||
# FDATA: 0 [unknown] 0 1 main 0 0 510 | ||
pushq %rbp | ||
movq %rsp, %rbp | ||
pushq %rbx # We save rbx here, but there is an | ||
# opportunity to move it to .LBB2 | ||
subq $0x18, %rsp | ||
cmpl $0x2, %edi | ||
.J1: | ||
jb .BBend | ||
# FDATA: 1 main #.J1# 1 main #.BB2# 0 10 | ||
# FDATA: 1 main #.J1# 1 main #.BBend# 0 500 | ||
.BB2: | ||
movq $2, %rbx # Use rbx in a cold block | ||
xorq %rax, %rax | ||
movb mystring, %al | ||
addq %rbx, %rax | ||
movb %al, mystring | ||
leaq mystring, %rdi | ||
# Avoid making the actual call here to allow push-pop mode to operate | ||
# without fear of an unknown function that may require aligned stack | ||
# callq puts | ||
|
||
.BBend: | ||
mov -0x08(%rbp), %rbx # Original restore is here. Instead of a pop | ||
# we use a load to reproduce gcc behavior while | ||
# using leave in epilogue. Ordinarily it would | ||
# addq $0x18, %rsp followed by pop %rbx | ||
xorq %rax, %rax | ||
leaveq | ||
retq | ||
.size main, .-main | ||
|
||
.data | ||
mystring: .asciz "0 is rbx mod 10 contents in decimal\n" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
#!/bin/bash -e | ||
|
||
grep -e '^# FDATA:' < "$1" | cut -c10- > "$3" | ||
mapfile -t symbols < <(nm --defined-only "$2") | ||
|
||
for line in "${symbols[@]}"; do | ||
val=$(echo $line | cut -d' ' -f1) | ||
symname=$(echo $line | cut -d' ' -f3) | ||
if [ -z "$symname" ]; then | ||
continue | ||
fi | ||
if [ -z "${val##*[!0-9a-fA-F]*}" ]; then | ||
continue | ||
fi | ||
sed -i -e "s/\#${symname}\#/$val/g" $3 | ||
done |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters