1 ; RUN: llc < %s -mtriple=i686-pc-win32 | FileCheck %s 2 3 %Foo = type { i32, i32 } 4 5 declare void @f(%Foo* inalloca %b) 6 7 define void @a() { 8 ; CHECK-LABEL: _a: 9 entry: 10 %b = alloca inalloca %Foo 11 ; CHECK: movl $8, %eax 12 ; CHECK: calll __chkstk 13 ; CHECK: movl %[[REG:[^,]*]], %esp 14 %f1 = getelementptr %Foo, %Foo* %b, i32 0, i32 0 15 %f2 = getelementptr %Foo, %Foo* %b, i32 0, i32 1 16 store i32 13, i32* %f1 17 store i32 42, i32* %f2 18 ; CHECK: movl $13, (%[[REG]]) 19 ; CHECK: movl $42, 4(%[[REG]]) 20 call void @f(%Foo* inalloca %b) 21 ; CHECK: calll _f 22 ret void 23 } 24 25 declare void @inreg_with_inalloca(i32 inreg %a, %Foo* inalloca %b) 26 27 define void @b() { 28 ; CHECK-LABEL: _b: 29 entry: 30 %b = alloca inalloca %Foo 31 ; CHECK: movl $8, %eax 32 ; CHECK: calll __chkstk 33 ; CHECK: movl %[[REG:[^,]*]], %esp 34 %f1 = getelementptr %Foo, %Foo* %b, i32 0, i32 0 35 %f2 = getelementptr %Foo, %Foo* %b, i32 0, i32 1 36 store i32 13, i32* %f1 37 store i32 42, i32* %f2 38 ; CHECK: movl $13, (%[[REG]]) 39 ; CHECK: movl $42, 4(%[[REG]]) 40 call void @inreg_with_inalloca(i32 inreg 1, %Foo* inalloca %b) 41 ; CHECK: movl $1, %eax 42 ; CHECK: calll _inreg_with_inalloca 43 ret void 44 } 45 46 declare x86_thiscallcc void @thiscall_with_inalloca(i8* %a, %Foo* inalloca %b) 47 48 define void @c() { 49 ; CHECK-LABEL: _c: 50 entry: 51 %b = alloca inalloca %Foo 52 ; CHECK: movl $8, %eax 53 ; CHECK: calll __chkstk 54 ; CHECK: movl %[[REG:[^,]*]], %esp 55 %f1 = getelementptr %Foo, %Foo* %b, i32 0, i32 0 56 %f2 = getelementptr %Foo, %Foo* %b, i32 0, i32 1 57 store i32 13, i32* %f1 58 store i32 42, i32* %f2 59 ; CHECK-DAG: movl $13, (%[[REG]]) 60 ; CHECK-DAG: movl $42, 4(%[[REG]]) 61 call x86_thiscallcc void @thiscall_with_inalloca(i8* null, %Foo* inalloca %b) 62 ; CHECK-DAG: xorl %ecx, %ecx 63 ; CHECK: calll _thiscall_with_inalloca 64 ret void 65 } 66