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