1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-02-01 05:01:59 +01:00
llvm-mirror/test/CodeGen/AArch64/vararg-tallcall.ll
Reid Kleckner c46660a5e0 [AArch64] Preserve X8 for thunks ending in variadic musttail calls
Summary:
On Windows, X8 may be used to pass in the address of an aggregate that
is returned indirectly. Therefore, it should be forwarded to variadic
musttail calls and preserved in thunks.

Fixes PR41997

Reviewers: mgrang, efriedma

Subscribers: javed.absar, kristof.beyls, hiraditya, llvm-commits

Tags: #llvm

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

llvm-svn: 361585
2019-05-24 01:27:20 +00:00

35 lines
1.2 KiB
LLVM

; RUN: llc -mtriple=aarch64-windows-msvc %s -o - | FileCheck %s
; RUN: llc -mtriple=aarch64-linux-gnu %s -o - | FileCheck %s
target datalayout = "e-m:w-p:64:64-i32:32-i64:64-i128:128-n32:64-S128"
%class.X = type { i8 }
%struct.B = type { i32 (...)** }
$"??_9B@@$BA@AA" = comdat any
; Function Attrs: noinline optnone
define linkonce_odr void @"??_9B@@$BA@AA"(%struct.B* %this, ...) #1 comdat align 2 {
entry:
%this.addr = alloca %struct.B*, align 8
store %struct.B* %this, %struct.B** %this.addr, align 8
%this1 = load %struct.B*, %struct.B** %this.addr, align 8
call void asm sideeffect "", "~{d0}"()
%0 = bitcast %struct.B* %this1 to void (%struct.B*, ...)***
%vtable = load void (%struct.B*, ...)**, void (%struct.B*, ...)*** %0, align 8
%vfn = getelementptr inbounds void (%struct.B*, ...)*, void (%struct.B*, ...)** %vtable, i64 0
%1 = load void (%struct.B*, ...)*, void (%struct.B*, ...)** %vfn, align 8
musttail call void (%struct.B*, ...) %1(%struct.B* %this1, ...)
ret void
; No predecessors!
ret void
}
attributes #1 = { noinline optnone "thunk" }
; CHECK: mov v16.16b, v0.16b
; CHECK: ldr x9, [x0]
; CHECK: ldr x9, [x9]
; CHECK: mov v0.16b, v16.16b
; CHECK: br x9