X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=test%2FCodeGen%2FX86%2Fwin64_alloca_dynalloca.ll;h=abda2272c6625803cf9dc845c7040f270244e14b;hb=d8b27b1cb14a2f6ce88505372ffc1eb9f5068efe;hp=cc11e4c28e212600d705ca7128f5bfaee37aa1d3;hpb=d56e7e198d858439c884dbd909ee58d15742d5be;p=oota-llvm.git diff --git a/test/CodeGen/X86/win64_alloca_dynalloca.ll b/test/CodeGen/X86/win64_alloca_dynalloca.ll index cc11e4c28e2..abda2272c66 100644 --- a/test/CodeGen/X86/win64_alloca_dynalloca.ll +++ b/test/CodeGen/X86/win64_alloca_dynalloca.ll @@ -1,28 +1,37 @@ -; RUN: llc < %s -mcpu=generic -mtriple=x86_64-mingw32 | FileCheck %s -check-prefix=M64 -; RUN: llc < %s -mcpu=generic -mtriple=x86_64-win32 | FileCheck %s -check-prefix=W64 -; RUN: llc < %s -mcpu=generic -mtriple=x86_64-win32-macho | FileCheck %s -check-prefix=EFI +; RUN: llc < %s -mcpu=generic -enable-misched=false -mtriple=x86_64-mingw32 | FileCheck %s -check-prefix=M64 +; RUN: llc < %s -mcpu=generic -enable-misched=false -mtriple=x86_64-win32 | FileCheck %s -check-prefix=W64 +; RUN: llc < %s -mcpu=generic -enable-misched=false -mtriple=x86_64-win32 -code-model=large | FileCheck %s -check-prefix=L64 +; RUN: llc < %s -mcpu=generic -enable-misched=false -mtriple=x86_64-win32-macho | FileCheck %s -check-prefix=EFI ; PR8777 ; PR8778 -define i64 @foo(i64 %n, i64 %x) nounwind { +define i64 @unaligned(i64 %n, i64 %x) nounwind { +; M64-LABEL: unaligned: +; W64-LABEL: unaligned: +; EFI-LABEL: unaligned: 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_ms does not adjust %rsp. +; M64: $4096, %eax +; M64: callq ___chkstk_ms +; M64: subq %rax, %rsp +; M64: leaq 128(%rsp), %rbp ; __chkstk does not adjust %rsp. -; W64: movq %rsp, %rbp -; W64: $4096, %rax +; W64: $4096, %eax ; W64: callq __chkstk -; W64: subq $4096, %rsp +; W64: subq %rax, %rsp +; W64: leaq 128(%rsp), %rbp + +; Use %r11 for the large model. +; L64: $4096, %eax +; L64: movabsq $__chkstk, %r11 +; L64: callq *%r11 +; L64: subq %rax, %rsp ; Freestanding -; EFI: movq %rsp, %rbp ; EFI: $[[B0OFS:4096|4104]], %rsp ; EFI-NOT: call @@ -30,8 +39,8 @@ entry: ; M64: leaq 15(%{{.*}}), %rax ; M64: andq $-16, %rax -; M64: callq ___chkstk -; M64-NOT: %rsp +; M64: callq ___chkstk_ms +; M64: subq %rax, %rsp ; M64: movq %rsp, %rax ; W64: leaq 15(%{{.*}}), %rax @@ -40,6 +49,13 @@ entry: ; W64: subq %rax, %rsp ; W64: movq %rsp, %rax +; L64: leaq 15(%{{.*}}), %rax +; L64: andq $-16, %rax +; L64: movabsq $__chkstk, %r11 +; L64: callq *%r11 +; L64: subq %rax, %rsp +; L64: movq %rsp, %rax + ; EFI: leaq 15(%{{.*}}), [[R1:%r.*]] ; EFI: andq $-16, [[R1]] ; EFI: movq %rsp, [[R64:%r.*]] @@ -49,26 +65,74 @@ entry: %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: leaq -128(%rbp), %r9 ; M64: callq bar ; W64: subq $48, %rsp -; W64: leaq -4096(%rbp), %r9 ; W64: movq %rax, 32(%rsp) +; W64: leaq -128(%rbp), %r9 ; W64: callq bar ; EFI: subq $48, %rsp -; EFI: leaq -[[B0OFS]](%rbp), %r9 ; EFI: movq [[R64]], 32(%rsp) +; EFI: leaq -[[B0OFS]](%rbp), %r9 ; EFI: callq _bar ret i64 %r -; M64: movq %rbp, %rsp +; M64: leaq 3968(%rbp), %rsp + +; W64: leaq 3968(%rbp), %rsp + +} + +define i64 @aligned(i64 %n, i64 %x) nounwind { +; M64-LABEL: aligned: +; W64-LABEL: aligned: +; EFI-LABEL: aligned: +entry: + + %buf1 = alloca i8, i64 %n, align 128 + +; M64: leaq 15(%{{.*}}), %rax +; M64: andq $-16, %rax +; M64: callq ___chkstk_ms +; M64: subq %rax, %rsp +; M64: movq %rsp, [[R2:%r.*]] +; M64: andq $-128, [[R2]] +; M64: movq [[R2]], %rsp + +; W64: leaq 15(%{{.*}}), %rax +; W64: andq $-16, %rax +; W64: callq __chkstk +; W64: subq %rax, %rsp +; W64: movq %rsp, [[R2:%r.*]] +; W64: andq $-128, [[R2]] +; W64: movq [[R2]], %rsp + +; EFI: leaq 15(%{{.*}}), [[R1:%r.*]] +; EFI: andq $-16, [[R1]] +; EFI: movq %rsp, [[R64:%r.*]] +; EFI: subq [[R1]], [[R64]] +; EFI: andq $-128, [[R64]] +; EFI: movq [[R64]], %rsp + + %r = call i64 @bar(i64 %n, i64 %x, i64 %n, i8* undef, i8* %buf1) nounwind + +; M64: subq $48, %rsp +; M64: movq [[R2]], 32(%rsp) +; M64: callq bar -; W64: movq %rbp, %rsp +; W64: subq $48, %rsp +; W64: movq [[R2]], 32(%rsp) +; W64: callq bar +; EFI: subq $48, %rsp +; EFI: movq [[R64]], 32(%rsp) +; EFI: callq _bar + + ret i64 %r } declare i64 @bar(i64, i64, i64, i8* nocapture, i8* nocapture) nounwind