xref: /llvm-project/llvm/test/CodeGen/SystemZ/frameaddr-02.ll (revision 8e810dc7d93bebe5e2d3980d4db084f58248b37f)
1; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
2
3; Test lowering of @llvm.frameaddress with packed-stack.
4
5; With back chain
6attributes #0 = { nounwind "packed-stack" "backchain" "use-soft-float"="true" }
7define ptr @fp0() #0 {
8entry:
9; CHECK-LABEL: fp0:
10; CHECK:      la   %r2, 152(%r15)
11; CHECK-NEXT: br   %r14
12  %0 = tail call ptr @llvm.frameaddress(i32 0)
13  ret ptr %0
14}
15
16define ptr @fp0f() #0 {
17entry:
18; CHECK-LABEL: fp0f:
19; CHECK:      lgr	%r1, %r15
20; CHECK-NEXT: aghi	%r15, -16
21; CHECK-NEXT: stg	%r1, 152(%r15)
22; CHECK-NEXT: la	%r2, 168(%r15)
23; CHECK-NEXT: aghi	%r15, 16
24; CHECK-NEXT: br	%r14
25  %0 = alloca i64, align 8
26  %1 = tail call ptr @llvm.frameaddress(i32 0)
27  ret ptr %1
28}
29
30; Check the caller's frame address.
31define ptr @fpcaller() #0 {
32entry:
33; CHECK-LABEL: fpcaller:
34; CHECK: lghi %r2, 152
35; CHECK: ag   %r2, 152(%r15)
36; CHECK: br   %r14
37  %0 = tail call ptr @llvm.frameaddress(i32 1)
38  ret ptr %0
39}
40
41; Check the caller's caller's frame address.
42define ptr @fpcallercaller() #0 {
43entry:
44; CHECK-LABEL: fpcallercaller:
45; CHECK: lg   %r1, 152(%r15)
46; CHECK: lghi %r2, 152
47; CHECK: ag   %r2, 152(%r1)
48; CHECK: br   %r14
49  %0 = tail call ptr @llvm.frameaddress(i32 2)
50  ret ptr %0
51}
52
53; Without back chain
54
55attributes #1 = { nounwind "packed-stack" }
56define ptr @fp1() #1 {
57entry:
58; CHECK-LABEL: fp1:
59; CHECK:      la   %r2, 152(%r15)
60; CHECK-NEXT: br   %r14
61  %0 = tail call ptr @llvm.frameaddress(i32 0)
62  ret ptr %0
63}
64
65; No saved registers: returning address of unused slot where backcahin would
66; have been located.
67define ptr @fp1f() #1 {
68entry:
69; CHECK-LABEL: fp1f:
70; CHECK:      aghi	%r15, -16
71; CHECK-NEXT: la	%r2, 168(%r15)
72; CHECK-NEXT: aghi	%r15, 16
73; CHECK-NEXT: br	%r14
74  %0 = alloca i64, align 8
75  %1 = tail call ptr @llvm.frameaddress(i32 0)
76  ret ptr %1
77}
78
79; Saved registers: returning address for first saved GPR.
80declare void @foo(ptr %Arg)
81define ptr @fp2() #1 {
82entry:
83; CHECK-LABEL: fp2:
84; CHECK:      stmg      %r14, %r15, 144(%r15)
85; CHECK-NEXT: aghi	%r15, -16
86; CHECK-NEXT: la	%r2, 168(%r15)
87; CHECK-NEXT: brasl     %r14, foo@PLT
88; CHECK-NEXT: la	%r2, 168(%r15)
89; CHECK-NEXT: lmg       %r14, %r15, 160(%r15)
90; CHECK-NEXT: br	%r14
91  %0 = tail call ptr @llvm.frameaddress(i32 0)
92  call void @foo(ptr %0);
93  ret ptr %0
94}
95
96declare ptr @llvm.frameaddress(i32) nounwind readnone
97