llvm-mirror/test/CodeGen/AArch64/arm64-alloca-frame-pointer-offset.ll
Francis Visoiu Mistrih 4152237804 [AArch64] Use FP to access the emergency spill slot
In the presence of variable-sized stack objects, we always picked the
base pointer when resolving frame indices if it was available.

This makes us hit an assert where we can't reach the emergency spill
slot if it's too far away from the base pointer. Since on AArch64 we
decide to place the emergency spill slot at the top of the frame, it
makes more sense to use FP to access it.

The changes here don't affect only emergency spill slots but all the
frame indices. The goal here is to try to choose between FP, BP and SP
so that we minimize the offset and avoid scavenging, or worse, asserting
when trying to access a slot allocated by the scavenger.

Previously discussed here: https://reviews.llvm.org/D40876.

Differential Revision: https://reviews.llvm.org/D45358

llvm-svn: 329691
2018-04-10 11:29:40 +00:00

28 lines
869 B
LLVM

; RUN: llc -mtriple=arm64-eabi -mcpu=cyclone < %s | FileCheck %s
; CHECK: foo
; CHECK-DAG: stur w[[REG0:[0-9]+]], [x29, #-24]
; CHECK-DAG: stur w[[REG0]], [x29, #-20]
define i32 @foo(i32 %a) nounwind {
%retval = alloca i32, align 4
%a.addr = alloca i32, align 4
%arr = alloca [32 x i32], align 4
%i = alloca i32, align 4
%arr2 = alloca [32 x i32], align 4
%j = alloca i32, align 4
store i32 %a, i32* %a.addr, align 4
%tmp = load i32, i32* %a.addr, align 4
%tmp1 = zext i32 %tmp to i64
%v = mul i64 4, %tmp1
%vla = alloca i8, i64 %v, align 4
%tmp2 = bitcast i8* %vla to i32*
%tmp3 = load i32, i32* %a.addr, align 4
store i32 %tmp3, i32* %i, align 4
%tmp4 = load i32, i32* %a.addr, align 4
store i32 %tmp4, i32* %j, align 4
%tmp5 = load i32, i32* %j, align 4
store i32 %tmp5, i32* %retval
%x = load i32, i32* %retval
ret i32 %x
}