Closed
Description
Bugzilla Link | 8778 |
Resolution | FIXED |
Resolved on | Mar 28, 2011 00:25 |
Version | trunk |
OS | Windows XP |
Blocks | llvm/llvm-bugzilla-archive#9100 |
Reporter | LLVM Bugzilla Contributor |
Extended Description
define i64 @foo(i64 %n) nounwind {
entry:
%buf = alloca i8, i64 %n, align 1
%r = call i64 @bar(i8* %buf, i64 %n, i64 %n, i64 %n, i64 %n) nounwind
ret i64 %r
}
declare i64 @bar(i8* nocapture, i64, i64, i64, i64) nounwind
$ llc -mtriple=x86_64-win32
foo:
pushq %rbp
movq %rsp, %rbp
subq $32, %rsp
movq %rcx, %rdx
leaq 15(%rdx), %rax
andq $-16, %rax
movq %rsp, %rcx
subq %rax, %rcx ;;; @bar: 1st arg
movq %rcx, %rsp
subq $16, %rsp ;;; 40 (or aligned 48) bytes would be needed
movq %rdx, 32(%rsp) ;;; it might be on %buf
movq %rdx, %r8
movq %rdx, %r9
callq bar ;;; 32 bytes home area overlaps to %buf
movq %rbp, %rsp
popq %rbp
ret
Even when @bar() has args less than 4, stack frame would be incorrect.