summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/XCore/llvm-intrinsics.ll
diff options
context:
space:
mode:
authorRobert Lytton <robert@xmos.com>2014-01-06 14:21:12 +0000
committerRobert Lytton <robert@xmos.com>2014-01-06 14:21:12 +0000
commit9523aa41fbf7e9dec8df66211a396d5dbe9b2199 (patch)
tree068034d0abb4f8bb3240ff10d90a3bc7d3c120ab /llvm/test/CodeGen/XCore/llvm-intrinsics.ll
parentc8c4aa667b0d9de90eb17ab0aa953edf0fa9dc60 (diff)
downloadbcm5719-llvm-9523aa41fbf7e9dec8df66211a396d5dbe9b2199.tar.gz
bcm5719-llvm-9523aa41fbf7e9dec8df66211a396d5dbe9b2199.zip
XCore Target: correct callee save register spilling when callsUnwindInit is true.
llvm-svn: 198616
Diffstat (limited to 'llvm/test/CodeGen/XCore/llvm-intrinsics.ll')
-rw-r--r--llvm/test/CodeGen/XCore/llvm-intrinsics.ll103
1 files changed, 100 insertions, 3 deletions
diff --git a/llvm/test/CodeGen/XCore/llvm-intrinsics.ll b/llvm/test/CodeGen/XCore/llvm-intrinsics.ll
index ac6453c8c7f..5650f9d8bda 100644
--- a/llvm/test/CodeGen/XCore/llvm-intrinsics.ll
+++ b/llvm/test/CodeGen/XCore/llvm-intrinsics.ll
@@ -1,6 +1,11 @@
; RUN: llc < %s -march=xcore | FileCheck %s
declare i8* @llvm.frameaddress(i32) nounwind readnone
+declare i8* @llvm.returnaddress(i32) nounwind
+declare i8* @llvm.eh.dwarf.cfa(i32) nounwind
+declare void @llvm.eh.return.i32(i32, i8*) nounwind
+declare void @llvm.eh.unwind.init() nounwind
+
define i8* @FA0() nounwind {
entry:
; CHECK-LABEL: FA0
@@ -21,7 +26,6 @@ entry:
ret i8* %1
}
-declare i8* @llvm.returnaddress(i32) nounwind readnone
define i8* @RA0() nounwind {
entry:
; CHECK-LABEL: RA0
@@ -45,7 +49,6 @@ entry:
}
; test FRAME_TO_ARGS_OFFSET lowering
-declare i8* @llvm.eh.dwarf.cfa(i32) nounwind
define i8* @FTAO0() nounwind {
entry:
; CHECK-LABEL: FTAO0
@@ -70,7 +73,6 @@ entry:
ret i8* %1
}
-declare void @llvm.eh.return.i32(i32, i8*)
define i8* @EH0(i32 %offset, i8* %handler) {
entry:
; CHECK-LABEL: EH0
@@ -130,3 +132,98 @@ entry:
call void @llvm.eh.return.i32(i32 %0, i8* @handler)
unreachable
}
+
+
+; FP: spill FP+SR+R4:9 = entsp 2 + 6
+; CHECKFP-LABEL: Unwind0:
+; CHECKFP: entsp 8
+; CHECKFP: stw r10, sp[1]
+; CHECKFP: ldaw r10, sp[0]
+; CHECKFP: stw r4, r10[7]
+; CHECKFP: stw r5, r10[6]
+; CHECKFP: stw r6, r10[5]`
+; CHECKFP: stw r7, r10[4]
+; CHECKFP: stw r8, r10[3]
+; CHECKFP: stw r9, r10[2]
+; CHECKFP: ldw r9, r10[2]
+; CHECKFP: ldw r8, r10[3]
+; CHECKFP: ldw r7, r10[4]
+; CHECKFP: ldw r6, r10[5]
+; CHECKFP: ldw r5, r10[6]
+; CHECKFP: ldw r4, r10[7]
+; CHECKFP: set sp, r10
+; CHECKFP: ldw r10, sp[1]
+; CHECKFP: retsp 8
+;
+; !FP: spill R4:10 = entsp 7
+; CHECK-LABEL: Unwind0:
+; CHECK: entsp 7
+; CHECK: stw r4, sp[6]
+; CHECK: stw r5, sp[5]
+; CHECK: stw r6, sp[4]
+; CHECK: stw r7, sp[3]
+; CHECK: stw r8, sp[2]
+; CHECK: stw r9, sp[1]
+; CHECK: stw r10, sp[0]
+; CHECK: ldw r10, sp[0]
+; CHECK: ldw r9, sp[1]
+; CHECK: ldw r8, sp[2]
+; CHECK: ldw r7, sp[3]
+; CHECK: ldw r6, sp[4]
+; CHECK: ldw r5, sp[5]
+; CHECK: ldw r4, sp[6]
+; CHECK: retsp 7
+define void @Unwind0() {
+ call void @llvm.eh.unwind.init()
+ ret void
+}
+
+
+; FP: spill FP+SR+R4:9+LR = entsp 2 + 6 + extsp 1
+; CHECKFP-LABEL: Unwind1:
+; CHECKFP: entsp 8
+; CHECKFP: stw r10, sp[1]
+; CHECKFP: ldaw r10, sp[0]
+; CHECKFP: stw r4, r10[7]
+; CHECKFP: stw r5, r10[6]
+; CHECKFP: stw r6, r10[5]
+; CHECKFP: stw r7, r10[4]
+; CHECKFP: stw r8, r10[3]
+; CHECKFP: stw r9, r10[2]
+; CHECKFP: extsp 1
+; CHECKFP: bl foo
+; CHECKFP: ldaw sp, sp[1]
+; CHECKFP: ldw r9, r10[2]
+; CHECKFP: ldw r8, r10[3]
+; CHECKFP: ldw r7, r10[4]
+; CHECKFP: ldw r6, r10[5]
+; CHECKFP: ldw r5, r10[6]
+; CHECKFP: ldw r4, r10[7]
+; CHECKFP: set sp, r10
+; CHECKFP: ldw r10, sp[1]
+; CHECKFP: retsp 8
+;
+; !FP: spill R4:10+LR = entsp 7 + 1
+; CHECK-LABEL: Unwind1:
+; CHECK: entsp 8
+; CHECK: stw r4, sp[7]
+; CHECK: stw r5, sp[6]
+; CHECK: stw r6, sp[5]
+; CHECK: stw r7, sp[4]
+; CHECK: stw r8, sp[3]
+; CHECK: stw r9, sp[2]
+; CHECK: stw r10, sp[1]
+; CHECK: bl foo
+; CHECK: ldw r10, sp[1]
+; CHECK: ldw r9, sp[2]
+; CHECK: ldw r8, sp[3]
+; CHECK: ldw r7, sp[4]
+; CHECK: ldw r6, sp[5]
+; CHECK: ldw r5, sp[6]
+; CHECK: ldw r4, sp[7]
+; CHECK: retsp 8
+define void @Unwind1() {
+ call void (...)* @foo()
+ call void @llvm.eh.unwind.init()
+ ret void
+}
OpenPOWER on IntegriCloud