97 lines · plain
1; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s2 3; Test lowering of @llvm.frameaddress with packed-stack.4 5; With back chain6attributes #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 %r1412 %0 = tail call ptr @llvm.frameaddress(i32 0)13 ret ptr %014}15 16define ptr @fp0f() #0 {17entry:18; CHECK-LABEL: fp0f:19; CHECK: lgr %r1, %r1520; CHECK-NEXT: aghi %r15, -1621; CHECK-NEXT: stg %r1, 152(%r15)22; CHECK-NEXT: la %r2, 168(%r15)23; CHECK-NEXT: aghi %r15, 1624; CHECK-NEXT: br %r1425 %0 = alloca i64, align 826 %1 = tail call ptr @llvm.frameaddress(i32 0)27 ret ptr %128}29 30; Check the caller's frame address.31define ptr @fpcaller() #0 {32entry:33; CHECK-LABEL: fpcaller:34; CHECK: lghi %r2, 15235; CHECK: ag %r2, 152(%r15)36; CHECK: br %r1437 %0 = tail call ptr @llvm.frameaddress(i32 1)38 ret ptr %039}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, 15247; CHECK: ag %r2, 152(%r1)48; CHECK: br %r1449 %0 = tail call ptr @llvm.frameaddress(i32 2)50 ret ptr %051}52 53; Without back chain54 55attributes #1 = { nounwind "packed-stack" }56define ptr @fp1() #1 {57entry:58; CHECK-LABEL: fp1:59; CHECK: la %r2, 152(%r15)60; CHECK-NEXT: br %r1461 %0 = tail call ptr @llvm.frameaddress(i32 0)62 ret ptr %063}64 65; No saved registers: returning address of unused slot where backcahin would66; have been located.67define ptr @fp1f() #1 {68entry:69; CHECK-LABEL: fp1f:70; CHECK: aghi %r15, -1671; CHECK-NEXT: la %r2, 168(%r15)72; CHECK-NEXT: aghi %r15, 1673; CHECK-NEXT: br %r1474 %0 = alloca i64, align 875 %1 = tail call ptr @llvm.frameaddress(i32 0)76 ret ptr %177}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, -1686; CHECK-NEXT: la %r2, 168(%r15)87; CHECK-NEXT: brasl %r14, foo@PLT88; CHECK-NEXT: la %r2, 168(%r15)89; CHECK-NEXT: lmg %r14, %r15, 160(%r15)90; CHECK-NEXT: br %r1491 %0 = tail call ptr @llvm.frameaddress(i32 0)92 call void @foo(ptr %0);93 ret ptr %094}95 96declare ptr @llvm.frameaddress(i32) nounwind readnone97