summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/X86/win64_sibcall.ll
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/CodeGen/X86/win64_sibcall.ll')
-rw-r--r--llvm/test/CodeGen/X86/win64_sibcall.ll38
1 files changed, 38 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/X86/win64_sibcall.ll b/llvm/test/CodeGen/X86/win64_sibcall.ll
new file mode 100644
index 00000000000..4001f638c2a
--- /dev/null
+++ b/llvm/test/CodeGen/X86/win64_sibcall.ll
@@ -0,0 +1,38 @@
+; RUN: llc < %s -mtriple=x86_64-pc-win32-coreclr | FileCheck %s -check-prefix=WIN_X64
+; RUN: llc < %s -mtriple=x86_64-pc-linux | FileCheck %s -check-prefix=LINUX
+
+%Object = type <{ [0 x i64*]* }>
+
+define void @C1(%Object addrspace(1)* %param0) gc "coreclr" {
+entry:
+
+; WIN_X64: # BB#0:
+; WIN_X64: pushq %rax
+; LINUX: # BB#0: # %entry
+; LINUX: movq $0, -8(%rsp)
+
+ %this = alloca %Object addrspace(1)*
+ store %Object addrspace(1)* null, %Object addrspace(1)** %this
+ store %Object addrspace(1)* %param0, %Object addrspace(1)** %this
+ br label %0
+
+; <label>:0 ; preds = %entry
+ %1 = load %Object addrspace(1)*, %Object addrspace(1)** %this, align 8
+
+; WIN_X64: xorl %r8d, %r8d
+; WIN_X64: popq %rax
+; WIN_X64: rex64 jmp C2 # TAILCALL
+; LINUX: xorl %edx, %edx
+; LINUX: jmp C2 # TAILCALL
+
+ tail call void @C2(%Object addrspace(1)* %1, i32 0, %Object addrspace(1)* null)
+ ret void
+}
+
+declare void @C2(%Object addrspace(1)*, i32, %Object addrspace(1)*)
+
+; Function Attrs: nounwind
+declare void @llvm.localescape(...) #0
+
+attributes #0 = { nounwind }
+
OpenPOWER on IntegriCloud