mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-16 11:30:51 +00:00
e95985d3a0
Stack realignment occurs after the prolog, not during, for Win64. Because of this, don't factor in the maximum stack alignment when establishing a frame pointer. This fixes PR22572. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230113 91177308-0d34-0410-b5e6-96231b3b80d8
123 lines
3.5 KiB
LLVM
123 lines
3.5 KiB
LLVM
; RUN: llc < %s -mtriple=x86_64-pc-win32 | FileCheck %s
|
|
|
|
define i32 @f1(i32 %p1, i32 %p2, i32 %p3, i32 %p4, i32 %p5) "no-frame-pointer-elim"="true" {
|
|
; CHECK-LABEL: f1:
|
|
; CHECK: movl 48(%rbp), %eax
|
|
ret i32 %p5
|
|
}
|
|
|
|
define void @f2(i32 %p, ...) "no-frame-pointer-elim"="true" {
|
|
; CHECK-LABEL: f2:
|
|
; CHECK: .seh_stackalloc 8
|
|
; CHECK: leaq (%rsp), %rbp
|
|
; CHECK: .seh_setframe 5, 0
|
|
; CHECK: movq %rdx, 32(%rbp)
|
|
; CHECK: leaq 32(%rbp), %rax
|
|
%ap = alloca i8, align 8
|
|
call void @llvm.va_start(i8* %ap)
|
|
ret void
|
|
}
|
|
|
|
define i8* @f3() "no-frame-pointer-elim"="true" {
|
|
; CHECK-LABEL: f3:
|
|
; CHECK: leaq (%rsp), %rbp
|
|
; CHECK: .seh_setframe 5, 0
|
|
; CHECK: movq 8(%rbp), %rax
|
|
%ra = call i8* @llvm.returnaddress(i32 0)
|
|
ret i8* %ra
|
|
}
|
|
|
|
define i8* @f4() "no-frame-pointer-elim"="true" {
|
|
; CHECK-LABEL: f4:
|
|
; CHECK: pushq %rbp
|
|
; CHECK: .seh_pushreg 5
|
|
; CHECK: subq $304, %rsp
|
|
; CHECK: .seh_stackalloc 304
|
|
; CHECK: leaq 128(%rsp), %rbp
|
|
; CHECK: .seh_setframe 5, 128
|
|
; CHECK: .seh_endprologue
|
|
; CHECK: movq 184(%rbp), %rax
|
|
alloca [300 x i8]
|
|
%ra = call i8* @llvm.returnaddress(i32 0)
|
|
ret i8* %ra
|
|
}
|
|
|
|
declare void @external(i8*)
|
|
|
|
define void @f5() "no-frame-pointer-elim"="true" {
|
|
; CHECK-LABEL: f5:
|
|
; CHECK: subq $336, %rsp
|
|
; CHECK: .seh_stackalloc 336
|
|
; CHECK: leaq 128(%rsp), %rbp
|
|
; CHECK: .seh_setframe 5, 128
|
|
; CHECK: leaq -92(%rbp), %rcx
|
|
; CHECK: callq external
|
|
%a = alloca [300 x i8]
|
|
%gep = getelementptr [300 x i8]* %a, i32 0, i32 0
|
|
call void @external(i8* %gep)
|
|
ret void
|
|
}
|
|
|
|
define void @f6(i32 %p, ...) "no-frame-pointer-elim"="true" {
|
|
; CHECK-LABEL: f6:
|
|
; CHECK: subq $336, %rsp
|
|
; CHECK: .seh_stackalloc 336
|
|
; CHECK: leaq 128(%rsp), %rbp
|
|
; CHECK: .seh_setframe 5, 128
|
|
; CHECK: leaq -92(%rbp), %rcx
|
|
; CHECK: callq external
|
|
%a = alloca [300 x i8]
|
|
%gep = getelementptr [300 x i8]* %a, i32 0, i32 0
|
|
call void @external(i8* %gep)
|
|
ret void
|
|
}
|
|
|
|
define i32 @f7(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) "no-frame-pointer-elim"="true" {
|
|
; CHECK-LABEL: f7:
|
|
; CHECK: pushq %rbp
|
|
; CHECK: .seh_pushreg 5
|
|
; CHECK: subq $304, %rsp
|
|
; CHECK: .seh_stackalloc 304
|
|
; CHECK: leaq 128(%rsp), %rbp
|
|
; CHECK: .seh_setframe 5, 128
|
|
; CHECK: andq $-64, %rsp
|
|
; CHECK: movl 224(%rbp), %eax
|
|
; CHECK: leaq 176(%rbp), %rsp
|
|
alloca [300 x i8], align 64
|
|
ret i32 %e
|
|
}
|
|
|
|
define i32 @f8(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) "no-frame-pointer-elim"="true" {
|
|
; CHECK-LABEL: f8:
|
|
; CHECK: subq $352, %rsp
|
|
; CHECK: .seh_stackalloc 352
|
|
; CHECK: leaq 128(%rsp), %rbp
|
|
; CHECK: .seh_setframe 5, 128
|
|
|
|
%alloca = alloca [300 x i8], align 64
|
|
; CHECK: andq $-64, %rsp
|
|
; CHECK: movq %rsp, %rbx
|
|
|
|
alloca i32, i32 %a
|
|
; CHECK: movl %ecx, %eax
|
|
; CHECK: leaq 15(,%rax,4), %rax
|
|
; CHECK: andq $-16, %rax
|
|
; CHECK: callq __chkstk
|
|
; CHECK: subq %rax, %rsp
|
|
|
|
%gep = getelementptr [300 x i8]* %alloca, i32 0, i32 0
|
|
call void @external(i8* %gep)
|
|
; CHECK: subq $32, %rsp
|
|
; CHECK: leaq (%rbx), %rcx
|
|
; CHECK: callq external
|
|
; CHECK: addq $32, %rsp
|
|
|
|
ret i32 %e
|
|
; CHECK: movl %esi, %eax
|
|
; CHECK: leaq 224(%rbp), %rsp
|
|
}
|
|
|
|
declare i8* @llvm.returnaddress(i32) nounwind readnone
|
|
|
|
declare void @llvm.va_start(i8*) nounwind
|