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