[SystemZ] Support builtin_{frame,return}_address() with non-zero argument (#69405)
[llvm-project.git] / llvm / test / CodeGen / SystemZ / frameaddr-02.ll
blobd3977928d41b87e0a81b1518c891171cd5d462b1
1 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
3 ; Test lowering of @llvm.frameaddress with packed-stack.
5 ; With back chain
6 attributes #0 = { nounwind "packed-stack" "backchain" "use-soft-float"="true" }
7 define ptr @fp0() #0 {
8 entry:
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
16 define ptr @fp0f() #0 {
17 entry:
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
30 ; Check the caller's frame address.
31 define ptr @fpcaller() #0 {
32 entry:
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
41 ; Check the caller's caller's frame address.
42 define ptr @fpcallercaller() #0 {
43 entry:
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
53 ; Without back chain
55 attributes #1 = { nounwind "packed-stack" }
56 define ptr @fp1() #1 {
57 entry:
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
65 ; No saved registers: returning address of unused slot where backcahin would
66 ; have been located.
67 define ptr @fp1f() #1 {
68 entry:
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
79 ; Saved registers: returning address for first saved GPR.
80 declare void @foo(ptr %Arg)
81 define ptr @fp2() #1 {
82 entry:
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
96 declare ptr @llvm.frameaddress(i32) nounwind readnone