Home | History | Annotate | Download | only in SystemZ
      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