1; RUN: llc < %s -mtriple=i386-PC-Win32 | FileCheck %s 2 3%class.C = type { i8 } 4%struct.S = type { i32 } 5%struct.M = type { i32, i32 } 6 7declare void @_ZN1CC1Ev(%class.C* %this) unnamed_addr nounwind align 2 8declare x86_thiscallcc void @_ZNK1C5SmallEv(%struct.S* noalias sret %agg.result, %class.C* %this) nounwind align 2 9declare x86_thiscallcc void @_ZNK1C6MediumEv(%struct.M* noalias sret %agg.result, %class.C* %this) nounwind align 2 10 11define void @testv() nounwind { 12; CHECK: testv: 13; CHECK: leal 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 19entry: 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) 27 ret void 28} 29 30define void @test2v() nounwind { 31; CHECK: test2v: 32; CHECK: leal 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 38entry: 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) 46 ret void 47} 48