From 8a24e835504105efdf6d882053d5da7b0e1dccd3 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Fri, 31 Jan 2014 23:50:57 +0000 Subject: Implement inalloca codegen for x86 with the new inalloca design Calls with inalloca are lowered by skipping all stores for arguments passed in memory and the initial stack adjustment to allocate argument memory. Now the frontend is responsible for the memory layout, and the backend doesn't have to do any work. As a result these changes are pretty minimal. Reviewers: echristo Differential Revision: http://llvm-reviews.chandlerc.com/D2637 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200596 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/CodeGen/X86/inalloca.ll | 65 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 test/CodeGen/X86/inalloca.ll (limited to 'test/CodeGen/X86/inalloca.ll') diff --git a/test/CodeGen/X86/inalloca.ll b/test/CodeGen/X86/inalloca.ll new file mode 100644 index 0000000000..84d694a1fb --- /dev/null +++ b/test/CodeGen/X86/inalloca.ll @@ -0,0 +1,65 @@ +; RUN: llc < %s -mtriple=i686-pc-win32 | FileCheck %s + +%Foo = type { i32, i32 } + +declare void @f(%Foo* inalloca %b) + +define void @a() { +; CHECK-LABEL: _a: +entry: + %b = alloca %Foo, inalloca +; CHECK: movl $8, %eax +; CHECK: calll __chkstk +; CHECK: movl %[[REG:[^,]*]], %esp + %f1 = getelementptr %Foo* %b, i32 0, i32 0 + %f2 = getelementptr %Foo* %b, i32 0, i32 1 + store i32 13, i32* %f1 + store i32 42, i32* %f2 +; CHECK: movl $13, (%[[REG]]) +; CHECK: movl $42, 4(%[[REG]]) + call void @f(%Foo* inalloca %b) +; CHECK: calll _f + ret void +} + +declare void @inreg_with_inalloca(i32 inreg %a, %Foo* inalloca %b) + +define void @b() { +; CHECK-LABEL: _b: +entry: + %b = alloca %Foo, inalloca +; CHECK: movl $8, %eax +; CHECK: calll __chkstk +; CHECK: movl %[[REG:[^,]*]], %esp + %f1 = getelementptr %Foo* %b, i32 0, i32 0 + %f2 = getelementptr %Foo* %b, i32 0, i32 1 + store i32 13, i32* %f1 + store i32 42, i32* %f2 +; CHECK: movl $13, (%[[REG]]) +; CHECK: movl $42, 4(%[[REG]]) + call void @inreg_with_inalloca(i32 inreg 1, %Foo* inalloca %b) +; CHECK: movl $1, %eax +; CHECK: calll _inreg_with_inalloca + ret void +} + +declare x86_thiscallcc void @thiscall_with_inalloca(i8* %a, %Foo* inalloca %b) + +define void @c() { +; CHECK-LABEL: _c: +entry: + %b = alloca %Foo, inalloca +; CHECK: movl $8, %eax +; CHECK: calll __chkstk +; CHECK: movl %[[REG:[^,]*]], %esp + %f1 = getelementptr %Foo* %b, i32 0, i32 0 + %f2 = getelementptr %Foo* %b, i32 0, i32 1 + store i32 13, i32* %f1 + store i32 42, i32* %f2 +; CHECK: movl $13, (%[[REG]]) +; CHECK: movl $42, 4(%[[REG]]) + call x86_thiscallcc void @thiscall_with_inalloca(i8* null, %Foo* inalloca %b) +; CHECK: xorl %ecx, %ecx +; CHECK: calll _thiscall_with_inalloca + ret void +} -- cgit v1.2.3