mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
c46660a5e0
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
35 lines
1.2 KiB
LLVM
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
|