summaryrefslogtreecommitdiff
path: root/test/CodeGen/X86/win64_alloca_dynalloca.ll
diff options
context:
space:
mode:
authorNAKAMURA Takumi <geek4civic@gmail.com>2011-03-24 07:07:00 +0000
committerNAKAMURA Takumi <geek4civic@gmail.com>2011-03-24 07:07:00 +0000
commita2e0762fae050464494a50c8b5d53ac2f4ba738c (patch)
tree64831b9b4df7f153028b5c258715f30613a86021 /test/CodeGen/X86/win64_alloca_dynalloca.ll
parentc37c539944874175c8f147fc7253506dfa8e6c3d (diff)
downloadllvm-a2e0762fae050464494a50c8b5d53ac2f4ba738c.tar.gz
llvm-a2e0762fae050464494a50c8b5d53ac2f4ba738c.tar.bz2
llvm-a2e0762fae050464494a50c8b5d53ac2f4ba738c.tar.xz
Target/X86: [PR8777][PR8778] Tweak alloca/chkstk for Windows targets.
FIXME: Some cleanups would be needed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@128206 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGen/X86/win64_alloca_dynalloca.ll')
-rw-r--r--test/CodeGen/X86/win64_alloca_dynalloca.ll74
1 files changed, 74 insertions, 0 deletions
diff --git a/test/CodeGen/X86/win64_alloca_dynalloca.ll b/test/CodeGen/X86/win64_alloca_dynalloca.ll
new file mode 100644
index 0000000000..87d632afa6
--- /dev/null
+++ b/test/CodeGen/X86/win64_alloca_dynalloca.ll
@@ -0,0 +1,74 @@
+; RUN: llc < %s -mtriple=x86_64-mingw32 | FileCheck %s -check-prefix=M64
+; RUN: llc < %s -mtriple=x86_64-win32 | FileCheck %s -check-prefix=W64
+; RUN: llc < %s -mtriple=x86_64-win32-macho | FileCheck %s -check-prefix=EFI
+; PR8777
+; PR8778
+
+define i64 @foo(i64 %n, i64 %x) nounwind {
+entry:
+
+ %buf0 = alloca i8, i64 4096, align 1
+
+; ___chkstk must adjust %rsp.
+; M64: movq %rsp, %rbp
+; M64: $4096, %rax
+; M64: callq ___chkstk
+; M64-NOT: %rsp
+
+; __chkstk does not adjust %rsp.
+; W64: movq %rsp, %rbp
+; W64: $4096, %rax
+; W64: callq __chkstk
+; W64: subq $4096, %rsp
+
+; Freestanding
+; EFI: movq %rsp, %rbp
+; EFI: $[[B0OFS:4096|4104]], %rsp
+; EFI-NOT: call
+
+ %buf1 = alloca i8, i64 %n, align 1
+
+; M64: leaq 15(%rcx), %rax
+; M64: andq $-16, %rax
+; M64: callq ___chkstk
+; M64-NOT: %rsp
+; M64: movq %rsp, %rax
+
+; W64: leaq 15(%rcx), %rax
+; W64: andq $-16, %rax
+; W64: callq __chkstk
+; W64: subq %rax, %rsp
+; W64: movq %rsp, %rax
+
+; EFI: leaq 15(%rcx), %rax
+; EFI: andq $-16, %rax
+; EFI: movq %rsp, [[R64:%r..]]
+; EFI: subq %rax, [[R64]]
+; EFI: movq [[R64]], %rsp
+
+ %r = call i64 @bar(i64 %n, i64 %x, i64 %n, i8* %buf0, i8* %buf1) nounwind
+
+; M64: subq $48, %rsp
+; M64: leaq -4096(%rbp), %r9
+; M64: movq %rax, 32(%rsp)
+; M64: callq bar
+
+; W64: subq $48, %rsp
+; W64: leaq -4096(%rbp), %r9
+; W64: movq %rax, 32(%rsp)
+; W64: callq bar
+
+; EFI: subq $48, %rsp
+; EFI: leaq -[[B0OFS]](%rbp), %r9
+; EFI: movq [[R64]], 32(%rsp)
+; EFI: callq _bar
+
+ ret i64 %r
+
+; M64: movq %rbp, %rsp
+
+; W64: movq %rbp, %rsp
+
+}
+
+declare i64 @bar(i64, i64, i64, i8* nocapture, i8* nocapture) nounwind