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