diff options
author | Elena Demikhovsky <elena.demikhovsky@intel.com> | 2013-10-14 07:26:51 +0000 |
---|---|---|
committer | Elena Demikhovsky <elena.demikhovsky@intel.com> | 2013-10-14 07:26:51 +0000 |
commit | 55240a5ddbaebc44c9acb0353c18a394b06f348f (patch) | |
tree | 7060de669bec65c5609de612ac288b5d13e668d7 /test | |
parent | f50045e90d347f9d7c951d46ad83b2369d1e3cb6 (diff) | |
download | external_llvm-55240a5ddbaebc44c9acb0353c18a394b06f348f.zip external_llvm-55240a5ddbaebc44c9acb0353c18a394b06f348f.tar.gz external_llvm-55240a5ddbaebc44c9acb0353c18a394b06f348f.tar.bz2 |
Fixed a bug in dynamic allocation memory on stack.
The alignment of allocated space was wrong, see Bugzila 17345.
Done by Zvi Rackover <zvi.rackover@intel.com>.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@192573 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r-- | test/CodeGen/Thumb2/2010-04-15-DynAllocBug.ll | 4 | ||||
-rw-r--r-- | test/CodeGen/X86/dyn_alloca_aligned.ll | 9 | ||||
-rw-r--r-- | test/CodeGen/X86/win64_alloca_dynalloca.ll | 52 |
3 files changed, 62 insertions, 3 deletions
diff --git a/test/CodeGen/Thumb2/2010-04-15-DynAllocBug.ll b/test/CodeGen/Thumb2/2010-04-15-DynAllocBug.ll index 486c064..1b8bdb1 100644 --- a/test/CodeGen/Thumb2/2010-04-15-DynAllocBug.ll +++ b/test/CodeGen/Thumb2/2010-04-15-DynAllocBug.ll @@ -8,10 +8,10 @@ define void @t() nounwind ssp { entry: ; CHECK-LABEL: t: %size = mul i32 8, 2 -; CHECK: subs r0, #16 +; CHECK: sub.w r0, sp, #16 ; CHECK: mov sp, r0 %vla_a = alloca i8, i32 %size, align 8 -; CHECK: subs r0, #16 +; CHECK: sub.w r0, sp, #16 ; CHECK: mov sp, r0 %vla_b = alloca i8, i32 %size, align 8 unreachable diff --git a/test/CodeGen/X86/dyn_alloca_aligned.ll b/test/CodeGen/X86/dyn_alloca_aligned.ll new file mode 100644 index 0000000..993f4d2 --- /dev/null +++ b/test/CodeGen/X86/dyn_alloca_aligned.ll @@ -0,0 +1,9 @@ +; RUN: llc -mtriple=x86_64-linux < %s | FileCheck %s +define i32 @A(i32 %Size) { +; CHECK: subq %rcx, %rax +; CHECK: andq $-128, %rax +; CHECK: movq %rax, %rsp + %A = alloca i8, i32 %Size, align 128 + %A_addr = ptrtoint i8* %A to i32 + ret i32 %A_addr +} diff --git a/test/CodeGen/X86/win64_alloca_dynalloca.ll b/test/CodeGen/X86/win64_alloca_dynalloca.ll index 275ebf9..9752edb 100644 --- a/test/CodeGen/X86/win64_alloca_dynalloca.ll +++ b/test/CodeGen/X86/win64_alloca_dynalloca.ll @@ -4,7 +4,10 @@ ; 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 @@ -71,4 +74,51 @@ entry: } +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 +; 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: 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 |