summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/CodeGen/X86/stackmap-liveness.ll178
-rw-r--r--llvm/test/CodeGen/X86/stackmap.ll68
2 files changed, 212 insertions, 34 deletions
diff --git a/llvm/test/CodeGen/X86/stackmap-liveness.ll b/llvm/test/CodeGen/X86/stackmap-liveness.ll
new file mode 100644
index 00000000000..b1a931dd7c4
--- /dev/null
+++ b/llvm/test/CodeGen/X86/stackmap-liveness.ll
@@ -0,0 +1,178 @@
+; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7-avx -disable-fp-elim | FileCheck %s
+; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7-avx -disable-fp-elim -enable-stackmap-liveness| FileCheck -check-prefix=STACK %s
+; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7-avx -disable-fp-elim -enable-patchpoint-liveness| FileCheck -check-prefix=PATCH %s
+;
+; Note: Print verbose stackmaps using -debug-only=stackmaps.
+
+; CHECK-LABEL: .section __LLVM_STACKMAPS,__llvm_stackmaps
+; CHECK-NEXT: __LLVM_StackMaps:
+; CHECK-NEXT: .long 0
+; Num LargeConstants
+; CHECK-NEXT: .long 0
+; Num Callsites
+; CHECK-NEXT: .long 5
+define void @stackmap_liveness() {
+entry:
+ %a1 = call <2 x double> asm sideeffect "", "={xmm2}"() nounwind
+; StackMap 1 (no liveness information available)
+; CHECK-LABEL: .long L{{.*}}-_stackmap_liveness
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
+; Num LiveOut Entries: 0
+; CHECK-NEXT: .short 0
+
+; StackMap 1 (stackmap liveness information enabled)
+; STACK-LABEL: .long L{{.*}}-_stackmap_liveness
+; STACK-NEXT: .short 0
+; STACK-NEXT: .short 0
+; Num LiveOut Entries: 2
+; STACK-NEXT: .short 2
+; LiveOut Entry 1: %RSP (8 bytes)
+; STACK-NEXT: .short 7
+; STACK-NEXT: .byte 0
+; STACK-NEXT: .byte 8
+; LiveOut Entry 2: %YMM2 (16 bytes) --> %XMM2
+; STACK-NEXT: .short 19
+; STACK-NEXT: .byte 0
+; STACK-NEXT: .byte 16
+
+; StackMap 1 (patchpoint liveness information enabled)
+; PATCH-LABEL: .long L{{.*}}-_stackmap_liveness
+; PATCH-NEXT: .short 0
+; PATCH-NEXT: .short 0
+; Num LiveOut Entries: 0
+; PATCH-NEXT: .short 0
+ call void (i64, i32, ...)* @llvm.experimental.stackmap(i64 1, i32 5)
+ %a2 = call i64 asm sideeffect "", "={r8}"() nounwind
+ %a3 = call i8 asm sideeffect "", "={ah}"() nounwind
+ %a4 = call <4 x double> asm sideeffect "", "={ymm0}"() nounwind
+ %a5 = call <4 x double> asm sideeffect "", "={ymm1}"() nounwind
+
+; StackMap 2 (no liveness information available)
+; CHECK-LABEL: .long L{{.*}}-_stackmap_liveness
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
+; Num LiveOut Entries: 0
+; CHECK-NEXT: .short 0
+
+; StackMap 2 (stackmap liveness information enabled)
+; STACK-LABEL: .long L{{.*}}-_stackmap_liveness
+; STACK-NEXT: .short 0
+; STACK-NEXT: .short 0
+; Num LiveOut Entries: 6
+; STACK-NEXT: .short 6
+; LiveOut Entry 2: %RAX (1 bytes) --> %AL or %AH
+; STACK-NEXT: .short 0
+; STACK-NEXT: .byte 0
+; STACK-NEXT: .byte 1
+; LiveOut Entry 2: %RSP (8 bytes)
+; STACK-NEXT: .short 7
+; STACK-NEXT: .byte 0
+; STACK-NEXT: .byte 8
+; LiveOut Entry 2: %R8 (8 bytes)
+; STACK-NEXT: .short 8
+; STACK-NEXT: .byte 0
+; STACK-NEXT: .byte 8
+; LiveOut Entry 2: %YMM0 (32 bytes)
+; STACK-NEXT: .short 17
+; STACK-NEXT: .byte 0
+; STACK-NEXT: .byte 32
+; LiveOut Entry 2: %YMM1 (32 bytes)
+; STACK-NEXT: .short 18
+; STACK-NEXT: .byte 0
+; STACK-NEXT: .byte 32
+; LiveOut Entry 2: %YMM2 (16 bytes) --> %XMM2
+; STACK-NEXT: .short 19
+; STACK-NEXT: .byte 0
+; STACK-NEXT: .byte 16
+
+; StackMap 2 (patchpoint liveness information enabled)
+; PATCH-LABEL: .long L{{.*}}-_stackmap_liveness
+; PATCH-NEXT: .short 0
+; PATCH-NEXT: .short 0
+; Num LiveOut Entries: 0
+; PATCH-NEXT: .short 0
+ call void (i64, i32, ...)* @llvm.experimental.stackmap(i64 2, i32 5)
+ call void asm sideeffect "", "{r8},{ah},{ymm0},{ymm1}"(i64 %a2, i8 %a3, <4 x double> %a4, <4 x double> %a5) nounwind
+
+; StackMap 3 (no liveness information available)
+; CHECK-LABEL: .long L{{.*}}-_stackmap_liveness
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 0
+; Num LiveOut Entries: 0
+; CHECK-NEXT: .short 0
+
+; StackMap 3 (stackmap liveness information enabled)
+; STACK-LABEL: .long L{{.*}}-_stackmap_liveness
+; STACK-NEXT: .short 0
+; STACK-NEXT: .short 0
+; Num LiveOut Entries: 2
+; STACK-NEXT: .short 2
+; LiveOut Entry 2: %RSP (8 bytes)
+; STACK-NEXT: .short 7
+; STACK-NEXT: .byte 0
+; STACK-NEXT: .byte 8
+; LiveOut Entry 2: %YMM2 (16 bytes) --> %XMM2
+; STACK-NEXT: .short 19
+; STACK-NEXT: .byte 0
+; STACK-NEXT: .byte 16
+
+; StackMap 3 (patchpoint liveness information enabled)
+; PATCH-LABEL: .long L{{.*}}-_stackmap_liveness
+; PATCH-NEXT: .short 0
+; PATCH-NEXT: .short 0
+; Num LiveOut Entries: 0
+; PATCH-NEXT: .short 0
+ call void (i64, i32, ...)* @llvm.experimental.stackmap(i64 3, i32 5)
+ call void asm sideeffect "", "{xmm2}"(<2 x double> %a1) nounwind
+ ret void
+}
+
+define void @mixed_liveness() {
+entry:
+ %a1 = call <2 x double> asm sideeffect "", "={xmm2}"() nounwind
+; StackMap 4 (stackmap liveness information enabled)
+; STACK-LABEL: .long L{{.*}}-_mixed_liveness
+; STACK-NEXT: .short 0
+; STACK-NEXT: .short 0
+; Num LiveOut Entries: 1
+; STACK-NEXT: .short 1
+; LiveOut Entry 1: %YMM2 (16 bytes) --> %XMM2
+; STACK-NEXT: .short 19
+; STACK-NEXT: .byte 0
+; STACK-NEXT: .byte 16
+; StackMap 5 (stackmap liveness information enabled)
+; STACK-LABEL: .long L{{.*}}-_mixed_liveness
+; STACK-NEXT: .short 0
+; STACK-NEXT: .short 0
+; Num LiveOut Entries: 0
+; STACK-NEXT: .short 0
+
+; StackMap 4 (patchpoint liveness information enabled)
+; PATCH-LABEL: .long L{{.*}}-_mixed_liveness
+; PATCH-NEXT: .short 0
+; PATCH-NEXT: .short 0
+; Num LiveOut Entries: 0
+; PATCH-NEXT: .short 0
+; StackMap 5 (patchpoint liveness information enabled)
+; PATCH-LABEL: .long L{{.*}}-_mixed_liveness
+; PATCH-NEXT: .short 0
+; PATCH-NEXT: .short 0
+; Num LiveOut Entries: 2
+; PATCH-NEXT: .short 2
+; LiveOut Entry 1: %RSP (8 bytes)
+; PATCH-NEXT: .short 7
+; PATCH-NEXT: .byte 0
+; PATCH-NEXT: .byte 8
+; LiveOut Entry 1: %YMM2 (16 bytes) --> %XMM2
+; PATCH-NEXT: .short 19
+; PATCH-NEXT: .byte 0
+; PATCH-NEXT: .byte 16
+ call void (i64, i32, ...)* @llvm.experimental.stackmap(i64 4, i32 5)
+ call anyregcc void (i64, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.void(i64 5, i32 0, i8* null, i32 0)
+ call void asm sideeffect "", "{xmm2}"(<2 x double> %a1) nounwind
+ ret void
+}
+
+declare void @llvm.experimental.stackmap(i64, i32, ...)
+declare void @llvm.experimental.patchpoint.void(i64, i32, i8*, i32, ...)
diff --git a/llvm/test/CodeGen/X86/stackmap.ll b/llvm/test/CodeGen/X86/stackmap.ll
index e0cb7589c4f..e4194adfaa4 100644
--- a/llvm/test/CodeGen/X86/stackmap.ll
+++ b/llvm/test/CodeGen/X86/stackmap.ll
@@ -183,15 +183,15 @@ entry:
;
; Verify 17 stack map entries.
;
-; CHECK-LABEL:.long L{{.*}}-_spilledValue
-; CHECK-NEXT: .short 0
-; CHECK-NEXT: .short 17
+; CHECK-LABEL: .long L{{.*}}-_spilledValue
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 17
;
; Check that at least one is a spilled entry from RBP.
; Location: Indirect RBP + ...
-; CHECK: .byte 3
-; CHECK-NEXT: .byte 8
-; CHECK-NEXT: .short 6
+; CHECK: .byte 3
+; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .short 6
define void @spilledValue(i64 %arg0, i64 %arg1, i64 %arg2, i64 %arg3, i64 %arg4, i64 %l0, i64 %l1, i64 %l2, i64 %l3, i64 %l4, i64 %l5, i64 %l6, i64 %l7, i64 %l8, i64 %l9, i64 %l10, i64 %l11, i64 %l12, i64 %l13, i64 %l14, i64 %l15, i64 %l16) {
entry:
call void (i64, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.void(i64 11, i32 15, i8* null, i32 5, i64 %arg0, i64 %arg1, i64 %arg2, i64 %arg3, i64 %arg4, i64 %l0, i64 %l1, i64 %l2, i64 %l3, i64 %l4, i64 %l5, i64 %l6, i64 %l7, i64 %l8, i64 %l9, i64 %l10, i64 %l11, i64 %l12, i64 %l13, i64 %l14, i64 %l15, i64 %l16)
@@ -202,15 +202,15 @@ entry:
;
; Verify 17 stack map entries.
;
-; CHECK-LABEL: .long L{{.*}}-_spilledStackMapValue
-; CHECK-NEXT: .short 0
-; CHECK-NEXT: .short 17
+; CHECK-LABEL: .long L{{.*}}-_spilledStackMapValue
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .short 17
;
; Check that at least one is a spilled entry from RBP.
; Location: Indirect RBP + ...
-; CHECK: .byte 3
-; CHECK-NEXT: .byte 8
-; CHECK-NEXT: .short 6
+; CHECK: .byte 3
+; CHECK-NEXT: .byte 8
+; CHECK-NEXT: .short 6
define webkit_jscc void @spilledStackMapValue(i64 %l0, i64 %l1, i64 %l2, i64 %l3, i64 %l4, i64 %l5, i64 %l6, i64 %l7, i64 %l8, i64 %l9, i64 %l10, i64 %l11, i64 %l12, i64 %l13, i64 %l14, i64 %l15, i64 %l16) {
entry:
call void (i64, i32, ...)* @llvm.experimental.stackmap(i64 12, i32 15, i64 %l0, i64 %l1, i64 %l2, i64 %l3, i64 %l4, i64 %l5, i64 %l6, i64 %l7, i64 %l8, i64 %l9, i64 %l10, i64 %l11, i64 %l12, i64 %l13, i64 %l14, i64 %l15, i64 %l16)
@@ -219,16 +219,16 @@ entry:
; Spill a subregister stackmap operand.
;
-; CHECK-LABEL: .long L{{.*}}-_spillSubReg
-; CHECK-NEXT: .short 0
+; CHECK-LABEL: .long L{{.*}}-_spillSubReg
+; CHECK-NEXT: .short 0
; 4 locations
-; CHECK-NEXT: .short 1
+; CHECK-NEXT: .short 1
;
; Check that the subregister operand is a 4-byte spill.
; Location: Indirect, 4-byte, RBP + ...
-; CHECK: .byte 3
-; CHECK-NEXT: .byte 4
-; CHECK-NEXT: .short 6
+; CHECK: .byte 3
+; CHECK-NEXT: .byte 4
+; CHECK-NEXT: .short 6
define void @spillSubReg(i64 %arg) #0 {
bb:
br i1 undef, label %bb1, label %bb2
@@ -259,23 +259,23 @@ bb61:
; Map a single byte subregister. There is no DWARF register number, so
; we expect the register to be encoded with the proper size and spill offset. We don't know which
;
-; CHECK-LABEL: .long L{{.*}}-_subRegOffset
-; CHECK-NEXT: .short 0
+; CHECK-LABEL: .long L{{.*}}-_subRegOffset
+; CHECK-NEXT: .short 0
; 2 locations
-; CHECK-NEXT: .short 2
+; CHECK-NEXT: .short 2
;
; Check that the subregister operands are 1-byte spills.
; Location 0: Register, 4-byte, AL
-; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .short 0
-; CHECK-NEXT: .long 0
+; CHECK-NEXT: .byte 1
+; CHECK-NEXT: .byte 1
+; CHECK-NEXT: .short 0
+; CHECK-NEXT: .long 0
;
; Location 1: Register, 4-byte, BL
-; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .byte 1
-; CHECK-NEXT: .short 3
-; CHECK-NEXT: .long 0
+; CHECK-NEXT: .byte 1
+; CHECK-NEXT: .byte 1
+; CHECK-NEXT: .short 3
+; CHECK-NEXT: .long 0
define void @subRegOffset(i16 %arg) {
%v = mul i16 %arg, 5
%a0 = trunc i16 %v to i8
@@ -289,10 +289,10 @@ define void @subRegOffset(i16 %arg) {
; Map a constant value.
;
-; CHECK-LABEL: .long L{{.*}}-_liveConstant
-; CHECK-NEXT: .short 0
+; CHECK-LABEL: .long L{{.*}}-_liveConstant
+; CHECK-NEXT: .short 0
; 1 location
-; CHECK-NEXT: .short 1
+; CHECK-NEXT: .short 1
; Loc 0: SmallConstant
; CHECK-NEXT: .byte 4
; CHECK-NEXT: .byte 8
@@ -316,9 +316,9 @@ define void @liveConstant() {
; CHECK-NEXT: .byte 8
; CHECK-NEXT: .short 6
; CHECK-NEXT: .long
-; CHECK-NEXT: .quad
+
; Callsite 17
-; CHECK-NEXT: .long L{{.*}}-_directFrameIdx
+; CHECK-LABEL: .long L{{.*}}-_directFrameIdx
; CHECK-NEXT: .short 0
; 2 locations
; CHECK-NEXT: .short 2
OpenPOWER on IntegriCloud