118 lines · plain
1; Test the backchain attribute.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck -allow-deprecated-dag-overlap %s4 5declare ptr@llvm.stacksave()6declare void @llvm.stackrestore(ptr)7declare void @g()8 9; nothing should happen if no stack frame is needed.10define void @f1() "backchain" {11; CHECK-LABEL: f1:12; CHECK-NOT: stg13 ret void14}15 16; check that backchain is saved if we call someone17define void @f2() "backchain" {18; CHECK-LABEL: f2:19; CHECK: stmg %r14, %r15, 112(%r15)20; CHECK: lgr %r1, %r1521; CHECK: aghi %r15, -16022; CHECK: stg %r1, 0(%r15)23 call void @g()24 call void @g()25 ret void26}27 28; check that backchain is saved if we have an alloca29define void @f3() "backchain" {30; CHECK-LABEL: f3:31; CHECK-NOT: stmg32; CHECK: lgr %r1, %r1533; CHECK: aghi %r15, -16834; CHECK: stg %r1, 0(%r15)35 %ign = alloca i8, i32 436 ret void37}38 39; check that alloca copies the backchain40define void @f4(i32 %len) "backchain" {41; CHECK-LABEL: f4:42; CHECK: stmg %r11, %r15, 88(%r15)43; CHECK: lgr %r1, %r1544; CHECK: aghi %r15, -16045; CHECK: stg %r1, 0(%r15)46; CHECK: lgr %r11, %r1547; CHECK-DAG: lg [[BC:%r[0-9]+]], 0(%r15)48; CHECK-DAG: lgr [[NEWSP:%r[0-9]+]], %r1549; CHECK: lgr %r15, [[NEWSP]]50; CHECK: stg [[BC]], 0([[NEWSP]])51 %ign = alloca i8, i32 %len52 ret void53}54 55; check that llvm.stackrestore restores the backchain56define void @f5(i32 %count1, i32 %count2) "backchain" {57; CHECK-LABEL: f5:58; CHECK: stmg %r11, %r15, 88(%r15)59; CHECK: lgr %r1, %r1560; CHECK: aghi %r15, -16061; CHECK: stg %r1, 0(%r15)62; CHECK: lgr %r11, %r1563; CHECK-DAG: lgr [[SAVESP:%r[0-9]+]], %r1564; CHECK-DAG: lg [[BC:%r[0-9]+]], 0(%r15)65; CHECK-DAG: lgr [[NEWSP:%r[0-9]+]], %r1566; CHECK-DAG: lgr %r15, [[NEWSP]]67; CHECK-DAG: stg [[BC]], 0([[NEWSP]])68; CHECK-DAG: lg [[BC2:%r[0-9]+]], 0(%r15)69; CHECK-DAG: lgr %r15, [[SAVESP]]70; CHECK-DAG: stg [[BC2]], 0([[SAVESP]])71; CHECK-DAG: lg [[BC3:%r[0-9]+]], 0(%r15)72; CHECK-DAG: lgr [[NEWSP2:%r[0-9]+]], %r1573; CHECK-DAG: lgr %r15, [[NEWSP2]]74; CHECK-DAG: stg [[BC3]], 0([[NEWSP2]])75; CHECK: lmg %r11, %r15, 248(%r11)76; CHECK: br %r1477 %src = call ptr@llvm.stacksave()78 %array1 = alloca i8, i32 %count179 store volatile i8 0, ptr %array180 call void @llvm.stackrestore(ptr %src)81 %array2 = alloca i8, i32 %count282 store volatile i8 0, ptr %array283 ret void84}85 86; same, but with the kernel backchain87define void @f6(i32 %count1, i32 %count2) #0 {88; CHECK-LABEL: f6:89; CHECK: stmg %r11, %r15, 112(%r15)90; CHECK: lgr %r1, %r1591; CHECK: aghi %r15, -4892; CHECK: stg %r1, 152(%r15)93; CHECK: lgr %r11, %r1594; CHECK-DAG: lgr [[SAVESP:%r[0-9]+]], %r1595; CHECK-DAG: lg [[BC:%r[0-9]+]], 152(%r15)96; CHECK-DAG: lgr [[NEWSP:%r[0-9]+]], %r1597; CHECK-DAG: lgr %r15, [[NEWSP]]98; CHECK-DAG: stg [[BC]], 152([[NEWSP]])99; CHECK-DAG: lg [[BC2:%r[0-9]+]], 152(%r15)100; CHECK-DAG: lgr %r15, [[SAVESP]]101; CHECK-DAG: stg [[BC2]], 152([[SAVESP]])102; CHECK-DAG: lg [[BC3:%r[0-9]+]], 152(%r15)103; CHECK-DAG: lgr [[NEWSP2:%r[0-9]+]], %r15104; CHECK-DAG: lgr %r15, [[NEWSP2]]105; CHECK-DAG: stg [[BC3]], 152([[NEWSP2]])106; CHECK: lmg %r11, %r15, 160(%r11)107; CHECK: br %r14108 %src = call ptr@llvm.stacksave()109 %array1 = alloca i8, i32 %count1110 store volatile i8 0, ptr %array1111 call void @llvm.stackrestore(ptr %src)112 %array2 = alloca i8, i32 %count2113 store volatile i8 0, ptr %array2114 ret void115}116 117attributes #0 = { "backchain" "packed-stack" "use-soft-float"="true" }118