1 ; RUN: llc < %s -mtriple=i386-PC-Win32 | FileCheck %s
4 %struct.S = type { i32 }
5 %struct.M = type { i32, i32 }
7 declare void @_ZN1CC1Ev(%class.C* %this) unnamed_addr nounwind align 2
8 declare x86_thiscallcc void @_ZNK1C5SmallEv(%struct.S* noalias sret %agg.result, %class.C* %this) nounwind align 2
9 declare x86_thiscallcc void @_ZNK1C6MediumEv(%struct.M* noalias sret %agg.result, %class.C* %this) nounwind align 2
11 define void @testv() nounwind {
14 ; CHECK-NEXT: movl %esi, (%esp)
15 ; CHECK-NEXT: calll _ZN1CC1Ev
16 ; CHECK: leal 8(%esp), %eax
17 ; CHECK-NEXT: movl %esi, %ecx
18 ; CHECK-NEXT: calll _ZNK1C5SmallEv
20 %c = alloca %class.C, align 1
21 %tmp = alloca %struct.S, align 4
22 call void @_ZN1CC1Ev(%class.C* %c)
23 ; This call should put the return structure as a pointer
24 ; into EAX instead of returning directly in EAX. The this
25 ; pointer should go into ECX
26 call x86_thiscallcc void @_ZNK1C5SmallEv(%struct.S* sret %tmp, %class.C* %c)
30 define void @test2v() nounwind {
33 ; CHECK-NEXT: movl %esi, (%esp)
34 ; CHECK-NEXT: calll _ZN1CC1Ev
35 ; CHECK: leal 8(%esp), %eax
36 ; CHECK-NEXT: movl %esi, %ecx
37 ; CHECK-NEXT: calll _ZNK1C6MediumEv
39 %c = alloca %class.C, align 1
40 %tmp = alloca %struct.M, align 4
41 call void @_ZN1CC1Ev(%class.C* %c)
42 ; This call should put the return structure as a pointer
43 ; into EAX instead of returning directly in EAX/EDX. The this
44 ; pointer should go into ECX
45 call x86_thiscallcc void @_ZNK1C6MediumEv(%struct.M* sret %tmp, %class.C* %c)