Skip to content

[Win64] incorrect stack frame with alloca(n) and call #9150

Closed
@llvmbot

Description

@llvmbot
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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions