Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / AArch64 / GlobalISel / prelegalizercombiner-extending-loads.mir
blobbc5a2eaee87681d54e0c4f5575337896f773be79
1 # RUN: llc -O0 -run-pass=aarch64-prelegalizer-combiner -global-isel -verify-machineinstrs %s -o - | FileCheck %s
3 --- |
4   target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
5   target triple = "aarch64--"
6   define void @test_anyext(i8* %addr) {
7   entry:
8     ret void
9   }
10   define void @test_anyext_with_copy(i8* %addr) {
11   entry:
12     ret void
13   }
14   define void @test_signext(i8* %addr) {
15   entry:
16     ret void
17   }
18   define void @test_zeroext(i8* %addr) {
19   entry:
20     ret void
21   }
22   define void @test_2anyext(i8* %addr) {
23   entry:
24     ret void
25   }
26   define void @test_1anyext_1signext(i8* %addr) {
27   entry:
28     ret void
29   }
30   define void @test_1xor_1signext(i8* %addr) {
31   entry:
32     ret void
33   }
34   define void @test_1anyext_1zeroext(i8* %addr) {
35   entry:
36     ret void
37   }
38   define void @test_1signext_1zeroext(i8* %addr) {
39   entry:
40     ret void
41   }
42   define void @test_1anyext64_1signext32(i8* %addr) {
43   entry:
44     ret void
45   }
46   define void @test_1anyext32_1signext64(i8* %addr) {
47   entry:
48     ret void
49   }
50   define void @test_2anyext32_1signext64(i8* %addr) {
51   entry:
52     ret void
53   }
54   define void @test_multiblock_anyext(i8* %addr) {
55   entry:
56     ret void
57   }
58   define void @test_multiblock_signext(i8* %addr) {
59   entry:
60     ret void
61   }
62   define void @test_multiblock_zeroext(i8* %addr) {
63   entry:
64     ret void
65   }
66   define void @test_multiblock_2anyext(i8* %addr) {
67   entry:
68     ret void
69   }
70   define void @test_multiblock_1anyext64_1signext32(i8* %addr) {
71   entry:
72     ret void
73   }
74   define void @test_multiblock_1anyext32_1signext64(i8* %addr) {
75   entry:
76     ret void
77   }
78   define void @test_multiblock_2anyext32_1signext64(i8* %addr) {
79   entry:
80     ret void
81   }
82 ...
84 ---
85 name:            test_anyext
86 body: |
87   bb.0.entry:
88     liveins: $x0
89     ; CHECK-LABEL: name: test_anyext
90     ; CHECK: [[T0:%[0-9]+]]:_(p0) = COPY $x0
91     ; CHECK: [[T1:%[0-9]+]]:_(s32) = G_LOAD [[T0]](p0) :: (load 1 from %ir.addr)
92     ; CHECK: $w0 = COPY [[T1]](s32)
93     %0:_(p0) = COPY $x0
94     %1:_(s8) = G_LOAD %0 :: (load 1 from %ir.addr)
95     %2:_(s32) = G_ANYEXT %1
96     $w0 = COPY %2
97 ...
99 ---
100 name:            test_anyext_with_copy
101 body: |
102   bb.0.entry:
103     liveins: $x0
104     ; CHECK-LABEL: name: test_anyext
105     ; CHECK: [[T0:%[0-9]+]]:_(p0) = COPY $x0
106     ; CHECK: [[T1:%[0-9]+]]:_(s32) = G_LOAD [[T0]](p0) :: (load 1 from %ir.addr)
107     ; CHECK: $w0 = COPY [[T1]](s32)
108     %0:_(p0) = COPY $x0
109     %1:_(s8) = G_LOAD %0 :: (load 1 from %ir.addr)
110     %2:_(s8) = COPY %1
111     %3:_(s32) = G_ANYEXT %1
112     $w0 = COPY %3
116 name:            test_signext
117 body: |
118   bb.0.entry:
119     liveins: $x0
120     ; CHECK-LABEL: name: test_signext
121     ; CHECK: [[T0:%[0-9]+]]:_(p0) = COPY $x0
122     ; CHECK: [[T1:%[0-9]+]]:_(s32) = G_SEXTLOAD [[T0]](p0) :: (load 1 from %ir.addr)
123     ; CHECK: $w0 = COPY [[T1]](s32)
124     %0:_(p0) = COPY $x0
125     %1:_(s8) = G_LOAD %0 :: (load 1 from %ir.addr)
126     %2:_(s32) = G_SEXT %1
127     $w0 = COPY %2
131 name:            test_zeroext
132 body: |
133   bb.0.entry:
134     liveins: $x0
135     ; CHECK-LABEL: name: test_zeroext
136     ; CHECK: [[T0:%[0-9]+]]:_(p0) = COPY $x0
137     ; CHECK: [[T1:%[0-9]+]]:_(s32) = G_ZEXTLOAD [[T0]](p0) :: (load 1 from %ir.addr)
138     ; CHECK: $w0 = COPY [[T1]](s32)
139     %0:_(p0) = COPY $x0
140     %1:_(s8) = G_LOAD %0 :: (load 1 from %ir.addr)
141     %2:_(s32) = G_ZEXT %1
142     $w0 = COPY %2
146 name:            test_2anyext
147 body: |
148   bb.0.entry:
149     liveins: $x0
150     ; CHECK-LABEL: name: test_2anyext
151     ; CHECK: [[T0:%[0-9]+]]:_(p0) = COPY $x0
152     ; CHECK: [[T1:%[0-9]+]]:_(s32) = G_LOAD [[T0]](p0) :: (load 1 from %ir.addr)
153     ; CHECK: $w0 = COPY [[T1]](s32)
154     ; CHECK: $w1 = COPY [[T1]](s32)
155     %0:_(p0) = COPY $x0
156     %1:_(s8) = G_LOAD %0 :: (load 1 from %ir.addr)
157     %2:_(s32) = G_ANYEXT %1
158     %3:_(s32) = G_ANYEXT %1
159     $w0 = COPY %2
160     $w1 = COPY %3
164 name:            test_1anyext_1signext
165 body: |
166   bb.0.entry:
167     liveins: $x0
168     ; CHECK-LABEL: name: test_1anyext_1signext
169     ; CHECK: [[T0:%[0-9]+]]:_(p0) = COPY $x0
170     ; CHECK: [[T1:%[0-9]+]]:_(s32) = G_SEXTLOAD [[T0]](p0) :: (load 1 from %ir.addr)
171     ; CHECK: $w0 = COPY [[T1]](s32)
172     ; CHECK: $w1 = COPY [[T1]](s32)
173     %0:_(p0) = COPY $x0
174     %1:_(s8) = G_LOAD %0 :: (load 1 from %ir.addr)
175     %2:_(s32) = G_ANYEXT %1
176     %3:_(s32) = G_SEXT %1
177     $w0 = COPY %2
178     $w1 = COPY %3
182 name:            test_1xor_1signext
183 body: |
184   bb.0.entry:
185     liveins: $x0
186     ; CHECK-LABEL: name: test_1xor_1signext
187     ; CHECK: [[T0:%[0-9]+]]:_(p0) = COPY $x0
188     ; CHECK: [[T1:%[0-9]+]]:_(s32) = G_SEXTLOAD [[T0]](p0) :: (load 1 from %ir.addr)
189     ; CHECK: [[T2:%[0-9]+]]:_(s8) = G_TRUNC [[T1]]
190     ; CHECK: [[T3:%[0-9]+]]:_(s8) = G_XOR [[T2]], {{%[0-9]+}}
191     ; CHECK: [[T4:%[0-9]+]]:_(s32) = G_ANYEXT [[T3]]
192     ; CHECK: $w0 = COPY [[T4]](s32)
193     ; CHECK: $w1 = COPY [[T1]](s32)
194     %0:_(p0) = COPY $x0
195     %1:_(s8) = G_LOAD %0 :: (load 1 from %ir.addr)
196     %2:_(s8) = G_CONSTANT i8 -1
197     %3:_(s8) = G_XOR %1, %2
198     %5:_(s32) = G_ANYEXT %3
199     %6:_(s32) = G_SEXT %1
200     $w0 = COPY %5
201     $w1 = COPY %6
205 name:            test_1anyext_1zeroext
206 body: |
207   bb.0.entry:
208     liveins: $x0
209     ; CHECK-LABEL: name: test_1anyext_1zeroext
210     ; CHECK: [[T0:%[0-9]+]]:_(p0) = COPY $x0
211     ; CHECK: [[T1:%[0-9]+]]:_(s32) = G_ZEXTLOAD [[T0]](p0) :: (load 1 from %ir.addr)
212     ; CHECK: $w0 = COPY [[T1]](s32)
213     ; CHECK: $w1 = COPY [[T1]](s32)
214     %0:_(p0) = COPY $x0
215     %1:_(s8) = G_LOAD %0 :: (load 1 from %ir.addr)
216     %2:_(s32) = G_ANYEXT %1
217     %3:_(s32) = G_ZEXT %1
218     $w0 = COPY %2
219     $w1 = COPY %3
223 name:            test_1signext_1zeroext
224 body: |
225   bb.0.entry:
226     liveins: $x0
227     ; CHECK-LABEL: name: test_1signext_1zeroext
228     ; CHECK: [[T0:%[0-9]+]]:_(p0) = COPY $x0
229     ; CHECK: [[T1:%[0-9]+]]:_(s32) = G_SEXTLOAD [[T0]](p0) :: (load 1 from %ir.addr)
230     ; CHECK: [[T2:%[0-9]+]]:_(s8) = G_TRUNC [[T1]]
231     ; CHECK: [[T3:%[0-9]+]]:_(s32) = G_ZEXT [[T2]]
232     ; CHECK: $w0 = COPY [[T3]](s32)
233     ; CHECK: $w1 = COPY [[T1]](s32)
234     %0:_(p0) = COPY $x0
235     %1:_(s8) = G_LOAD %0 :: (load 1 from %ir.addr)
236     %2:_(s32) = G_ZEXT %1
237     %3:_(s32) = G_SEXT %1
238     $w0 = COPY %2
239     $w1 = COPY %3
243 name:            test_1anyext64_1signext32
244 body: |
245   bb.0.entry:
246     liveins: $x0
247     ; CHECK-LABEL: name: test_1anyext64_1signext32
248     ; CHECK: [[T0:%[0-9]+]]:_(p0) = COPY $x0
249     ; CHECK: [[T1:%[0-9]+]]:_(s32) = G_SEXTLOAD [[T0]](p0) :: (load 1 from %ir.addr)
250     ; CHECK: [[T2:%[0-9]+]]:_(s64) = G_ANYEXT [[T1]]
251     ; CHECK: $x0 = COPY [[T2]](s64)
252     ; CHECK: $w1 = COPY [[T1]](s32)
253     %0:_(p0) = COPY $x0
254     %1:_(s8) = G_LOAD %0 :: (load 1 from %ir.addr)
255     %2:_(s64) = G_ANYEXT %1
256     %3:_(s32) = G_SEXT %1
257     $x0 = COPY %2
258     $w1 = COPY %3
262 name:            test_1anyext32_1signext64
263 body: |
264   bb.0.entry:
265     liveins: $x0
266     ; CHECK-LABEL: name: test_1anyext32_1signext64
267     ; CHECK: [[T0:%[0-9]+]]:_(p0) = COPY $x0
268     ; CHECK: [[T1:%[0-9]+]]:_(s64) = G_SEXTLOAD [[T0]](p0) :: (load 1 from %ir.addr)
269     ; CHECK: [[T2:%[0-9]+]]:_(s8) = G_TRUNC [[T1]]
270     ; CHECK: [[T3:%[0-9]+]]:_(s32) = G_ANYEXT [[T2]]
271     ; CHECK: $w0 = COPY [[T3]](s32)
272     ; CHECK: $x1 = COPY [[T1]](s64)
273     %0:_(p0) = COPY $x0
274     %1:_(s8) = G_LOAD %0 :: (load 1 from %ir.addr)
275     %2:_(s32) = G_ANYEXT %1
276     %3:_(s64) = G_SEXT %1
277     $w0 = COPY %2
278     $x1 = COPY %3
282 name:            test_2anyext32_1signext64
283 body: |
284   bb.0.entry:
285     liveins: $x0
286     ; CHECK-LABEL: name: test_2anyext32_1signext64
287     ; CHECK: [[T0:%[0-9]+]]:_(p0) = COPY $x0
288     ; CHECK: [[T1:%[0-9]+]]:_(s64) = G_SEXTLOAD [[T0]](p0) :: (load 1 from %ir.addr)
289     ; CHECK: [[T2:%[0-9]+]]:_(s8) = G_TRUNC [[T1]]
290     ; CHECK: [[T3:%[0-9]+]]:_(s32) = G_ANYEXT [[T2]]
291     ; CHECK: [[T5:%[0-9]+]]:_(s32) = G_ANYEXT [[T2]]
292     ; CHECK: $w0 = COPY [[T3]](s32)
293     ; CHECK: $x1 = COPY [[T1]](s64)
294     ; CHECK: $w2 = COPY [[T5]](s32)
295     %0:_(p0) = COPY $x0
296     %1:_(s8) = G_LOAD %0 :: (load 1 from %ir.addr)
297     %2:_(s32) = G_ANYEXT %1
298     %3:_(s64) = G_SEXT %1
299     %4:_(s32) = G_ANYEXT %1
300     $w0 = COPY %2
301     $x1 = COPY %3
302     $w2 = COPY %4
306 name:            test_multiblock_anyext
307 body: |
308   bb.0.entry:
309     liveins: $x0
310     ; CHECK-LABEL: name: test_multiblock_anyext
311     ; CHECK: [[T0:%[0-9]+]]:_(p0) = COPY $x0
312     ; CHECK: [[T1:%[0-9]+]]:_(s32) = G_LOAD [[T0]](p0) :: (load 1 from %ir.addr)
313     ; CHECK: G_BR %bb.1
314     ; CHECK: $w0 = COPY [[T1]](s32)
315     %0:_(p0) = COPY $x0
316     %1:_(s8) = G_LOAD %0 :: (load 1 from %ir.addr)
317     G_BR %bb.1
318   bb.1:
319     %2:_(s32) = G_ANYEXT %1
320     $w0 = COPY %2
324 name:            test_multiblock_signext
325 body: |
326   bb.0.entry:
327     liveins: $x0
328     ; CHECK-LABEL: name: test_multiblock_signext
329     ; CHECK: [[T0:%[0-9]+]]:_(p0) = COPY $x0
330     ; CHECK: [[T1:%[0-9]+]]:_(s32) = G_SEXTLOAD [[T0]](p0) :: (load 1 from %ir.addr)
331     ; CHECK: $w0 = COPY [[T1]](s32)
332     %0:_(p0) = COPY $x0
333     %1:_(s8) = G_LOAD %0 :: (load 1 from %ir.addr)
334     G_BR %bb.1
335   bb.1:
336     %2:_(s32) = G_SEXT %1
337     $w0 = COPY %2
341 name:            test_multiblock_zeroext
342 body: |
343   bb.0.entry:
344     liveins: $x0
345     ; CHECK-LABEL: name: test_multiblock_zeroext
346     ; CHECK: [[T0:%[0-9]+]]:_(p0) = COPY $x0
347     ; CHECK: [[T1:%[0-9]+]]:_(s32) = G_ZEXTLOAD [[T0]](p0) :: (load 1 from %ir.addr)
348     ; CHECK: $w0 = COPY [[T1]](s32)
349     %0:_(p0) = COPY $x0
350     %1:_(s8) = G_LOAD %0 :: (load 1 from %ir.addr)
351     G_BR %bb.1
352   bb.1:
353     %2:_(s32) = G_ZEXT %1
354     $w0 = COPY %2
358 name:            test_multiblock_2anyext
359 body: |
360   bb.0.entry:
361     liveins: $x0
362     ; CHECK-LABEL: name: test_multiblock
363     ; CHECK: [[T0:%[0-9]+]]:_(p0) = COPY $x0
364     ; CHECK: [[T1:%[0-9]+]]:_(s32) = G_LOAD [[T0]](p0) :: (load 1 from %ir.addr)
365     ; CHECK: $w0 = COPY [[T1]](s32)
366     ; CHECK: $w1 = COPY [[T1]](s32)
367     %0:_(p0) = COPY $x0
368     %1:_(s8) = G_LOAD %0 :: (load 1 from %ir.addr)
369     %2:_(s32) = G_ANYEXT %1
370     G_BR %bb.1
371   bb.1:
372     %3:_(s32) = G_ANYEXT %1
373     $w0 = COPY %2
374     $w1 = COPY %3
378 name:            test_multiblock_1anyext64_1signext32
379 body: |
380   bb.0.entry:
381     liveins: $x0
382     ; CHECK-LABEL: name: test_multiblock_1anyext64_1signext32
383     ; CHECK: [[T0:%[0-9]+]]:_(p0) = COPY $x0
384     ; CHECK: [[T1:%[0-9]+]]:_(s32) = G_SEXTLOAD [[T0]](p0) :: (load 1 from %ir.addr)
385     ; CHECK: G_BR %bb.1
386     ; CHECK: [[T2:%[0-9]+]]:_(s64) = G_ANYEXT [[T1]]
387     ; CHECK: $x0 = COPY [[T2]](s64)
388     ; CHECK: $w1 = COPY [[T1]](s32)
389     %0:_(p0) = COPY $x0
390     %1:_(s8) = G_LOAD %0 :: (load 1 from %ir.addr)
391     G_BR %bb.1
392   bb.1:
393     %2:_(s64) = G_ANYEXT %1
394     %3:_(s32) = G_SEXT %1
395     $x0 = COPY %2
396     $w1 = COPY %3
400 name:            test_multiblock_1anyext32_1signext64
401 body: |
402   bb.0.entry:
403     liveins: $x0
404     ; CHECK-LABEL: name: test_multiblock_1anyext32_1signext64
405     ; CHECK: [[T0:%[0-9]+]]:_(p0) = COPY $x0
406     ; CHECK: [[T1:%[0-9]+]]:_(s64) = G_SEXTLOAD [[T0]](p0) :: (load 1 from %ir.addr)
407     ; CHECK: G_BR %bb.1
408     ; CHECK: [[T2:%[0-9]+]]:_(s8) = G_TRUNC [[T1]]
409     ; CHECK: [[T3:%[0-9]+]]:_(s32) = G_ANYEXT [[T2]]
410     ; CHECK: $w0 = COPY [[T3]](s32)
411     ; CHECK: $x1 = COPY [[T1]](s64)
412     %0:_(p0) = COPY $x0
413     %1:_(s8) = G_LOAD %0 :: (load 1 from %ir.addr)
414     G_BR %bb.1
415   bb.1:
416     %2:_(s32) = G_ANYEXT %1
417     %3:_(s64) = G_SEXT %1
418     $w0 = COPY %2
419     $x1 = COPY %3
423 name:            test_multiblock_2anyext32_1signext64
424 body: |
425   bb.0.entry:
426     liveins: $x0
427     ; CHECK-LABEL: name: test_multiblock_2anyext32_1signext64
428     ; CHECK: [[T0:%[0-9]+]]:_(p0) = COPY $x0
429     ; CHECK: [[T1:%[0-9]+]]:_(s64) = G_SEXTLOAD [[T0]](p0) :: (load 1 from %ir.addr)
430     ; CHECK: [[T2:%[0-9]+]]:_(s8) = G_TRUNC [[T1]]
431     ; CHECK: [[T3:%[0-9]+]]:_(s32) = G_ANYEXT [[T2]]
432     ; CHECK: G_BR %bb.1
433     ; CHECK: [[T4:%[0-9]+]]:_(s8) = G_TRUNC [[T1]]
434     ; CHECK: [[T5:%[0-9]+]]:_(s32) = G_ANYEXT [[T4]]
435     ; CHECK: $w0 = COPY [[T5]](s32)
436     ; CHECK: $x1 = COPY [[T1]](s64)
437     ; CHECK: $w2 = COPY [[T3]](s32)
438     %0:_(p0) = COPY $x0
439     %1:_(s8) = G_LOAD %0 :: (load 1 from %ir.addr)
440     %4:_(s32) = G_ANYEXT %1
441     G_BR %bb.1
442   bb.1:
443     %2:_(s32) = G_ANYEXT %1
444     %3:_(s64) = G_SEXT %1
445     $w0 = COPY %2
446     $x1 = COPY %3
447     $w2 = COPY %4