Upgrade of the IR text tests should be the only thing blocking making typed byval mandatory. Partially done through regex and partially manual.
63 lines
2.4 KiB
LLVM
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
|
|
}
|