; 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 16(%esp), %esi ; 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 16(%esp), %esi ; 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 }