1 ; Test the backchain attribute. 2 ; 3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 4 5 declare i8 *@llvm.stacksave() 6 declare void @llvm.stackrestore(i8 *) 7 declare void @g() 8 9 ; nothing should happen if no stack frame is needed. 10 define void @f1() "backchain" { 11 ; CHECK-LABEL: f1: 12 ; CHECK-NOT: stg 13 ret void 14 } 15 16 ; check that backchain is saved if we call someone 17 define void @f2() "backchain" { 18 ; CHECK-LABEL: f2: 19 ; CHECK: stmg %r14, %r15, 112(%r15) 20 ; CHECK: lgr %r1, %r15 21 ; CHECK: aghi %r15, -160 22 ; CHECK: stg %r1, 0(%r15) 23 call void @g() 24 call void @g() 25 ret void 26 } 27 28 ; check that backchain is saved if we have an alloca 29 define void @f3() "backchain" { 30 ; CHECK-LABEL: f3: 31 ; CHECK-NOT: stmg 32 ; CHECK: lgr %r1, %r15 33 ; CHECK: aghi %r15, -168 34 ; CHECK: stg %r1, 0(%r15) 35 %ign = alloca i8, i32 4 36 ret void 37 } 38 39 ; check that alloca copies the backchain 40 define void @f4(i32 %len) "backchain" { 41 ; CHECK-LABEL: f4: 42 ; CHECK: stmg %r11, %r15, 88(%r15) 43 ; CHECK: lgr %r1, %r15 44 ; CHECK: aghi %r15, -160 45 ; CHECK: stg %r1, 0(%r15) 46 ; CHECK: lgr %r11, %r15 47 ; CHECK: lg [[BC:%r[0-9]+]], 0(%r15) 48 ; CHECK: lgr [[NEWSP:%r[0-9]+]], %r15 49 ; CHECK: lgr %r15, [[NEWSP]] 50 ; CHECK: stg [[BC]], 0([[NEWSP]]) 51 %ign = alloca i8, i32 %len 52 ret void 53 } 54 55 ; check that llvm.stackrestore restores the backchain 56 define void @f5(i32 %count1, i32 %count2) "backchain" { 57 ; CHECK-LABEL: f5: 58 ; CHECK: stmg %r11, %r15, 88(%r15) 59 ; CHECK: lgr %r1, %r15 60 ; CHECK: aghi %r15, -160 61 ; CHECK: stg %r1, 0(%r15) 62 ; CHECK: lgr %r11, %r15 63 ; CHECK: lgr [[SAVESP:%r[0-9]+]], %r15 64 ; CHECK: lg [[BC:%r[0-9]+]], 0(%r15) 65 ; CHECK: lgr [[NEWSP:%r[0-9]+]], %r15 66 ; CHECK: lgr %r15, [[NEWSP]] 67 ; CHECK: stg [[BC]], 0([[NEWSP]]) 68 ; CHECK: lg [[BC2:%r[0-9]+]], 0(%r15) 69 ; CHECK: lgr %r15, [[SAVESP]] 70 ; CHECK: stg [[BC2]], 0([[SAVESP]]) 71 ; CHECK: lg [[BC3:%r[0-9]+]], 0(%r15) 72 ; CHECK: lgr [[NEWSP2:%r[0-9]+]], %r15 73 ; CHECK: lgr %r15, [[NEWSP2]] 74 ; CHECK: stg [[BC3]], 0([[NEWSP2]]) 75 ; CHECK: lmg %r11, %r15, 248(%r11) 76 ; CHECK: br %r14 77 %src = call i8 *@llvm.stacksave() 78 %array1 = alloca i8, i32 %count1 79 store volatile i8 0, i8 *%array1 80 call void @llvm.stackrestore(i8 *%src) 81 %array2 = alloca i8, i32 %count2 82 store volatile i8 0, i8 *%array2 83 ret void 84 } 85