diff options
author | Marcin Koscielnicki <koriakin@0x04.net> | 2016-05-05 00:37:30 +0000 |
---|---|---|
committer | Marcin Koscielnicki <koriakin@0x04.net> | 2016-05-05 00:37:30 +0000 |
commit | ad1482c6f1e4e8d8b2d8bc44bc9f6c6cca33477f (patch) | |
tree | d8249196a3450eb7a0f77dc39ef6acb4ae7ebd05 /llvm/test | |
parent | 4a14bcac416917ab45d58ab55049a4c25db16970 (diff) | |
download | bcm5719-llvm-ad1482c6f1e4e8d8b2d8bc44bc9f6c6cca33477f.tar.gz bcm5719-llvm-ad1482c6f1e4e8d8b2d8bc44bc9f6c6cca33477f.zip |
[SystemZ] Implement backchain attribute (recommit with fix).
This introduces a SystemZ-specific "backchain" attribute on function, which
enables writing the frame backchain link as specified by the ABI. This will
be used to implement -mbackchain option in clang.
Differential Revision: http://reviews.llvm.org/D19889
Fixed in this version: added RegState::Define and RegState::Kill on R1D
in prologue.
llvm-svn: 268581
Diffstat (limited to 'llvm/test')
-rw-r--r-- | llvm/test/CodeGen/SystemZ/backchain.ll | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/SystemZ/backchain.ll b/llvm/test/CodeGen/SystemZ/backchain.ll new file mode 100644 index 00000000000..45775dbf273 --- /dev/null +++ b/llvm/test/CodeGen/SystemZ/backchain.ll @@ -0,0 +1,84 @@ +; Test the backchain attribute. +; +; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s + +declare i8 *@llvm.stacksave() +declare void @llvm.stackrestore(i8 *) +declare void @g() + +; nothing should happen if no stack frame is needed. +define void @f1() "backchain" { +; CHECK-LABEL: f1: +; CHECK-NOT: stg + ret void +} + +; check that backchain is saved if we call someone +define void @f2() "backchain" { +; CHECK-LABEL: f2: +; CHECK: stmg %r14, %r15, 112(%r15) +; CHECK: lgr %r1, %r15 +; CHECK: aghi %r15, -160 +; CHECK: stg %r1, 0(%r15) + call void @g() + call void @g() + ret void +} + +; check that backchain is saved if we have an alloca +define void @f3() "backchain" { +; CHECK-LABEL: f3: +; CHECK-NOT: stmg +; CHECK: lgr %r1, %r15 +; CHECK: aghi %r15, -168 +; CHECK: stg %r1, 0(%r15) + %ign = alloca i8, i32 4 + ret void +} + +; check that alloca copies the backchain +define void @f4(i32 %len) "backchain" { +; CHECK-LABEL: f4: +; CHECK: stmg %r11, %r15, 88(%r15) +; CHECK: lgr %r1, %r15 +; CHECK: aghi %r15, -160 +; CHECK: stg %r1, 0(%r15) +; CHECK: lgr %r11, %r15 +; CHECK: lg [[BC:%r[0-9]+]], 0(%r15) +; CHECK: lgr [[NEWSP:%r[0-9]+]], %r15 +; CHECK: lgr %r15, [[NEWSP]] +; CHECK: stg [[BC]], 0([[NEWSP]]) + %ign = alloca i8, i32 %len + ret void +} + +; check that llvm.stackrestore restores the backchain +define void @f5(i32 %count1, i32 %count2) "backchain" { +; CHECK-LABEL: f5: +; CHECK: stmg %r11, %r15, 88(%r15) +; CHECK: lgr %r1, %r15 +; CHECK: aghi %r15, -160 +; CHECK: stg %r1, 0(%r15) +; CHECK: lgr %r11, %r15 +; CHECK: lgr [[SAVESP:%r[0-9]+]], %r15 +; CHECK: lg [[BC:%r[0-9]+]], 0(%r15) +; CHECK: lgr [[NEWSP:%r[0-9]+]], %r15 +; CHECK: lgr %r15, [[NEWSP]] +; CHECK: stg [[BC]], 0([[NEWSP]]) +; CHECK: lg [[BC2:%r[0-9]+]], 0(%r15) +; CHECK: lgr %r15, [[SAVESP]] +; CHECK: stg [[BC2]], 0([[SAVESP]]) +; CHECK: lg [[BC3:%r[0-9]+]], 0(%r15) +; CHECK: lgr [[NEWSP2:%r[0-9]+]], %r15 +; CHECK: lgr %r15, [[NEWSP2]] +; CHECK: stg [[BC3]], 0([[NEWSP2]]) +; CHECK: lmg %r11, %r15, 248(%r11) +; CHECK: br %r14 + %src = call i8 *@llvm.stacksave() + %array1 = alloca i8, i32 %count1 + store volatile i8 0, i8 *%array1 + call void @llvm.stackrestore(i8 *%src) + %array2 = alloca i8, i32 %count2 + store volatile i8 0, i8 *%array2 + ret void +} |