Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / SystemZ / frame-28.mir
blobdd5933a9c7b4b4c73860a5888b18a12c21ff554f
1 # RUN: llc -mtriple=s390x-linux-gnu -start-before=prologepilog %s -o - -mcpu=z14 \
2 # RUN:   -verify-machineinstrs 2>&1 | FileCheck %s
3 # REQUIRES: asserts
5 # Test that redundant frame addressing anchor points are removed by
6 # MachineLateInstrsCleanup.
8 --- |
9   define void @fun1() { ret void }
10   define void @fun2() { ret void }
11   define void @fun3() { ret void }
12   define void @fun4() { ret void }
13   define void @fun5() { ret void }
14   define void @fun6() { ret void }
15   define void @fun7() { ret void }
16   define void @fun8() { ret void }
18   declare i32 @foo()
20   @ptr = external dso_local local_unnamed_addr global ptr
21 ---
23 # Test elimination of redundant LAYs in successor blocks.
24 # CHECK-LABEL: fun1:
25 # CHECK: lay %r1, 4096(%r15)
26 # CHECK: # %bb.1:
27 # CHECK-NOT: lay
28 # CHECK: .LBB0_2:
29 # CHECK-NOT: lay
30 ---
31 name:            fun1
32 tracksRegLiveness: true
33 stack:
34   - { id: 0, size: 5000 }
35   - { id: 1, size: 2500 }
36   - { id: 2, size: 2500 }
38 machineFunctionInfo: {}
39 body:             |
40   bb.0 (%ir-block.0):
41     liveins: $f16d
42     successors: %bb.2(0x00000001), %bb.1(0x7fffffff)
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.0, 0, $noreg
49     VST64 renamable $f16d, %stack.1, 0, $noreg
50     CHIMux undef $r0l, 3, implicit-def $cc
51     BRC 14, 8, %bb.2, implicit killed $cc
52     J %bb.1
54   bb.1:
55     liveins: $f16d
56     VST64 renamable $f16d, %stack.2, 0, $noreg
57     J %bb.2
59   bb.2:
60     liveins: $f16d
61     VST64 renamable $f16d, %stack.1, 0, $noreg
62     Return
63 ...
65 # In this function the LAY in bb.1 will have a different offset, so the first
66 # LAY in bb.2 must remain.
67 # CHECK-LABEL: fun2:
68 # CHECK: lay %r1, 4096(%r15)
69 # CHECK: # %bb.1:
70 # CHECK: lay %r1, 8192(%r15)
71 # CHECK: .LBB1_2:
72 # CHECK: lay %r1, 4096(%r15)
73 # CHECK-NOT: lay
74 ---
75 name:            fun2
76 tracksRegLiveness: true
77 stack:
78   - { id: 0, size: 5000 }
79   - { id: 1, size: 5000 }
80   - { id: 2, size: 2500 }
82 machineFunctionInfo: {}
83 body:             |
84   bb.0 (%ir-block.0):
85     liveins: $f16d
86     successors: %bb.2(0x00000001), %bb.1(0x7fffffff)
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.0, 0, $noreg
93     VST64 renamable $f16d, %stack.1, 0, $noreg
94     CHIMux undef $r0l, 3, implicit-def $cc
95     BRC 14, 8, %bb.2, implicit killed $cc
96     J %bb.1
98   bb.1:
99     liveins: $f16d
100     VST64 renamable $f16d, %stack.2, 0, $noreg
101     J %bb.2
103   bb.2:
104     liveins: $f16d
105     VST64 renamable $f16d, %stack.1, 0, $noreg
106     VST64 renamable $f16d, %stack.1, 0, $noreg
107     Return
110 # Test case with a loop (with room for improvement: since %r1 is not clobbered
111 # inside the loop only the first LAY is needed).
112 # CHECK-LABEL: fun3:
113 # CHECK: lay %r1, 4096(%r15)
114 # CHECK: .LBB2_1:
115 # CHECK: lay %r1, 4096(%r15)
116 # CHECK: .LBB2_2:
117 # CHECK-NOT: lay %r1, 4096(%r15)
119 name:            fun3
120 tracksRegLiveness: true
121 stack:
122   - { id: 0, size: 5000 }
123   - { id: 1, size: 2500 }
124   - { id: 2, size: 2500 }
126 machineFunctionInfo: {}
127 body:             |
128   bb.0 (%ir-block.0):
129     liveins: $f16d
130     successors: %bb.2(0x00000001), %bb.1(0x7fffffff)
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.0, 0, $noreg
137     VST64 renamable $f16d, %stack.1, 0, $noreg
138     CHIMux undef $r0l, 3, implicit-def $cc
139     BRC 14, 8, %bb.2, implicit killed $cc
140     J %bb.1
142   bb.1:
143     liveins: $f16d
144     successors: %bb.2(0x00000001), %bb.1(0x7fffffff)
146     VST64 renamable $f16d, %stack.2, 0, $noreg
147     CHIMux undef $r0l, 3, implicit-def $cc
148     BRC 14, 8, %bb.1, implicit killed $cc
149     J %bb.2
151   bb.2:
152     liveins: $f16d
153     VST64 renamable $f16d, %stack.1, 0, $noreg
154     Return
157 # Test case with a call which clobbers r1: the second LAY after the call is needed.
158 # CHECK-LABEL: fun4:
159 # CHECK: lay %r1, 4096(%r15)
160 # CHECK: brasl
161 # CHECK: lay %r1, 4096(%r15)
163 name:            fun4
164 tracksRegLiveness: true
165 stack:
166   - { id: 0, size: 5000 }
167   - { id: 1, size: 2500 }
169 machineFunctionInfo: {}
170 body:             |
171   bb.0 (%ir-block.0):
172     liveins: $f16d
174     VST64 renamable $f16d, %stack.0, 0, $noreg
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.1, 0, $noreg
180     ADJCALLSTACKDOWN 0, 0
181     CallBRASL @foo, csr_systemz_elf, implicit-def dead $r14d, implicit-def dead $cc, implicit $fpc, implicit-def $r2l
182     ADJCALLSTACKUP 0, 0
183     $f17d = IMPLICIT_DEF
184     VST64 renamable $f17d, %stack.1, 0, $noreg
185     Return
188 # Test case where index reg is loaded instead of using an LAY. Only one LGHI is needed.
189 # CHECK-LABEL: fun5:
190 # CHECK: lghi %r1, 4096
191 # CHECK-NOT: lghi
193 name:            fun5
194 tracksRegLiveness: true
195 stack:
196   - { id: 0, size: 5000 }
197   - { id: 1, size: 2500 }
199 machineFunctionInfo: {}
200 body:             |
201   bb.0 (%ir-block.0):
202     liveins: $f16d
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     VST64 renamable $f16d, %stack.0, 0, $noreg
209     $f0q = nofpexcept LXEB %stack.1, 0, $noreg, implicit $fpc
210     $f1q = nofpexcept LXEB %stack.1, 0, $noreg, implicit $fpc
211     Return
214 # Test where the constant is a Global. Only one LARL is needed.
215 # CHECK-LABEL: fun6:
216 # CHECK: larl %r1, ptr
217 # CHECK-NOT: larl
219 name:            fun6
220 alignment:       16
221 tracksRegLiveness: true
222 tracksDebugUserValues: true
223 frameInfo:
224   maxAlignment:    1
225   maxCallFrameSize: 0
226 fixedStack:
227   - { id: 0, offset: -160, size: 8, alignment: 8 }
228 machineFunctionInfo: {}
229 body:             |
230   bb.0:
231     successors: %bb.2(0x30000000), %bb.1(0x50000000)
233     renamable $r1d = LARL @ptr
234     CGHSI killed renamable $r1d, 0, 0, implicit-def $cc :: (volatile dereferenceable load (s64) from @ptr)
235     BRC 14, 8, %bb.2, implicit killed $cc
236     J %bb.1
238   bb.1:
239     renamable $r1d = LARL @ptr
240     MVGHI killed renamable $r1d, 0, 0
242   bb.2:
243     Return
247 # Load of an invariant location (GOT). Only one LGRL is needed.
248 # CHECK-LABEL: fun7:
249 # CHECK: lgrl %r1, ptr
250 # CHECK-NOT: lgrl
252 name:            fun7
253 alignment:       16
254 tracksRegLiveness: true
255 tracksDebugUserValues: true
256 frameInfo:
257   maxAlignment:    1
258   maxCallFrameSize: 0
259 fixedStack:
260   - { id: 0, offset: -160, size: 8, alignment: 8 }
261 machineFunctionInfo: {}
262 body:             |
263   bb.0:
264     successors: %bb.2(0x30000000), %bb.1(0x50000000)
265   
266     renamable $r1d = LGRL @ptr :: (load (s64) from got)
267     CGHSI killed renamable $r1d, 0, 0, implicit-def $cc :: (volatile dereferenceable load (s64) from @ptr)
268     BRC 14, 8, %bb.2, implicit killed $cc
269     J %bb.1
270   
271   bb.1:
272     renamable $r1d = LGRL @ptr :: (load (s64) from got)
273     MVGHI killed renamable $r1d, 0, 0
274   
275   bb.2:
276     Return
280 # Load from constant pool. Only one LARL is needed.
281 # CHECK-LABEL: fun8:
282 # CHECK: larl %r1, .LCPI7_0
283 # CHECK-NOT: larl
285 name:            fun8
286 alignment:       16
287 tracksRegLiveness: true
288 tracksDebugUserValues: true
289 liveins:
290   - { reg: '$f0s' }
291 frameInfo:
292   maxAlignment:    1
293   maxCallFrameSize: 0
294 fixedStack:
295   - { id: 0, offset: -160, size: 8, alignment: 8 }
296 constants:
297   - id:              0
298     value:           float 0x43E0000000000000
299     alignment:       4
300 machineFunctionInfo: {}
301 body:             |
302   bb.0 (%ir-block.0):
303     successors: %bb.1, %bb.2
304     liveins: $f0s
306     renamable $r1d = LARL %const.0
307     renamable $f1s = LE killed renamable $r1d, 0, $noreg :: (load (s32) from constant-pool)
308     nofpexcept CEBR renamable $f0s, renamable $f1s, implicit-def $cc, implicit $fpc
309     BRC 15, 11, %bb.2, implicit killed $cc
311   bb.1:
312     liveins: $f0s
314     J %bb.3
316   bb.2 (%ir-block.0):
317     liveins: $f0s, $f1s
319     renamable $r1d = LARL %const.0
320     renamable $f1s = LE killed renamable $r1d, 0, $noreg :: (load (s32) from constant-pool)
322   bb.3 (%ir-block.0):
323     liveins: $r2d
325     Return