summaryrefslogtreecommitdiffstats
path: root/test/CodeGen/X86/thiscall-struct-return.ll
diff options
context:
space:
mode:
Diffstat (limited to 'test/CodeGen/X86/thiscall-struct-return.ll')
-rw-r--r--test/CodeGen/X86/thiscall-struct-return.ll47
1 files changed, 47 insertions, 0 deletions
diff --git a/test/CodeGen/X86/thiscall-struct-return.ll b/test/CodeGen/X86/thiscall-struct-return.ll
new file mode 100644
index 0000000..a7be483
--- /dev/null
+++ b/test/CodeGen/X86/thiscall-struct-return.ll
@@ -0,0 +1,47 @@
+; RUN: llc < %s -mtriple=i386-PC-Win32 | FileCheck %s
+
+%class.C = type { i8 }
+%struct.S = type { i32 }
+%struct.M = type { i32, i32 }
+
+declare void @_ZN1CC1Ev(%class.C* %this) unnamed_addr nounwind align 2
+declare x86_thiscallcc void @_ZNK1C5SmallEv(%struct.S* noalias sret %agg.result, %class.C* %this) nounwind align 2
+declare x86_thiscallcc void @_ZNK1C6MediumEv(%struct.M* noalias sret %agg.result, %class.C* %this) nounwind align 2
+
+define void @testv() nounwind {
+; CHECK: testv:
+; CHECK: leal
+; CHECK-NEXT: movl %esi, (%esp)
+; CHECK-NEXT: calll _ZN1CC1Ev
+; CHECK: leal 8(%esp), %eax
+; CHECK-NEXT: movl %esi, %ecx
+; CHECK-NEXT: calll _ZNK1C5SmallEv
+entry:
+ %c = alloca %class.C, align 1
+ %tmp = alloca %struct.S, align 4
+ call void @_ZN1CC1Ev(%class.C* %c)
+ ; This call should put the return structure as a pointer
+ ; into EAX instead of returning directly in EAX. The this
+ ; pointer should go into ECX
+ call x86_thiscallcc void @_ZNK1C5SmallEv(%struct.S* sret %tmp, %class.C* %c)
+ ret void
+}
+
+define void @test2v() nounwind {
+; CHECK: test2v:
+; CHECK: leal
+; CHECK-NEXT: movl %esi, (%esp)
+; CHECK-NEXT: calll _ZN1CC1Ev
+; CHECK: leal 8(%esp), %eax
+; CHECK-NEXT: movl %esi, %ecx
+; CHECK-NEXT: calll _ZNK1C6MediumEv
+entry:
+ %c = alloca %class.C, align 1
+ %tmp = alloca %struct.M, align 4
+ call void @_ZN1CC1Ev(%class.C* %c)
+ ; This call should put the return structure as a pointer
+ ; into EAX instead of returning directly in EAX/EDX. The this
+ ; pointer should go into ECX
+ call x86_thiscallcc void @_ZNK1C6MediumEv(%struct.M* sret %tmp, %class.C* %c)
+ ret void
+}
OpenPOWER on IntegriCloud