brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · d397792 Raw
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