[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / AArch64 / GlobalISel / prelegalizercombiner-prop-extends-phi.mir
blob4719bb320d4cd4e692e67d9e3de9d48d5d6f81c7
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -mtriple aarch64-apple-darwin -debugify-and-strip-all-safe -run-pass=aarch64-prelegalizer-combiner -global-isel -verify-machineinstrs %s -o - | FileCheck %s
4 # Check that we propagate the G_SEXT to the sources of the phi operand.
5 ---
6 name:            sext_icst_through_phi
7 tracksRegLiveness: true
8 body:             |
9   ; CHECK-LABEL: name: sext_icst_through_phi
10   ; CHECK: bb.0.entry:
11   ; CHECK:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
12   ; CHECK:   liveins: $w0, $w1
13   ; CHECK:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
14   ; CHECK:   %one:_(s32) = G_CONSTANT i32 2
15   ; CHECK:   %cmp:_(s1) = G_ICMP intpred(sle), [[COPY]](s32), %one
16   ; CHECK:   G_BRCOND %cmp(s1), %bb.2
17   ; CHECK:   G_BR %bb.1
18   ; CHECK: bb.1:
19   ; CHECK:   successors: %bb.3(0x80000000)
20   ; CHECK:   %cst32_4:_(s32) = G_CONSTANT i32 4
21   ; CHECK:   [[SEXT:%[0-9]+]]:_(s64) = G_SEXT %cst32_4(s32)
22   ; CHECK:   G_BR %bb.3
23   ; CHECK: bb.2:
24   ; CHECK:   successors: %bb.3(0x80000000)
25   ; CHECK:   %cst32_10:_(s32) = G_CONSTANT i32 10
26   ; CHECK:   [[SEXT1:%[0-9]+]]:_(s64) = G_SEXT %cst32_10(s32)
27   ; CHECK: bb.3:
28   ; CHECK:   %ext:_(s64) = G_PHI [[SEXT]](s64), %bb.1, [[SEXT1]](s64), %bb.2
29   ; CHECK:   $x0 = COPY %ext(s64)
30   ; CHECK:   RET_ReallyLR implicit $x0
31   bb.1.entry:
32     liveins: $w0, $w1
34     %0:_(s32) = COPY $w0
35     %1:_(s32) = COPY $w1
36     %zero:_(s32) = G_CONSTANT i32 0
37     %one:_(s32) = G_CONSTANT i32 2
38     %cmp:_(s1) = G_ICMP intpred(sgt), %0(s32), %one
39     G_BRCOND %cmp(s1), %bb.2
40     G_BR %bb.3
42   bb.2:
43     %cst32_4:_(s32) = G_CONSTANT i32 4
44     G_BR %bb.4
46   bb.3:
47     %cst32_10:_(s32) = G_CONSTANT i32 10
49   bb.4:
50     %phi:_(s32) = G_PHI %cst32_4(s32), %bb.2, %cst32_10(s32), %bb.3
51     %ext:_(s64) = G_SEXT %phi
52     $x0 = COPY %ext(s64)
53     RET_ReallyLR implicit $x0
55 ...
57 # Check that we propagate the G_ZEXT to the sources of the phi operand.
58 ---
59 name:            zext_icst_through_phi
60 tracksRegLiveness: true
61 body:             |
62   ; CHECK-LABEL: name: zext_icst_through_phi
63   ; CHECK: bb.0.entry:
64   ; CHECK:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
65   ; CHECK:   liveins: $w0, $w1
66   ; CHECK:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
67   ; CHECK:   %one:_(s32) = G_CONSTANT i32 2
68   ; CHECK:   %cmp:_(s1) = G_ICMP intpred(sle), [[COPY]](s32), %one
69   ; CHECK:   G_BRCOND %cmp(s1), %bb.2
70   ; CHECK:   G_BR %bb.1
71   ; CHECK: bb.1:
72   ; CHECK:   successors: %bb.3(0x80000000)
73   ; CHECK:   %cst32_4:_(s32) = G_CONSTANT i32 4
74   ; CHECK:   [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT %cst32_4(s32)
75   ; CHECK:   G_BR %bb.3
76   ; CHECK: bb.2:
77   ; CHECK:   successors: %bb.3(0x80000000)
78   ; CHECK:   %cst32_10:_(s32) = G_CONSTANT i32 10
79   ; CHECK:   [[ZEXT1:%[0-9]+]]:_(s64) = G_ZEXT %cst32_10(s32)
80   ; CHECK: bb.3:
81   ; CHECK:   %ext:_(s64) = G_PHI [[ZEXT]](s64), %bb.1, [[ZEXT1]](s64), %bb.2
82   ; CHECK:   $x0 = COPY %ext(s64)
83   ; CHECK:   RET_ReallyLR implicit $x0
84   bb.1.entry:
85     liveins: $w0, $w1
87     %0:_(s32) = COPY $w0
88     %1:_(s32) = COPY $w1
89     %zero:_(s32) = G_CONSTANT i32 0
90     %one:_(s32) = G_CONSTANT i32 2
91     %cmp:_(s1) = G_ICMP intpred(sgt), %0(s32), %one
92     G_BRCOND %cmp(s1), %bb.2
93     G_BR %bb.3
95   bb.2:
96     %cst32_4:_(s32) = G_CONSTANT i32 4
97     G_BR %bb.4
99   bb.3:
100     %cst32_10:_(s32) = G_CONSTANT i32 10
102   bb.4:
103     %phi:_(s32) = G_PHI %cst32_4(s32), %bb.2, %cst32_10(s32), %bb.3
104     %ext:_(s64) = G_ZEXT %phi
105     $x0 = COPY %ext(s64)
106     RET_ReallyLR implicit $x0
110 # Don't handle vectors because of potential cost issues.
112 name:            sext_load_through_phi_vector
113 tracksRegLiveness: true
114 body:             |
115   ; CHECK-LABEL: name: sext_load_through_phi_vector
116   ; CHECK: bb.0.entry:
117   ; CHECK:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
118   ; CHECK:   liveins: $x0, $q0, $q1
119   ; CHECK:   %ptr:_(p0) = COPY $x0
120   ; CHECK:   %cmp:_(s1) = G_IMPLICIT_DEF
121   ; CHECK:   G_BRCOND %cmp(s1), %bb.2
122   ; CHECK:   G_BR %bb.1
123   ; CHECK: bb.1:
124   ; CHECK:   successors: %bb.3(0x80000000)
125   ; CHECK:   %ld1:_(<4 x s32>) = G_LOAD %ptr(p0) :: (load (<4 x s32>))
126   ; CHECK:   G_BR %bb.3
127   ; CHECK: bb.2:
128   ; CHECK:   successors: %bb.3(0x80000000)
129   ; CHECK:   %ld2:_(<4 x s32>) = G_LOAD %ptr(p0) :: (load (<4 x s32>))
130   ; CHECK: bb.3:
131   ; CHECK:   %phi:_(<4 x s32>) = G_PHI %ld1(<4 x s32>), %bb.1, %ld2(<4 x s32>), %bb.2
132   ; CHECK:   %ext:_(<4 x s64>) = G_SEXT %phi(<4 x s32>)
133   ; CHECK:   G_STORE %ext(<4 x s64>), %ptr(p0) :: (store (<4 x s64>))
134   ; CHECK:   RET_ReallyLR
135   bb.1.entry:
136     liveins: $x0, $q0, $q1
138     %0:_(<4 x s32>) = COPY $q0
139     %1:_(<4 x s32>) = COPY $q1
140     %ptr:_(p0) = COPY $x0
141     %cmp:_(s1) = G_IMPLICIT_DEF
142     G_BRCOND %cmp(s1), %bb.2
143     G_BR %bb.3
145   bb.2:
146     %ld1:_(<4 x s32>) = G_LOAD %ptr(p0) :: (load (<4 x s32>))
147     G_BR %bb.4
149   bb.3:
150     %ld2:_(<4 x s32>) = G_LOAD %ptr(p0) :: (load (<4 x s32>))
152   bb.4:
153     %phi:_(<4 x s32>) = G_PHI %ld1(<4 x s32>), %bb.2, %ld2(<4 x s32>), %bb.3
154     %ext:_(<4 x s64>) = G_SEXT %phi
155     G_STORE %ext(<4 x s64>), %ptr(p0) :: (store (<4 x s64>))
156     RET_ReallyLR
161 # Check that we don't propagate if the extend is used by a G_PTR_ADD, which on
162 # AArch64 has a good chance of folding in the extend.
164 name:            sext_icst_through_phi_used_by_ptradd
165 tracksRegLiveness: true
166 body:             |
167   ; CHECK-LABEL: name: sext_icst_through_phi_used_by_ptradd
168   ; CHECK: bb.0.entry:
169   ; CHECK:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
170   ; CHECK:   liveins: $w0, $w1, $x2
171   ; CHECK:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
172   ; CHECK:   %base:_(p0) = COPY $x2
173   ; CHECK:   %one:_(s32) = G_CONSTANT i32 2
174   ; CHECK:   %cmp:_(s1) = G_ICMP intpred(sle), [[COPY]](s32), %one
175   ; CHECK:   G_BRCOND %cmp(s1), %bb.2
176   ; CHECK:   G_BR %bb.1
177   ; CHECK: bb.1:
178   ; CHECK:   successors: %bb.3(0x80000000)
179   ; CHECK:   %cst32_4:_(s32) = G_CONSTANT i32 4
180   ; CHECK:   G_BR %bb.3
181   ; CHECK: bb.2:
182   ; CHECK:   successors: %bb.3(0x80000000)
183   ; CHECK:   %cst32_10:_(s32) = G_CONSTANT i32 10
184   ; CHECK: bb.3:
185   ; CHECK:   %phi:_(s32) = G_PHI %cst32_4(s32), %bb.1, %cst32_10(s32), %bb.2
186   ; CHECK:   %ext:_(s64) = G_SEXT %phi(s32)
187   ; CHECK:   %ptr:_(p0) = G_PTR_ADD %base, %ext(s64)
188   ; CHECK:   $x0 = COPY %ptr(p0)
189   ; CHECK:   RET_ReallyLR implicit $x0
190   bb.1.entry:
191     liveins: $w0, $w1, $x2
193     %0:_(s32) = COPY $w0
194     %1:_(s32) = COPY $w1
195     %base:_(p0) = COPY $x2
196     %zero:_(s32) = G_CONSTANT i32 0
197     %one:_(s32) = G_CONSTANT i32 2
198     %cmp:_(s1) = G_ICMP intpred(sgt), %0(s32), %one
199     G_BRCOND %cmp(s1), %bb.2
200     G_BR %bb.3
202   bb.2:
203     %cst32_4:_(s32) = G_CONSTANT i32 4
204     G_BR %bb.4
206   bb.3:
207     %cst32_10:_(s32) = G_CONSTANT i32 10
209   bb.4:
210     %phi:_(s32) = G_PHI %cst32_4(s32), %bb.2, %cst32_10(s32), %bb.3
211     %ext:_(s64) = G_SEXT %phi
212     %ptr:_(p0) = G_PTR_ADD %base, %ext
213     $x0 = COPY %ptr(p0)
214     RET_ReallyLR implicit $x0
218 # Same as above but we do it here because the extend has multiple users, so the
219 # it probably won't cost extra instructions if we remove it.
221 name:            sext_icst_through_phi_used_by_ptradd_multiuse
222 tracksRegLiveness: true
223 body:             |
224   ; CHECK-LABEL: name: sext_icst_through_phi_used_by_ptradd_multiuse
225   ; CHECK: bb.0.entry:
226   ; CHECK:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
227   ; CHECK:   liveins: $w0, $w1, $x2
228   ; CHECK:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
229   ; CHECK:   %base:_(p0) = COPY $x2
230   ; CHECK:   %one:_(s32) = G_CONSTANT i32 2
231   ; CHECK:   %cmp:_(s1) = G_ICMP intpred(sle), [[COPY]](s32), %one
232   ; CHECK:   G_BRCOND %cmp(s1), %bb.2
233   ; CHECK:   G_BR %bb.1
234   ; CHECK: bb.1:
235   ; CHECK:   successors: %bb.3(0x80000000)
236   ; CHECK:   %cst32_4:_(s32) = G_CONSTANT i32 4
237   ; CHECK:   [[SEXT:%[0-9]+]]:_(s64) = G_SEXT %cst32_4(s32)
238   ; CHECK:   G_BR %bb.3
239   ; CHECK: bb.2:
240   ; CHECK:   successors: %bb.3(0x80000000)
241   ; CHECK:   %cst32_10:_(s32) = G_CONSTANT i32 10
242   ; CHECK:   [[SEXT1:%[0-9]+]]:_(s64) = G_SEXT %cst32_10(s32)
243   ; CHECK: bb.3:
244   ; CHECK:   %ext:_(s64) = G_PHI [[SEXT]](s64), %bb.1, [[SEXT1]](s64), %bb.2
245   ; CHECK:   %ptr:_(p0) = G_PTR_ADD %base, %ext(s64)
246   ; CHECK:   $x0 = COPY %ptr(p0)
247   ; CHECK:   $x1 = COPY %ext(s64)
248   ; CHECK:   RET_ReallyLR implicit $x0
249   bb.1.entry:
250     liveins: $w0, $w1, $x2
252     %0:_(s32) = COPY $w0
253     %1:_(s32) = COPY $w1
254     %base:_(p0) = COPY $x2
255     %zero:_(s32) = G_CONSTANT i32 0
256     %one:_(s32) = G_CONSTANT i32 2
257     %cmp:_(s1) = G_ICMP intpred(sgt), %0(s32), %one
258     G_BRCOND %cmp(s1), %bb.2
259     G_BR %bb.3
261   bb.2:
262     %cst32_4:_(s32) = G_CONSTANT i32 4
263     G_BR %bb.4
265   bb.3:
266     %cst32_10:_(s32) = G_CONSTANT i32 10
268   bb.4:
269     %phi:_(s32) = G_PHI %cst32_4(s32), %bb.2, %cst32_10(s32), %bb.3
270     %ext:_(s64) = G_SEXT %phi
271     %ptr:_(p0) = G_PTR_ADD %base, %ext
272     $x0 = COPY %ptr(p0)
273     $x1 = COPY %ext(s64)
274     RET_ReallyLR implicit $x0
278 # Check we don't propagate if there are more than 2 unique incoming values in the phi.
279 # Doing so might cause too much code bloat.
281 name:            zext_icst_through_phi_too_many_incoming
282 tracksRegLiveness: true
283 body:             |
284   ; CHECK-LABEL: name: zext_icst_through_phi_too_many_incoming
285   ; CHECK: bb.0.entry:
286   ; CHECK:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
287   ; CHECK:   liveins: $w0, $w1
288   ; CHECK:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
289   ; CHECK:   %one:_(s32) = G_CONSTANT i32 2
290   ; CHECK:   %cmp:_(s1) = G_ICMP intpred(sle), [[COPY]](s32), %one
291   ; CHECK:   G_BRCOND %cmp(s1), %bb.2
292   ; CHECK:   G_BR %bb.1
293   ; CHECK: bb.1:
294   ; CHECK:   successors: %bb.3(0x40000000), %bb.4(0x40000000)
295   ; CHECK:   %cst32_4:_(s32) = G_CONSTANT i32 4
296   ; CHECK:   %cond:_(s1) = G_IMPLICIT_DEF
297   ; CHECK:   G_BRCOND %cond(s1), %bb.3
298   ; CHECK:   G_BR %bb.4
299   ; CHECK: bb.2:
300   ; CHECK:   successors: %bb.4(0x80000000)
301   ; CHECK:   %cst32_10:_(s32) = G_CONSTANT i32 10
302   ; CHECK:   G_BR %bb.4
303   ; CHECK: bb.3:
304   ; CHECK:   successors: %bb.4(0x80000000)
305   ; CHECK:   %cst32_42:_(s32) = G_CONSTANT i32 42
306   ; CHECK: bb.4:
307   ; CHECK:   %phi:_(s32) = G_PHI %cst32_4(s32), %bb.1, %cst32_10(s32), %bb.2, %cst32_42(s32), %bb.3
308   ; CHECK:   %ext:_(s64) = G_ZEXT %phi(s32)
309   ; CHECK:   $x0 = COPY %ext(s64)
310   ; CHECK:   RET_ReallyLR implicit $x0
311   bb.1.entry:
312     liveins: $w0, $w1
314     %0:_(s32) = COPY $w0
315     %1:_(s32) = COPY $w1
316     %zero:_(s32) = G_CONSTANT i32 0
317     %one:_(s32) = G_CONSTANT i32 2
318     %cmp:_(s1) = G_ICMP intpred(sgt), %0(s32), %one
319     G_BRCOND %cmp(s1), %bb.2
320     G_BR %bb.3
322   bb.2:
323     %cst32_4:_(s32) = G_CONSTANT i32 4
324     %cond:_(s1) = G_IMPLICIT_DEF
325     G_BRCOND %cond, %bb.5
326     G_BR %bb.4
328   bb.3:
329     %cst32_10:_(s32) = G_CONSTANT i32 10
330     G_BR %bb.4
332   bb.5:
333     %cst32_42:_(s32) = G_CONSTANT i32 42
335   bb.4:
336     %phi:_(s32) = G_PHI %cst32_4(s32), %bb.2, %cst32_10(s32), %bb.3, %cst32_42(s32), %bb.5
337     %ext:_(s64) = G_ZEXT %phi
338     $x0 = COPY %ext(s64)
339     RET_ReallyLR implicit $x0
343 # Check that we don't propagate if the extension would be of a non-allowed inst.
345 name:            sext_add_through_phi
346 tracksRegLiveness: true
347 body:             |
348   ; CHECK-LABEL: name: sext_add_through_phi
349   ; CHECK: bb.0.entry:
350   ; CHECK:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
351   ; CHECK:   liveins: $w0, $w1
352   ; CHECK:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
353   ; CHECK:   [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
354   ; CHECK:   %one:_(s32) = G_CONSTANT i32 2
355   ; CHECK:   %cmp:_(s1) = G_ICMP intpred(sle), [[COPY]](s32), %one
356   ; CHECK:   G_BRCOND %cmp(s1), %bb.2
357   ; CHECK:   G_BR %bb.1
358   ; CHECK: bb.1:
359   ; CHECK:   successors: %bb.3(0x80000000)
360   ; CHECK:   %add:_(s32) = G_ADD [[COPY]], [[COPY1]]
361   ; CHECK:   G_BR %bb.3
362   ; CHECK: bb.2:
363   ; CHECK:   successors: %bb.3(0x80000000)
364   ; CHECK:   %cst32_10:_(s32) = G_CONSTANT i32 10
365   ; CHECK: bb.3:
366   ; CHECK:   %phi:_(s32) = G_PHI %add(s32), %bb.1, %cst32_10(s32), %bb.2
367   ; CHECK:   %ext:_(s64) = G_SEXT %phi(s32)
368   ; CHECK:   $x0 = COPY %ext(s64)
369   ; CHECK:   RET_ReallyLR implicit $x0
370   bb.1.entry:
371     liveins: $w0, $w1
373     %0:_(s32) = COPY $w0
374     %1:_(s32) = COPY $w1
375     %zero:_(s32) = G_CONSTANT i32 0
376     %one:_(s32) = G_CONSTANT i32 2
377     %cmp:_(s1) = G_ICMP intpred(sgt), %0(s32), %one
378     G_BRCOND %cmp(s1), %bb.2
379     G_BR %bb.3
381   bb.2:
382     %add:_(s32) = G_ADD %0, %1
383     G_BR %bb.4
385   bb.3:
386     %cst32_10:_(s32) = G_CONSTANT i32 10
388   bb.4:
389     %phi:_(s32) = G_PHI %add(s32), %bb.2, %cst32_10(s32), %bb.3
390     %ext:_(s64) = G_SEXT %phi
391     $x0 = COPY %ext(s64)
392     RET_ReallyLR implicit $x0
396 # Same as above but allowed with a G_ANYEXT.
398 name:            anyext_add_through_phi
399 tracksRegLiveness: true
400 body:             |
401   ; CHECK-LABEL: name: anyext_add_through_phi
402   ; CHECK: bb.0.entry:
403   ; CHECK:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
404   ; CHECK:   liveins: $w0, $w1
405   ; CHECK:   [[COPY:%[0-9]+]]:_(s32) = COPY $w0
406   ; CHECK:   [[COPY1:%[0-9]+]]:_(s32) = COPY $w1
407   ; CHECK:   %one:_(s32) = G_CONSTANT i32 2
408   ; CHECK:   %cmp:_(s1) = G_ICMP intpred(sle), [[COPY]](s32), %one
409   ; CHECK:   G_BRCOND %cmp(s1), %bb.2
410   ; CHECK:   G_BR %bb.1
411   ; CHECK: bb.1:
412   ; CHECK:   successors: %bb.3(0x80000000)
413   ; CHECK:   %add:_(s32) = G_ADD [[COPY]], [[COPY1]]
414   ; CHECK:   [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT %add(s32)
415   ; CHECK:   G_BR %bb.3
416   ; CHECK: bb.2:
417   ; CHECK:   successors: %bb.3(0x80000000)
418   ; CHECK:   %cst32_10:_(s32) = G_CONSTANT i32 10
419   ; CHECK:   [[ANYEXT1:%[0-9]+]]:_(s64) = G_ANYEXT %cst32_10(s32)
420   ; CHECK: bb.3:
421   ; CHECK:   %ext:_(s64) = G_PHI [[ANYEXT]](s64), %bb.1, [[ANYEXT1]](s64), %bb.2
422   ; CHECK:   $x0 = COPY %ext(s64)
423   ; CHECK:   RET_ReallyLR implicit $x0
424   bb.1.entry:
425     liveins: $w0, $w1
427     %0:_(s32) = COPY $w0
428     %1:_(s32) = COPY $w1
429     %zero:_(s32) = G_CONSTANT i32 0
430     %one:_(s32) = G_CONSTANT i32 2
431     %cmp:_(s1) = G_ICMP intpred(sgt), %0(s32), %one
432     G_BRCOND %cmp(s1), %bb.2
433     G_BR %bb.3
435   bb.2:
436     %add:_(s32) = G_ADD %0, %1
437     G_BR %bb.4
439   bb.3:
440     %cst32_10:_(s32) = G_CONSTANT i32 10
442   bb.4:
443     %phi:_(s32) = G_PHI %add(s32), %bb.2, %cst32_10(s32), %bb.3
444     %ext:_(s64) = G_ANYEXT %phi
445     $x0 = COPY %ext(s64)
446     RET_ReallyLR implicit $x0