mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-06 12:04:52 +00:00
ed5107d663
On SparcV8, it was previously the case that a variable-sized alloca might overlap by 4-bytes the last fixed stack variable, effectively because 92 (the number of bytes reserved for the register spill area) != 96 (the offset added to SP for where to start a DYNAMIC_STACKALLOC). It's not as simple as changing 96 to 92, because variables that should be 8-byte aligned would then be misaligned. For now, simply increase the allocation size by 8 bytes for each dynamic allocation -- wastes space, but at least doesn't overlap. As the large comment says, doing this more efficiently will require larger changes in llvm. Also adds some test cases showing that we continue to not support dynamic stack allocation and over-alignment in the same function. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@285131 91177308-0d34-0410-b5e6-96231b3b80d8
32 lines
1.1 KiB
LLVM
32 lines
1.1 KiB
LLVM
; RUN: llc -march=sparc < %s | FileCheck %s --check-prefix=V8
|
|
; RUN: llc -march=sparcv9 < %s | FileCheck %s --check-prefix=SPARC64
|
|
|
|
; V8-LABEL: variable_alloca_with_adj_call_stack
|
|
; V8: save %sp, -96, %sp
|
|
; (this should ideally be doing "add 4+7; and -8", instead of
|
|
; "add 7; and -8; add 8"; see comments in LowerDYNAMIC_STACKALLOC)
|
|
; V8: add %i0, 7, %i0
|
|
; V8-NEXT: and %i0, -8, %i0
|
|
; V8-NEXT: add %i0, 8, %i0
|
|
; V8-NEXT: sub %sp, %i0, %i0
|
|
; V8-NEXT: add %i0, 96, %o0
|
|
; V8: add %sp, -16, %sp
|
|
; V8: call foo
|
|
; V8: add %sp, 16, %sp
|
|
|
|
; SPARC64-LABEL: variable_alloca_with_adj_call_stack
|
|
; SPARC64: save %sp, -128, %sp
|
|
; SPARC64: add {{.+}}, 2175, %o0
|
|
; SPARC64: add %sp, -80, %sp
|
|
; SPARC64: call foo
|
|
; SPARC64: add %sp, 80, %sp
|
|
|
|
define void @variable_alloca_with_adj_call_stack(i32 %num) {
|
|
entry:
|
|
%0 = alloca i8, i32 %num, align 8
|
|
call void @foo(i8* %0, i8* %0, i8* %0, i8* %0, i8* %0, i8* %0, i8* %0, i8* %0, i8* %0, i8* %0)
|
|
ret void
|
|
}
|
|
|
|
declare void @foo(i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*);
|