diff options
author | Lang Hames <lhames@gmail.com> | 2014-07-24 20:40:55 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2014-07-24 20:40:55 +0000 |
commit | f49bc3f1b19c24e4957bd3bc2dc08218f4707c55 (patch) | |
tree | 29cb46995b0d6d1ccbbd9f3f39b492f5b982fcce /llvm/test | |
parent | 9a412d13c14ec27bb99354bebf9a71f74bde2330 (diff) | |
download | bcm5719-llvm-f49bc3f1b19c24e4957bd3bc2dc08218f4707c55.tar.gz bcm5719-llvm-f49bc3f1b19c24e4957bd3bc2dc08218f4707c55.zip |
[X86] Optimize stackmap shadows on X86.
This patch minimizes the number of nops that must be emitted on X86 to satisfy
stackmap shadow constraints.
To minimize the number of nops inserted, the X86AsmPrinter now records the
size of the most recent stackmap's shadow in the StackMapShadowTracker class,
and tracks the number of instruction bytes emitted since the that stackmap
instruction was encountered. Padding is emitted (if it is required at all)
immediately before the next stackmap/patchpoint instruction, or at the end of
the basic block.
This optimization should reduce code-size and improve performance for people
using the llvm stackmap intrinsic on X86.
<rdar://problem/14959522>
llvm-svn: 213892
Diffstat (limited to 'llvm/test')
-rw-r--r-- | llvm/test/CodeGen/X86/stackmap-nops.ll | 1 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/stackmap-shadow-optimization.ll | 21 | ||||
-rw-r--r-- | llvm/test/MC/X86/stackmap-nops.ll | 1 |
3 files changed, 23 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/X86/stackmap-nops.ll b/llvm/test/CodeGen/X86/stackmap-nops.ll index 5a78f24d7b5..3888603c969 100644 --- a/llvm/test/CodeGen/X86/stackmap-nops.ll +++ b/llvm/test/CodeGen/X86/stackmap-nops.ll @@ -224,6 +224,7 @@ entry: tail call void (i64, i32, ...)* @llvm.experimental.stackmap(i64 28, i32 28) tail call void (i64, i32, ...)* @llvm.experimental.stackmap(i64 29, i32 29) tail call void (i64, i32, ...)* @llvm.experimental.stackmap(i64 30, i32 30) + tail call void (i64, i32, ...)* @llvm.experimental.stackmap(i64 31, i32 0) ret void } diff --git a/llvm/test/CodeGen/X86/stackmap-shadow-optimization.ll b/llvm/test/CodeGen/X86/stackmap-shadow-optimization.ll new file mode 100644 index 00000000000..63debe396b6 --- /dev/null +++ b/llvm/test/CodeGen/X86/stackmap-shadow-optimization.ll @@ -0,0 +1,21 @@ +; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7 -disable-fp-elim | FileCheck %s + +; Check that the X86 stackmap shadow optimization is only outputting a 1-byte +; nop here. 8-bytes are requested, but 7 are covered by the code for the call to +; bar, the frame teardown and the return. +define void @shadow_optimization_test() { +entry: +; CHECK-LABEL: shadow_optimization_test: +; CHECK: callq _bar +; CHECK-NOT: nop +; CHECK: callq _bar +; CHECK: retq +; CHECK: nop + call void @bar() + tail call void (i64, i32, ...)* @llvm.experimental.stackmap(i64 0, i32 8) + call void @bar() + ret void +} + +declare void @llvm.experimental.stackmap(i64, i32, ...) +declare void @bar()
\ No newline at end of file diff --git a/llvm/test/MC/X86/stackmap-nops.ll b/llvm/test/MC/X86/stackmap-nops.ll index 98d17ea6a62..2b0b88c80fa 100644 --- a/llvm/test/MC/X86/stackmap-nops.ll +++ b/llvm/test/MC/X86/stackmap-nops.ll @@ -41,6 +41,7 @@ entry: tail call void (i64, i32, ...)* @llvm.experimental.stackmap(i64 13, i32 13) tail call void (i64, i32, ...)* @llvm.experimental.stackmap(i64 14, i32 14) tail call void (i64, i32, ...)* @llvm.experimental.stackmap(i64 15, i32 15) + tail call void (i64, i32, ...)* @llvm.experimental.stackmap(i64 16, i32 0) ret void } |