Skip to content

Commit 1de2336

Browse files
committed
Test that registers stay pinned across calls
1 parent ce678ec commit 1de2336

File tree

2 files changed

+56
-16
lines changed

2 files changed

+56
-16
lines changed

llvm/test/CodeGen/X86/preserve_nonecc_call.ll

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ define void @caller1(ptr %a) {
2727
; CHECK-NEXT: .cfi_offset %r13, -32
2828
; CHECK-NEXT: .cfi_offset %r14, -24
2929
; CHECK-NEXT: .cfi_offset %r15, -16
30+
; CHECK-NEXT: movq %rdi, %r12
3031
; CHECK-NEXT: callq callee@PLT
3132
; CHECK-NEXT: popq %rbx
3233
; CHECK-NEXT: .cfi_def_cfa_offset 40
@@ -61,17 +62,17 @@ define preserve_nonecc i64 @callee_with_many_param(i64 %a1, i64 %a2, i64 %a3, i6
6162
; CHECK: # %bb.0:
6263
; CHECK-NEXT: pushq %rax
6364
; CHECK-NEXT: .cfi_def_cfa_offset 16
65+
; CHECK-NEXT: movq %r13, %r12
66+
; CHECK-NEXT: movq %r14, %r13
67+
; CHECK-NEXT: movq %r15, %r14
68+
; CHECK-NEXT: movq %rdi, %r15
6469
; CHECK-NEXT: movq %rsi, %rdi
6570
; CHECK-NEXT: movq %rdx, %rsi
6671
; CHECK-NEXT: movq %rcx, %rdx
6772
; CHECK-NEXT: movq %r8, %rcx
6873
; CHECK-NEXT: movq %r9, %r8
6974
; CHECK-NEXT: movq %r11, %r9
70-
; CHECK-NEXT: movq %r12, %r11
71-
; CHECK-NEXT: movq %r13, %r12
72-
; CHECK-NEXT: movq %r14, %r13
73-
; CHECK-NEXT: movq %r15, %r14
74-
; CHECK-NEXT: movq %rax, %r15
75+
; CHECK-NEXT: movq %rax, %r11
7576
; CHECK-NEXT: callq callee_with_many_param2@PLT
7677
; CHECK-NEXT: popq %rcx
7778
; CHECK-NEXT: .cfi_def_cfa_offset 8
@@ -98,17 +99,17 @@ define i64 @caller3() {
9899
; CHECK-NEXT: .cfi_offset %r13, -32
99100
; CHECK-NEXT: .cfi_offset %r14, -24
100101
; CHECK-NEXT: .cfi_offset %r15, -16
101-
; CHECK-NEXT: movl $1, %edi
102-
; CHECK-NEXT: movl $2, %esi
103-
; CHECK-NEXT: movl $3, %edx
104-
; CHECK-NEXT: movl $4, %ecx
105-
; CHECK-NEXT: movl $5, %r8d
106-
; CHECK-NEXT: movl $6, %r9d
107-
; CHECK-NEXT: movl $7, %r11d
108-
; CHECK-NEXT: movl $8, %r12d
109-
; CHECK-NEXT: movl $9, %r13d
110-
; CHECK-NEXT: movl $10, %r14d
111-
; CHECK-NEXT: movl $11, %r15d
102+
; CHECK-NEXT: movl $1, %r12d
103+
; CHECK-NEXT: movl $2, %r13d
104+
; CHECK-NEXT: movl $3, %r14d
105+
; CHECK-NEXT: movl $4, %r15d
106+
; CHECK-NEXT: movl $5, %edi
107+
; CHECK-NEXT: movl $6, %esi
108+
; CHECK-NEXT: movl $7, %edx
109+
; CHECK-NEXT: movl $8, %ecx
110+
; CHECK-NEXT: movl $9, %r8d
111+
; CHECK-NEXT: movl $10, %r9d
112+
; CHECK-NEXT: movl $11, %r11d
112113
; CHECK-NEXT: movl $12, %eax
113114
; CHECK-NEXT: callq callee_with_many_param@PLT
114115
; CHECK-NEXT: popq %rbx
@@ -125,3 +126,20 @@ define i64 @caller3() {
125126
%ret = call preserve_nonecc i64 @callee_with_many_param(i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12)
126127
ret i64 %ret
127128
}
129+
130+
; Non-volatile registers are used to pass the first few parameters.
131+
declare void @boring()
132+
declare preserve_nonecc void @continuation(ptr, ptr, ptr, ptr)
133+
define preserve_nonecc void @entry(ptr %r12, ptr %r13, ptr %r14, ptr %r15) {
134+
; CHECK-LABEL: entry:
135+
; CHECK: # %bb.0:
136+
; CHECK-NEXT: pushq %rax
137+
; CHECK-NEXT: .cfi_def_cfa_offset 16
138+
; CHECK-NEXT: callq boring@PLT
139+
; CHECK-NEXT: popq %rax
140+
; CHECK-NEXT: .cfi_def_cfa_offset 8
141+
; CHECK-NEXT: jmp continuation@PLT # TAILCALL
142+
call void @boring()
143+
musttail call preserve_nonecc void @continuation(ptr %r12, ptr %r13, ptr %r14, ptr %r15)
144+
ret void
145+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2+
; RUN: llc -mtriple=x86_64-pc-windows-msvc -mcpu=corei7 < %s | FileCheck %s
3+
4+
5+
; Non-volatile registers are used to pass the first few parameters.
6+
declare void @boring()
7+
declare preserve_nonecc void @continuation(ptr, ptr, ptr, ptr, ptr, ptr)
8+
define preserve_nonecc void @entry(ptr %r12, ptr %r13, ptr %r14, ptr %r15, ptr %rdi, ptr %rsi) {
9+
; CHECK-LABEL: entry:
10+
; CHECK: # %bb.0:
11+
; CHECK-NEXT: subq $40, %rsp
12+
; CHECK-NEXT: .seh_stackalloc 40
13+
; CHECK-NEXT: .seh_endprologue
14+
; CHECK-NEXT: callq boring
15+
; CHECK-NEXT: nop
16+
; CHECK-NEXT: addq $40, %rsp
17+
; CHECK-NEXT: jmp continuation # TAILCALL
18+
; CHECK-NEXT: .seh_endproc
19+
call void @boring()
20+
musttail call preserve_nonecc void @continuation(ptr %r12, ptr %r13, ptr %r14, ptr %r15, ptr %rdi, ptr %rsi)
21+
ret void
22+
}

0 commit comments

Comments
 (0)