summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorRobert Lytton <robert@xmos.com>2013-12-02 10:18:19 +0000
committerRobert Lytton <robert@xmos.com>2013-12-02 10:18:19 +0000
commit25464b948f269ae56798f3f66cdb3404b0e8cad0 (patch)
treebd0ccbf4c6f1b251069c1e651796e3416e2c3971 /test
parent1326c6f14bbd1e0b887320f30639cbab16cc1803 (diff)
downloadllvm-25464b948f269ae56798f3f66cdb3404b0e8cad0.tar.gz
llvm-25464b948f269ae56798f3f66cdb3404b0e8cad0.tar.bz2
llvm-25464b948f269ae56798f3f66cdb3404b0e8cad0.tar.xz
XCore target: Fix eliminateFrameIndex() to handle large frames
Large frame offsets are loaded from the ConstantPool. Where possible, offsets are encoded using the smaller MKMSK instruction. Large frame offsets can only be used when there is a frame-pointer. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@196085 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r--test/CodeGen/XCore/epilogue_prologue_fp.ll42
1 files changed, 42 insertions, 0 deletions
diff --git a/test/CodeGen/XCore/epilogue_prologue_fp.ll b/test/CodeGen/XCore/epilogue_prologue_fp.ll
new file mode 100644
index 0000000000..9b9837c90d
--- /dev/null
+++ b/test/CodeGen/XCore/epilogue_prologue_fp.ll
@@ -0,0 +1,42 @@
+; Functions with frames > 256K bytes require a frame pointer to access the stack.
+; At present, functions must be compiled using '-fno-omit-frame-pointer'.
+; RUN: llc < %s -march=xcore -disable-fp-elim | FileCheck %s
+
+declare void @f0(i32*)
+
+; CHECK: .section .cp.rodata.cst4,"aMc",@progbits,4
+; CHECK: .LCPI[[NUM:[0-9_]+]]:
+; CHECK: .long 99999
+; CHECK: .text
+; CHECK-LABEL:f1
+; CHECK: entsp 65535
+; CHECK-NEXT: extsp 34465
+; CHECK-NEXT: stw r10, sp[1]
+; CHECK-NEXT: ldaw r10, sp[0]
+; CHECK-NEXT: ldw r1, cp[.LCPI[[NUM]]]
+; CHECK-NEXT: ldaw r0, r10[r1]
+; CHECK-NEXT: extsp 1
+; CHECK-NEXT: bl f0
+; CHECK-NEXT: ldaw sp, sp[1]
+; CHECK-NEXT: set sp, r10
+; CHECK-NEXT: ldw r10, sp[1]
+; CHECK-NEXT: ldaw sp, sp[65535]
+; CHECK-NEXT: retsp 34465
+define void @f1() nounwind {
+entry:
+ %0 = alloca [99998 x i32]
+ %1 = getelementptr inbounds [99998 x i32]* %0, i32 0, i32 99997
+ call void @f0(i32* %1)
+ ret void
+}
+
+; CHECK-LABEL:f2
+; CHECK: mkmsk [[REG:r[0-9]+]], 15
+; CHECK-NEXT: ldaw r0, r10{{\[}}[[REG]]{{\]}}
+define void @f2() nounwind {
+entry:
+ %0 = alloca [32768 x i32]
+ %1 = getelementptr inbounds [32768 x i32]* %0, i32 0, i32 32765
+ call void @f0(i32* %1)
+ ret void
+}