llvm-project/llvm/test/CodeGen/X86/win64-byval.ll
Matt Arsenault 06c192d454 OpaquePtr: Bulk update tests to use typed byval
Upgrade of the IR text tests should be the only thing blocking making
typed byval mandatory. Partially done through regex and partially
manual.
2020-11-20 14:00:46 -05:00

63 lines
2.4 KiB
LLVM

; RUN: llc -mtriple x86_64-w64-mingw32 %s -o - | FileCheck %s
declare void @foo({ float, double }* byval({ float, double }))
@G = external constant { float, double }
define void @bar()
{
; Make sure we're creating a temporary stack slot, rather than just passing
; the pointer through unmodified.
; CHECK-LABEL: @bar
; CHECK: movq .refptr.G(%rip), %rax
; CHECK: movq (%rax), %rcx
; CHECK: movq 8(%rax), %rax
; CHECK: movq %rax, 40(%rsp)
; CHECK: movq %rcx, 32(%rsp)
; CHECK: leaq 32(%rsp), %rcx
call void @foo({ float, double }* byval({ float, double }) @G)
ret void
}
define void @baz({ float, double }* byval({ float, double }) %arg)
{
; On Win64 the byval is effectively ignored on declarations, since we do
; pass a real pointer in registers. However, by our semantics if we pass
; the pointer on to another byval function, we do need to make a copy.
; CHECK-LABEL: @baz
; CHECK: movq (%rcx), %rax
; CHECK: movq 8(%rcx), %rcx
; CHECK: movq %rcx, 40(%rsp)
; CHECK: movq %rax, 32(%rsp)
; CHECK: leaq 32(%rsp), %rcx
call void @foo({ float, double }* byval({ float, double }) %arg)
ret void
}
declare void @foo2({ float, double }* byval({ float, double }), { float, double }* byval({ float, double }), { float, double }* byval({ float, double }), { float, double }* byval({ float, double }), { float, double }* byval({ float, double }), i64 %f)
@data = external constant { float, double }
define void @test() {
; CHECK-LABEL: @test
; CHECK: movq (%rax), %rcx
; CHECK-NEXT: movq 8(%rax), %rax
; CHECK-NEXT: movq %rax, 120(%rsp)
; CHECK-NEXT: movq %rcx, 112(%rsp)
; CHECK-NEXT: movq %rcx, 96(%rsp)
; CHECK-NEXT: movq %rax, 104(%rsp)
; CHECK-NEXT: movq %rcx, 80(%rsp)
; CHECK-NEXT: movq %rax, 88(%rsp)
; CHECK-NEXT: movq %rcx, 64(%rsp)
; CHECK-NEXT: movq %rax, 72(%rsp)
; CHECK-NEXT: movq %rax, 56(%rsp)
; CHECK-NEXT: movq %rcx, 48(%rsp)
; CHECK-NEXT: leaq 48(%rsp), %rax
; CHECK-NEXT: movq %rax, 32(%rsp)
; CHECK-NEXT: movq $10, 40(%rsp)
; CHECK-NEXT: leaq 112(%rsp), %rcx
; CHECK-NEXT: leaq 96(%rsp), %rdx
; CHECK-NEXT: leaq 80(%rsp), %r8
; CHECK-NEXT: leaq 64(%rsp), %r9
call void @foo2({ float, double }* byval({ float, double }) @G, { float, double }* byval({ float, double }) @G, { float, double }* byval({ float, double }) @G, { float, double }* byval({ float, double }) @G, { float, double }* byval({ float, double }) @G, i64 10)
ret void
}