1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-24 13:33:37 +02:00
llvm-mirror/test/CodeGen/X86/win64_sibcall.ll
Hans Wennborg 50bbc2de6d Win64: Don't use REX prefix for direct tail calls
The REX prefix should be used on indirect jmps, but not direct ones.
For direct jumps, the unwinder looks at the offset to determine if
it's inside the current function.

Differential Revision: https://reviews.llvm.org/D24359

llvm-svn: 281003
2016-09-08 23:35:10 +00:00

39 lines
1.1 KiB
LLVM

; 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: 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 }