Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / SystemZ / frame-28.mir
blob353fe3dec9a3b2f770c3eb663e983f5da7ff4829
1 # RUN: llc -mtriple=s390x-linux-gnu -start-before=prologepilog %s -o - -mcpu=z14 \
2 # RUN:   -verify-machineinstrs 2>&1 | FileCheck %s
4 # Test that redundant frame addressing anchor points are removed by
5 # MachineLateInstrsCleanup.
7 --- |
8   define void @fun1() { ret void }
9   define void @fun2() { ret void }
10   define void @fun3() { ret void }
11   define void @fun4() { ret void }
12   define void @fun5() { ret void }
13   define void @fun6() { ret void }
14   define void @fun7() { ret void }
15   define void @fun8() { ret void }
17   declare i32 @foo()
19   @ptr = external dso_local local_unnamed_addr global ptr
20 ---
22 # Test elimination of redundant LAYs in successor blocks.
23 # CHECK-LABEL: fun1:
24 # CHECK: lay %r1, 4096(%r15)
25 # CHECK: # %bb.1:
26 # CHECK-NOT: lay
27 # CHECK: .LBB0_2:
28 # CHECK-NOT: lay
29 ---
30 name:            fun1
31 tracksRegLiveness: true
32 stack:
33   - { id: 0, size: 5000 }
34   - { id: 1, size: 2500 }
35   - { id: 2, size: 2500 }
37 machineFunctionInfo: {}
38 body:             |
39   bb.0 (%ir-block.0):
40     liveins: $f16d
41     successors: %bb.2(0x00000001), %bb.1(0x7fffffff)
43     VST64 renamable $f16d, %stack.0, 0, $noreg
44     VST64 renamable $f16d, %stack.0, 0, $noreg
45     VST64 renamable $f16d, %stack.0, 0, $noreg
46     VST64 renamable $f16d, %stack.0, 0, $noreg
47     VST64 renamable $f16d, %stack.0, 0, $noreg
48     VST64 renamable $f16d, %stack.1, 0, $noreg
49     CHIMux undef $r0l, 3, implicit-def $cc
50     BRC 14, 8, %bb.2, implicit killed $cc
51     J %bb.1
53   bb.1:
54     liveins: $f16d
55     VST64 renamable $f16d, %stack.2, 0, $noreg
56     J %bb.2
58   bb.2:
59     liveins: $f16d
60     VST64 renamable $f16d, %stack.1, 0, $noreg
61     Return
62 ...
64 # In this function the LAY in bb.1 will have a different offset, so the first
65 # LAY in bb.2 must remain.
66 # CHECK-LABEL: fun2:
67 # CHECK: lay %r1, 4096(%r15)
68 # CHECK: # %bb.1:
69 # CHECK: lay %r1, 8192(%r15)
70 # CHECK: .LBB1_2:
71 # CHECK: lay %r1, 4096(%r15)
72 # CHECK-NOT: lay
73 ---
74 name:            fun2
75 tracksRegLiveness: true
76 stack:
77   - { id: 0, size: 5000 }
78   - { id: 1, size: 5000 }
79   - { id: 2, size: 2500 }
81 machineFunctionInfo: {}
82 body:             |
83   bb.0 (%ir-block.0):
84     liveins: $f16d
85     successors: %bb.2(0x00000001), %bb.1(0x7fffffff)
87     VST64 renamable $f16d, %stack.0, 0, $noreg
88     VST64 renamable $f16d, %stack.0, 0, $noreg
89     VST64 renamable $f16d, %stack.0, 0, $noreg
90     VST64 renamable $f16d, %stack.0, 0, $noreg
91     VST64 renamable $f16d, %stack.0, 0, $noreg
92     VST64 renamable $f16d, %stack.1, 0, $noreg
93     CHIMux undef $r0l, 3, implicit-def $cc
94     BRC 14, 8, %bb.2, implicit killed $cc
95     J %bb.1
97   bb.1:
98     liveins: $f16d
99     VST64 renamable $f16d, %stack.2, 0, $noreg
100     J %bb.2
102   bb.2:
103     liveins: $f16d
104     VST64 renamable $f16d, %stack.1, 0, $noreg
105     VST64 renamable $f16d, %stack.1, 0, $noreg
106     Return
109 # Test case with a loop (with room for improvement: since %r1 is not clobbered
110 # inside the loop only the first LAY is needed).
111 # CHECK-LABEL: fun3:
112 # CHECK: lay %r1, 4096(%r15)
113 # CHECK: .LBB2_1:
114 # CHECK: lay %r1, 4096(%r15)
115 # CHECK: .LBB2_2:
116 # CHECK-NOT: lay %r1, 4096(%r15)
118 name:            fun3
119 tracksRegLiveness: true
120 stack:
121   - { id: 0, size: 5000 }
122   - { id: 1, size: 2500 }
123   - { id: 2, size: 2500 }
125 machineFunctionInfo: {}
126 body:             |
127   bb.0 (%ir-block.0):
128     liveins: $f16d
129     successors: %bb.2(0x00000001), %bb.1(0x7fffffff)
131     VST64 renamable $f16d, %stack.0, 0, $noreg
132     VST64 renamable $f16d, %stack.0, 0, $noreg
133     VST64 renamable $f16d, %stack.0, 0, $noreg
134     VST64 renamable $f16d, %stack.0, 0, $noreg
135     VST64 renamable $f16d, %stack.0, 0, $noreg
136     VST64 renamable $f16d, %stack.1, 0, $noreg
137     CHIMux undef $r0l, 3, implicit-def $cc
138     BRC 14, 8, %bb.2, implicit killed $cc
139     J %bb.1
141   bb.1:
142     liveins: $f16d
143     successors: %bb.2(0x00000001), %bb.1(0x7fffffff)
145     VST64 renamable $f16d, %stack.2, 0, $noreg
146     CHIMux undef $r0l, 3, implicit-def $cc
147     BRC 14, 8, %bb.1, implicit killed $cc
148     J %bb.2
150   bb.2:
151     liveins: $f16d
152     VST64 renamable $f16d, %stack.1, 0, $noreg
153     Return
156 # Test case with a call which clobbers r1: the second LAY after the call is needed.
157 # CHECK-LABEL: fun4:
158 # CHECK: lay %r1, 4096(%r15)
159 # CHECK: brasl
160 # CHECK: lay %r1, 4096(%r15)
162 name:            fun4
163 tracksRegLiveness: true
164 frameInfo:
165   adjustsStack:    true
166 stack:
167   - { id: 0, size: 5000 }
168   - { id: 1, size: 2500 }
170 machineFunctionInfo: {}
171 body:             |
172   bb.0 (%ir-block.0):
173     liveins: $f16d
175     VST64 renamable $f16d, %stack.0, 0, $noreg
176     VST64 renamable $f16d, %stack.0, 0, $noreg
177     VST64 renamable $f16d, %stack.0, 0, $noreg
178     VST64 renamable $f16d, %stack.0, 0, $noreg
179     VST64 renamable $f16d, %stack.0, 0, $noreg
180     VST64 renamable $f16d, %stack.1, 0, $noreg
181     CallBRASL @foo, csr_systemz_elf, implicit-def dead $r14d, implicit-def dead $cc, implicit $fpc, implicit-def $r2l
182     $f17d = IMPLICIT_DEF
183     VST64 renamable $f17d, %stack.1, 0, $noreg
184     Return
187 # Test case where index reg is loaded instead of using an LAY. Only one LGHI is needed.
188 # CHECK-LABEL: fun5:
189 # CHECK: lghi %r1, 4096
190 # CHECK-NOT: lghi
192 name:            fun5
193 tracksRegLiveness: true
194 stack:
195   - { id: 0, size: 5000 }
196   - { id: 1, size: 2500 }
198 machineFunctionInfo: {}
199 body:             |
200   bb.0 (%ir-block.0):
201     liveins: $f16d
203     VST64 renamable $f16d, %stack.0, 0, $noreg
204     VST64 renamable $f16d, %stack.0, 0, $noreg
205     VST64 renamable $f16d, %stack.0, 0, $noreg
206     VST64 renamable $f16d, %stack.0, 0, $noreg
207     VST64 renamable $f16d, %stack.0, 0, $noreg
208     $f0q = nofpexcept LXEB %stack.1, 0, $noreg, implicit $fpc
209     $f1q = nofpexcept LXEB %stack.1, 0, $noreg, implicit $fpc
210     Return
213 # Test where the constant is a Global. Only one LARL is needed.
214 # CHECK-LABEL: fun6:
215 # CHECK: larl %r1, ptr
216 # CHECK-NOT: larl
218 name:            fun6
219 alignment:       16
220 tracksRegLiveness: true
221 tracksDebugUserValues: true
222 frameInfo:
223   maxAlignment:    1
224   maxCallFrameSize: 0
225 fixedStack:
226   - { id: 0, offset: -160, size: 8, alignment: 8 }
227 machineFunctionInfo: {}
228 body:             |
229   bb.0:
230     successors: %bb.2(0x30000000), %bb.1(0x50000000)
232     renamable $r1d = LARL @ptr
233     CGHSI killed renamable $r1d, 0, 0, implicit-def $cc :: (volatile dereferenceable load (s64) from @ptr)
234     BRC 14, 8, %bb.2, implicit killed $cc
235     J %bb.1
237   bb.1:
238     renamable $r1d = LARL @ptr
239     MVGHI killed renamable $r1d, 0, 0
241   bb.2:
242     Return
246 # Load of an invariant location (GOT). Only one LGRL is needed.
247 # CHECK-LABEL: fun7:
248 # CHECK: lgrl %r1, ptr
249 # CHECK-NOT: lgrl
251 name:            fun7
252 alignment:       16
253 tracksRegLiveness: true
254 tracksDebugUserValues: true
255 frameInfo:
256   maxAlignment:    1
257   maxCallFrameSize: 0
258 fixedStack:
259   - { id: 0, offset: -160, size: 8, alignment: 8 }
260 machineFunctionInfo: {}
261 body:             |
262   bb.0:
263     successors: %bb.2(0x30000000), %bb.1(0x50000000)
265     renamable $r1d = LGRL @ptr :: (load (s64) from got)
266     CGHSI killed renamable $r1d, 0, 0, implicit-def $cc :: (volatile dereferenceable load (s64) from @ptr)
267     BRC 14, 8, %bb.2, implicit killed $cc
268     J %bb.1
270   bb.1:
271     renamable $r1d = LGRL @ptr :: (load (s64) from got)
272     MVGHI killed renamable $r1d, 0, 0
274   bb.2:
275     Return
279 # Load from constant pool. Only one LARL is needed.
280 # CHECK-LABEL: fun8:
281 # CHECK: larl %r1, .LCPI7_0
282 # CHECK-NOT: larl
284 name:            fun8
285 alignment:       16
286 tracksRegLiveness: true
287 tracksDebugUserValues: true
288 liveins:
289   - { reg: '$f0s' }
290 frameInfo:
291   maxAlignment:    1
292   maxCallFrameSize: 0
293 fixedStack:
294   - { id: 0, offset: -160, size: 8, alignment: 8 }
295 constants:
296   - id:              0
297     value:           float 0x43E0000000000000
298     alignment:       4
299 machineFunctionInfo: {}
300 body:             |
301   bb.0 (%ir-block.0):
302     successors: %bb.1, %bb.2
303     liveins: $f0s
305     renamable $r1d = LARL %const.0
306     renamable $f1s = LE killed renamable $r1d, 0, $noreg :: (load (s32) from constant-pool)
307     nofpexcept CEBR renamable $f0s, renamable $f1s, implicit-def $cc, implicit $fpc
308     BRC 15, 11, %bb.2, implicit killed $cc
310   bb.1:
311     liveins: $f0s
313     J %bb.3
315   bb.2 (%ir-block.0):
316     liveins: $f0s, $f1s
318     renamable $r1d = LARL %const.0
319     renamable $f1s = LE killed renamable $r1d, 0, $noreg :: (load (s32) from constant-pool)
321   bb.3 (%ir-block.0):
322     liveins: $r2d
324     Return