[MIParser] Set RegClassOrRegBank during instruction parsing
[llvm-complete.git] / test / CodeGen / AArch64 / GlobalISel / localizer.mir
blob1eee40dd64867e6d351672c33ced7ba5bad8f964
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -O0 -mtriple=aarch64-apple-ios -run-pass=localizer -verify-machineinstrs %s -o - | FileCheck %s -check-prefix=CHECK
4 # Test the localizer.
6 --- |
7   target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
9   define void @local_use() { ret void }
10   define void @non_local_1use() { ret void }
11   define void @non_local_2uses() { ret void }
12   define void @non_local_phi_use() { ret void }
13   define void @non_local_phi_use_followed_by_use() { ret void }
14   define void @non_local_phi_use_followed_by_use_fi() { ret void }
15   define void @float_non_local_phi_use_followed_by_use_fi() { ret void }
16   define void @non_local_phi() { ret void }
17   define void @non_local_label() { ret void }
19   @var1 = common global i32 0, align 4
20   @var2 = common global i32 0, align 4
21   @var3 = common global i32 0, align 4
22   @var4 = common global i32 0, align 4
24   define i32 @intrablock_with_globalvalue() {
25   entry:
26     %0 = load i32, i32* @var1, align 4
27     %cmp = icmp eq i32 %0, 1
28     br i1 %cmp, label %if.then, label %if.end
30   if.then:
31     store i32 2, i32* @var2, align 4
32     store i32 3, i32* @var1, align 4
33     store i32 2, i32* @var3, align 4
34     store i32 3, i32* @var1, align 4
35     br label %if.end
37   if.end:
38     ret i32 0
39   }
41   define void @test_inttoptr() { ret void }
43 ...
45 ---
46 name:            local_use
47 legalized:       true
48 regBankSelected: true
49 body:             |
50   bb.0:
51     ; CHECK-LABEL: name: local_use
52     ; CHECK: [[C:%[0-9]+]]:gpr(s32) = G_CONSTANT i32 1
53     ; CHECK: [[ADD:%[0-9]+]]:gpr(s32) = G_ADD [[C]], [[C]]
54     %0:gpr(s32) = G_CONSTANT i32 1
55     %1:gpr(s32) = G_ADD %0, %0
56 ...
58 ---
59 name:            non_local_1use
60 legalized:       true
61 regBankSelected: true
62 body:             |
63   ; CHECK-LABEL: name: non_local_1use
64   ; CHECK: bb.0:
65   ; CHECK:   successors: %bb.1(0x80000000)
66   ; CHECK:   [[C:%[0-9]+]]:gpr(s32) = G_CONSTANT i32 1
67   ; CHECK:   [[ADD:%[0-9]+]]:gpr(s32) = G_ADD [[C]], [[C]]
68   ; CHECK: bb.1:
69   ; CHECK:   [[C1:%[0-9]+]]:gpr(s32) = G_CONSTANT i32 1
70   ; CHECK:   [[ADD1:%[0-9]+]]:gpr(s32) = G_ADD [[C1]], [[ADD]]
72   ; Existing registers should be left untouched
73   ; The newly created reg should be on the same regbank/regclass as its origin.
75   bb.0:
76     successors: %bb.1
78     %0:gpr(s32) = G_CONSTANT i32 1
79     %1:gpr(s32) = G_ADD %0, %0
81   bb.1:
82     %2:gpr(s32) = G_ADD %0, %1
83 ...
85 ---
86 name:            non_local_2uses
87 legalized:       true
88 regBankSelected: true
89 body:             |
90   ; CHECK-LABEL: name: non_local_2uses
91   ; CHECK: bb.0:
92   ; CHECK:   successors: %bb.1(0x80000000)
93   ; CHECK:   [[C:%[0-9]+]]:gpr(s32) = G_CONSTANT i32 1
94   ; CHECK:   [[ADD:%[0-9]+]]:gpr(s32) = G_ADD [[C]], [[C]]
95   ; CHECK: bb.1:
96   ; CHECK:   [[C1:%[0-9]+]]:gpr(s32) = G_CONSTANT i32 1
97   ; CHECK:   [[ADD1:%[0-9]+]]:gpr(s32) = G_ADD [[C1]], [[C1]]
99   ; Existing registers should be left untouched
100   ; The newly created reg should be on the same regbank/regclass as its origin.
102   bb.0:
103     successors: %bb.1
105     %0:gpr(s32) = G_CONSTANT i32 1
106     %1:gpr(s32) = G_ADD %0, %0
108   bb.1:
109     %2:gpr(s32) = G_ADD %0, %0
113 name:            non_local_phi_use
114 legalized:       true
115 regBankSelected: true
116 tracksRegLiveness: true
117 body:             |
118   ; CHECK-LABEL: name: non_local_phi_use
119   ; CHECK: bb.0:
120   ; CHECK:   successors: %bb.1(0x80000000)
121   ; CHECK:   [[C:%[0-9]+]]:gpr(s32) = G_CONSTANT i32 1
122   ; CHECK:   [[ADD:%[0-9]+]]:gpr(s32) = G_ADD [[C]], [[C]]
123   ; CHECK: bb.1:
124   ; CHECK:   successors: %bb.2(0x80000000)
125   ; CHECK:   [[C1:%[0-9]+]]:gpr(s32) = G_CONSTANT i32 1
126   ; CHECK: bb.2:
127   ; CHECK:   [[PHI:%[0-9]+]]:gpr(s32) = PHI [[C1]](s32), %bb.1
128   ; CHECK:   [[ADD1:%[0-9]+]]:gpr(s32) = G_ADD [[PHI]], [[PHI]]
130   ; Existing registers should be left untouched
131   ; The newly created reg should be on the same regbank/regclass as its origin.
133   bb.0:
134     successors: %bb.1
136     %0:gpr(s32) = G_CONSTANT i32 1
137     %1:gpr(s32) = G_ADD %0, %0
139   bb.1:
140     successors: %bb.2
142   bb.2:
143     %3:gpr(s32) = PHI %0(s32), %bb.1
144     %2:gpr(s32) = G_ADD %3, %3
148 name:            non_local_phi_use_followed_by_use
149 legalized:       true
150 regBankSelected: true
151 tracksRegLiveness: true
152 body:             |
153   ; CHECK-LABEL: name: non_local_phi_use_followed_by_use
154   ; CHECK: bb.0:
155   ; CHECK:   successors: %bb.1(0x80000000)
156   ; CHECK:   [[C:%[0-9]+]]:gpr(s32) = G_CONSTANT i32 1
157   ; CHECK:   [[ADD:%[0-9]+]]:gpr(s32) = G_ADD [[C]], [[C]]
158   ; CHECK: bb.1:
159   ; CHECK:   successors: %bb.2(0x80000000)
160   ; CHECK:   [[C1:%[0-9]+]]:gpr(s32) = G_CONSTANT i32 1
161   ; CHECK: bb.2:
162   ; CHECK:   [[PHI:%[0-9]+]]:gpr(s32) = PHI [[C1]](s32), %bb.1
163   ; CHECK:   [[C2:%[0-9]+]]:gpr(s32) = G_CONSTANT i32 1
164   ; CHECK:   [[ADD1:%[0-9]+]]:gpr(s32) = G_ADD [[PHI]], [[C2]]
166   ; Existing registers should be left untouched
167   ; The newly created reg should be on the same regbank/regclass as its origin.
169   bb.0:
170     successors: %bb.1
172     %0:gpr(s32) = G_CONSTANT i32 1
173     %1:gpr(s32) = G_ADD %0, %0
175   bb.1:
176     successors: %bb.2
178   bb.2:
179     %3:gpr(s32) = PHI %0(s32), %bb.1
180     %2:gpr(s32) = G_ADD %3, %0
184 name:            non_local_phi_use_followed_by_use_fi
185 legalized:       true
186 regBankSelected: true
187 tracksRegLiveness: true
188 body:             |
189   ; CHECK-LABEL: name: non_local_phi_use_followed_by_use_fi
190   ; CHECK: bb.0:
191   ; CHECK:   successors: %bb.1(0x80000000)
192   ; CHECK:   [[FRAME_INDEX:%[0-9]+]]:gpr(s32) = G_FRAME_INDEX 1
193   ; CHECK:   [[ADD:%[0-9]+]]:gpr(s32) = G_ADD [[FRAME_INDEX]], [[FRAME_INDEX]]
194   ; CHECK: bb.1:
195   ; CHECK:   successors: %bb.2(0x80000000)
196   ; CHECK:   [[FRAME_INDEX1:%[0-9]+]]:gpr(s32) = G_FRAME_INDEX 1
197   ; CHECK: bb.2:
198   ; CHECK:   [[PHI:%[0-9]+]]:gpr(s32) = PHI [[FRAME_INDEX1]](s32), %bb.1
199   ; CHECK:   [[FRAME_INDEX2:%[0-9]+]]:gpr(s32) = G_FRAME_INDEX 1
200   ; CHECK:   [[ADD1:%[0-9]+]]:gpr(s32) = G_ADD [[PHI]], [[FRAME_INDEX2]]
202   ; Existing registers should be left untouched
203   ; The newly created reg should be on the same regbank/regclass as its origin.
205   bb.0:
206     successors: %bb.1
208     %0:gpr(s32) = G_FRAME_INDEX 1
209     %1:gpr(s32) = G_ADD %0, %0
211   bb.1:
212     successors: %bb.2
214   bb.2:
215     %3:gpr(s32) = PHI %0(s32), %bb.1
216     %2:gpr(s32) = G_ADD %3, %0
220 name:            float_non_local_phi_use_followed_by_use_fi
221 legalized:       true
222 regBankSelected: true
223 tracksRegLiveness: true
224 body:             |
225   ; CHECK-LABEL: name: float_non_local_phi_use_followed_by_use_fi
226   ; CHECK: bb.0:
227   ; CHECK:   successors: %bb.1(0x80000000)
228   ; CHECK:   [[C:%[0-9]+]]:fpr(s32) = G_FCONSTANT float 1.000000e+00
229   ; CHECK:   [[FADD:%[0-9]+]]:fpr(s32) = G_FADD [[C]], [[C]]
230   ; CHECK: bb.1:
231   ; CHECK:   successors: %bb.2(0x80000000)
232   ; CHECK:   [[C1:%[0-9]+]]:fpr(s32) = G_FCONSTANT float 1.000000e+00
233   ; CHECK: bb.2:
234   ; CHECK:   [[PHI:%[0-9]+]]:fpr(s32) = PHI [[C1]](s32), %bb.1
235   ; CHECK:   [[C2:%[0-9]+]]:fpr(s32) = G_FCONSTANT float 1.000000e+00
236   ; CHECK:   [[FADD1:%[0-9]+]]:fpr(s32) = G_FADD [[PHI]], [[C2]]
238   ; Existing registers should be left untouched
239   ; The newly created reg should be on the same regbank/regclass as its origin.
241   bb.0:
242     successors: %bb.1
244     %0:fpr(s32) = G_FCONSTANT float 1.0
245     %1:fpr(s32) = G_FADD %0, %0
247   bb.1:
248     successors: %bb.2
250   bb.2:
251     %3:fpr(s32) = PHI %0(s32), %bb.1
252     %2:fpr(s32) = G_FADD %3, %0
256 # Make sure we don't insert a constant before PHIs.
257 # This used to happen for loops of one basic block.
258 name:            non_local_phi
259 legalized:       true
260 regBankSelected: true
261 tracksRegLiveness: true
262 body:             |
263   ; CHECK-LABEL: name: non_local_phi
264   ; CHECK: bb.0:
265   ; CHECK:   successors: %bb.1(0x80000000)
266   ; CHECK:   [[C:%[0-9]+]]:fpr(s32) = G_FCONSTANT float 1.000000e+00
267   ; CHECK:   [[FADD:%[0-9]+]]:fpr(s32) = G_FADD [[C]], [[C]]
268   ; CHECK: bb.1:
269   ; CHECK:   successors: %bb.1(0x80000000)
270   ; CHECK:   [[PHI:%[0-9]+]]:fpr(s32) = PHI [[FADD]](s32), %bb.0, %4(s32), %bb.1
271   ; CHECK:   [[C1:%[0-9]+]]:fpr(s32) = G_FCONSTANT float 1.000000e+00
272   ; CHECK:   [[FADD1:%[0-9]+]]:fpr(s32) = G_FADD [[PHI]], [[FADD]]
273   ; CHECK:   G_BR %bb.1
275   ; Existing registers should be left untouched
276   ; The newly created reg should be on the same regbank/regclass as its origin.
278   bb.0:
279     successors: %bb.1
281     %0:fpr(s32) = G_FCONSTANT float 1.0
282     %1:fpr(s32) = G_FADD %0, %0
284   bb.1:
285     successors: %bb.1
287     %3:fpr(s32) = PHI %1(s32), %bb.0, %0(s32), %bb.1
288     %2:fpr(s32) = G_FADD %3, %1
289     G_BR %bb.1
293 # Make sure we don't insert a constant before EH_LABELs.
294 name:            non_local_label
295 legalized:       true
296 regBankSelected: true
297 tracksRegLiveness: true
298 body:             |
299   ; CHECK-LABEL: name: non_local_label
300   ; CHECK: bb.0:
301   ; CHECK:   successors: %bb.1(0x80000000)
302   ; CHECK:   liveins: $s0
303   ; CHECK:   [[COPY:%[0-9]+]]:fpr(s32) = COPY $s0
304   ; CHECK:   [[C:%[0-9]+]]:fpr(s32) = G_FCONSTANT float 1.000000e+00
305   ; CHECK: bb.1:
306   ; CHECK:   successors: %bb.1(0x80000000)
307   ; CHECK:   EH_LABEL 1
308   ; CHECK:   [[C1:%[0-9]+]]:fpr(s32) = G_FCONSTANT float 1.000000e+00
309   ; CHECK:   [[FADD:%[0-9]+]]:fpr(s32) = G_FADD [[COPY]], [[C1]]
310   ; CHECK:   G_BR %bb.1
312   ; Existing registers should be left untouched
313   ; The newly created reg should be on the same regbank/regclass as its origin.
315   bb.0:
316     liveins: $s0
317     successors: %bb.1
319     %0:fpr(s32) = COPY $s0
320     %1:fpr(s32) = G_FCONSTANT float 1.0
322   bb.1:
323     successors: %bb.1
325     EH_LABEL 1
326     %2:fpr(s32) = G_FADD %0, %1
327     G_BR %bb.1
330 name:            intrablock_with_globalvalue
331 legalized:       true
332 regBankSelected: true
333 tracksRegLiveness: true
334 body:             |
335   ; CHECK-LABEL: name: intrablock_with_globalvalue
336   ; CHECK: bb.0.entry:
337   ; CHECK:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
338   ; CHECK:   [[GV:%[0-9]+]]:gpr(p0) = G_GLOBAL_VALUE @var1
339   ; CHECK:   [[C:%[0-9]+]]:gpr(s32) = G_CONSTANT i32 1
340   ; CHECK:   [[C1:%[0-9]+]]:gpr(s32) = G_CONSTANT i32 2
341   ; CHECK:   [[GV1:%[0-9]+]]:gpr(p0) = G_GLOBAL_VALUE @var2
342   ; CHECK:   [[C2:%[0-9]+]]:gpr(s32) = G_CONSTANT i32 3
343   ; CHECK:   [[GV2:%[0-9]+]]:gpr(p0) = G_GLOBAL_VALUE @var3
344   ; CHECK:   [[C3:%[0-9]+]]:gpr(s32) = G_CONSTANT i32 0
345   ; CHECK:   [[LOAD:%[0-9]+]]:gpr(s32) = G_LOAD [[GV]](p0) :: (load 4 from @var1)
346   ; CHECK:   [[ICMP:%[0-9]+]]:gpr(s32) = G_ICMP intpred(eq), [[LOAD]](s32), [[C]]
347   ; CHECK:   [[TRUNC:%[0-9]+]]:gpr(s1) = G_TRUNC [[ICMP]](s32)
348   ; CHECK:   G_BRCOND [[TRUNC]](s1), %bb.1
349   ; CHECK:   G_BR %bb.2
350   ; CHECK: bb.1.if.then:
351   ; CHECK:   successors: %bb.2(0x80000000)
352   ; CHECK:   [[GV3:%[0-9]+]]:gpr(p0) = G_GLOBAL_VALUE @var2
353   ; CHECK:   [[C4:%[0-9]+]]:gpr(s32) = G_CONSTANT i32 2
354   ; CHECK:   G_STORE [[C4]](s32), [[GV3]](p0) :: (store 4 into @var2)
355   ; CHECK:   [[C5:%[0-9]+]]:gpr(s32) = G_CONSTANT i32 3
356   ; CHECK:   [[GV4:%[0-9]+]]:gpr(p0) = G_GLOBAL_VALUE @var1
357   ; CHECK:   G_STORE [[C5]](s32), [[GV4]](p0) :: (store 4 into @var1)
358   ; CHECK:   [[GV5:%[0-9]+]]:gpr(p0) = G_GLOBAL_VALUE @var3
359   ; CHECK:   G_STORE [[C4]](s32), [[GV5]](p0) :: (store 4 into @var3)
360   ; CHECK:   G_STORE [[C5]](s32), [[GV4]](p0) :: (store 4 into @var1)
361   ; CHECK: bb.2.if.end:
362   ; CHECK:   [[C6:%[0-9]+]]:gpr(s32) = G_CONSTANT i32 0
363   ; CHECK:   $w0 = COPY [[C6]](s32)
364   ; CHECK:   RET_ReallyLR implicit $w0
366   ; Some of these instructions are dead. We're checking that the other instructions are
367   ; sunk immediately before their first user in the if.then block or as close as possible.
368   bb.1.entry:
369     %1:gpr(p0) = G_GLOBAL_VALUE @var1
370     %2:gpr(s32) = G_CONSTANT i32 1
371     %4:gpr(s32) = G_CONSTANT i32 2
372     %5:gpr(p0) = G_GLOBAL_VALUE @var2
373     %6:gpr(s32) = G_CONSTANT i32 3
374     %7:gpr(p0) = G_GLOBAL_VALUE @var3
375     %8:gpr(s32) = G_CONSTANT i32 0
376     %0:gpr(s32) = G_LOAD %1(p0) :: (load 4 from @var1)
377     %9:gpr(s32) = G_ICMP intpred(eq), %0(s32), %2
378     %3:gpr(s1) = G_TRUNC %9(s32)
379     G_BRCOND %3(s1), %bb.2
380     G_BR %bb.3
382   bb.2.if.then:
383     G_STORE %4(s32), %5(p0) :: (store 4 into @var2)
384     G_STORE %6(s32), %1(p0) :: (store 4 into @var1)
385     G_STORE %4(s32), %7(p0) :: (store 4 into @var3)
386     G_STORE %6(s32), %1(p0) :: (store 4 into @var1)
388   bb.3.if.end:
389     $w0 = COPY %8(s32)
390     RET_ReallyLR implicit $w0
394 name:            test_inttoptr
395 alignment:       4
396 legalized:       true
397 regBankSelected: true
398 tracksRegLiveness: true
399 body:             |
400   ; CHECK-LABEL: name: test_inttoptr
401   ; CHECK: bb.0:
402   ; CHECK:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
403   ; CHECK:   liveins: $w0, $x1
404   ; CHECK:   [[COPY:%[0-9]+]]:gpr(s32) = COPY $w0
405   ; CHECK:   [[COPY1:%[0-9]+]]:gpr(p0) = COPY $x1
406   ; CHECK:   [[C:%[0-9]+]]:gpr(s64) = G_CONSTANT i64 128
407   ; CHECK:   [[C1:%[0-9]+]]:gpr(s32) = G_CONSTANT i32 0
408   ; CHECK:   [[C2:%[0-9]+]]:gpr(s64) = G_CONSTANT i64 0
409   ; CHECK:   [[INTTOPTR:%[0-9]+]]:gpr(p0) = G_INTTOPTR [[C2]](s64)
410   ; CHECK:   [[INTTOPTR1:%[0-9]+]]:gpr(p0) = G_INTTOPTR [[C]](s64)
411   ; CHECK:   [[ICMP:%[0-9]+]]:gpr(s32) = G_ICMP intpred(eq), [[COPY]](s32), [[C1]]
412   ; CHECK:   [[TRUNC:%[0-9]+]]:gpr(s1) = G_TRUNC [[ICMP]](s32)
413   ; CHECK:   G_BRCOND [[TRUNC]](s1), %bb.1
414   ; CHECK:   G_BR %bb.2
415   ; CHECK: bb.1:
416   ; CHECK:   [[ADD:%[0-9]+]]:gpr(s32) = G_ADD [[COPY]], [[COPY]]
417   ; CHECK:   G_STORE [[ADD]](s32), [[COPY1]](p0) :: (store 4)
418   ; CHECK:   [[C3:%[0-9]+]]:gpr(s64) = G_CONSTANT i64 128
419   ; CHECK:   [[INTTOPTR2:%[0-9]+]]:gpr(p0) = G_INTTOPTR [[C3]](s64)
420   ; CHECK:   $x0 = COPY [[INTTOPTR2]](p0)
421   ; CHECK:   RET_ReallyLR implicit $x0
422   ; CHECK: bb.2:
423   ; CHECK:   [[C4:%[0-9]+]]:gpr(s64) = G_CONSTANT i64 0
424   ; CHECK:   [[INTTOPTR3:%[0-9]+]]:gpr(p0) = G_INTTOPTR [[C4]](s64)
425   ; CHECK:   $x0 = COPY [[INTTOPTR3]](p0)
426   ; CHECK:   RET_ReallyLR implicit $x0
427   bb.1:
428     liveins: $w0, $x1
430     %0:gpr(s32) = COPY $w0
431     %1:gpr(p0) = COPY $x1
432     %2:gpr(s64) = G_CONSTANT i64 128
433     %4:gpr(s32) = G_CONSTANT i32 0
434     %7:gpr(s64) = G_CONSTANT i64 0
435     %6:gpr(p0) = G_INTTOPTR %7(s64)
436     %3:gpr(p0) = G_INTTOPTR %2(s64)
437     %9:gpr(s32) = G_ICMP intpred(eq), %0(s32), %4
438     %5:gpr(s1) = G_TRUNC %9(s32)
439     G_BRCOND %5(s1), %bb.2
440     G_BR %bb.3
442   bb.2:
443     %8:gpr(s32) = G_ADD %0, %0
444     G_STORE %8(s32), %1(p0) :: (store 4)
445     $x0 = COPY %3(p0)
446     RET_ReallyLR implicit $x0
448   bb.3:
449     $x0 = COPY %6(p0)
450     RET_ReallyLR implicit $x0