xref: /llvm-project/llvm/test/CodeGen/SystemZ/backchain.ll (revision a1710eb3cd5823c5d14899112ca3086acbdbe9cb)
1; Test the backchain attribute.
2;
3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck -allow-deprecated-dag-overlap %s
4
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: stg
13  ret void
14}
15
16; check that backchain is saved if we call someone
17define 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
29define 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
40define 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-DAG: lg [[BC:%r[0-9]+]], 0(%r15)
48; CHECK-DAG: 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
56define 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-DAG: lgr [[SAVESP:%r[0-9]+]], %r15
64; CHECK-DAG: lg [[BC:%r[0-9]+]], 0(%r15)
65; CHECK-DAG: lgr [[NEWSP:%r[0-9]+]], %r15
66; 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]+]], %r15
73; CHECK-DAG: lgr %r15, [[NEWSP2]]
74; CHECK-DAG: stg [[BC3]], 0([[NEWSP2]])
75; CHECK: lmg %r11, %r15, 248(%r11)
76; CHECK: br %r14
77  %src = call ptr@llvm.stacksave()
78  %array1 = alloca i8, i32 %count1
79  store volatile i8 0, ptr %array1
80  call void @llvm.stackrestore(ptr %src)
81  %array2 = alloca i8, i32 %count2
82  store volatile i8 0, ptr %array2
83  ret void
84}
85
86; same, but with the kernel backchain
87define void @f6(i32 %count1, i32 %count2) #0 {
88; CHECK-LABEL: f6:
89; CHECK: stmg %r11, %r15, 112(%r15)
90; CHECK: lgr %r1, %r15
91; CHECK: aghi %r15, -48
92; CHECK: stg %r1, 152(%r15)
93; CHECK: lgr %r11, %r15
94; CHECK-DAG: lgr [[SAVESP:%r[0-9]+]], %r15
95; CHECK-DAG: lg [[BC:%r[0-9]+]], 152(%r15)
96; CHECK-DAG: lgr [[NEWSP:%r[0-9]+]], %r15
97; 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]+]], %r15
104; CHECK-DAG: lgr %r15, [[NEWSP2]]
105; CHECK-DAG: stg [[BC3]], 152([[NEWSP2]])
106; CHECK: lmg %r11, %r15, 160(%r11)
107; CHECK: br %r14
108  %src = call ptr@llvm.stacksave()
109  %array1 = alloca i8, i32 %count1
110  store volatile i8 0, ptr %array1
111  call void @llvm.stackrestore(ptr %src)
112  %array2 = alloca i8, i32 %count2
113  store volatile i8 0, ptr %array2
114  ret void
115}
116
117attributes #0 = { "backchain" "packed-stack" "use-soft-float"="true" }
118