[MIParser] Set RegClassOrRegBank during instruction parsing
[llvm-complete.git] / test / CodeGen / AArch64 / GlobalISel / select.mir
blob1425e645a3a797bcb576ea831d09d9e71da7d09e
1 # RUN: llc -O0 -mtriple=aarch64-apple-ios -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=IOS
2 # RUN: llc -O0 -mtriple=aarch64-linux-gnu -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=LINUX-DEFAULT
3 # RUN: llc -O0 -mtriple=aarch64-linux-gnu -relocation-model=pic -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=LINUX-PIC
5 --- |
6   target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
8   define void @frame_index() {
9     %ptr0 = alloca i64
10     ret void
11   }
13   define i8* @gep(i8* %in) { ret i8* undef }
14   define i8* @gep_no_constant(i8* %in) { ret i8* undef }
15   define i8* @gep_bad_imm(i8* %in) { ret i8* undef }
17   define i8* @ptr_mask(i8* %in) { ret i8* undef }
19   @var_local = global i8 0
20   define i8* @global_local() { ret i8* undef }
22   @var_got = external global i8
23   define i8* @global_got() { ret i8* undef }
25   define void @icmp() { ret void }
26   define void @fcmp() { ret void }
28   define void @phi() { ret void }
30   define void @select() { ret void }
31 ...
33 ---
34 # CHECK-LABEL: name: frame_index
35 name:            frame_index
36 legalized:       true
37 regBankSelected: true
39 # CHECK:      registers:
40 # CHECK-NEXT:  - { id: 0, class: gpr64sp, preferred-register: '' }
41 registers:
42   - { id: 0, class: gpr }
44 stack:
45   - { id: 0, name: ptr0, offset: 0, size: 8, alignment: 8 }
47 # CHECK:  body:
48 # CHECK: %0:gpr64sp = ADDXri %stack.0.ptr0, 0, 0
49 body:             |
50   bb.0:
51     %0(p0) = G_FRAME_INDEX %stack.0.ptr0
52     $x0 = COPY %0(p0)
53 ...
55 ---
56 # CHECK-LABEL: name: gep
57 name:            gep
58 legalized:       true
59 regBankSelected: true
60 registers:
61   - { id: 0, class: gpr }
62   - { id: 1, class: gpr }
63   - { id: 2, class: gpr }
65 # CHECK:  body:
66 # CHECK: %2:gpr64sp = ADDXri %0, 42, 0
67 body:             |
68   bb.0:
69       liveins: $x0
70     %0(p0) = COPY $x0
71     %1(s64) = G_CONSTANT i64 42
72     %2(p0) = G_GEP %0, %1(s64)
73     $x0 = COPY %2(p0)
74 ...
76 ---
77 # CHECK-LABEL: name: gep_no_constant
78 name:            gep_no_constant
79 legalized:       true
80 regBankSelected: true
81 registers:
82   - { id: 0, class: gpr }
83   - { id: 1, class: gpr }
84   - { id: 2, class: gpr }
86 # CHECK:  body:
87 # CHECK: %0:gpr64 = COPY $x0
88 # CHECK: %1:gpr64 = COPY $x1
89 # CHECK: %2:gpr64 = ADDXrr %0, %1
90 body:             |
91   bb.0:
92       liveins: $x0, $x1
93     %0(p0) = COPY $x0
94     %1(s64) = COPY $x1
95     %2(p0) = G_GEP %0, %1(s64)
96     $x0 = COPY %2(p0)
97 ...
99 ---
100 # CHECK-LABEL: name: gep_bad_imm
101 name:            gep_bad_imm
102 legalized:       true
103 regBankSelected: true
104 registers:
105   - { id: 0, class: gpr }
106   - { id: 1, class: gpr }
107   - { id: 2, class: gpr }
109 # CHECK:  body:
110 # CHECK: %0:gpr64 = COPY $x0
111 # CHECK: %3:gpr32 = MOVi32imm 10000
112 # CHECK: %1:gpr64 = SUBREG_TO_REG 0, %3, %subreg.sub_32
113 # CHECK: %2:gpr64 = ADDXrr %0, %1
114 body:             |
115   bb.0:
116       liveins: $x0, $x1
117     %0(p0) = COPY $x0
118     %1(s64) = G_CONSTANT i64 10000
119     %2(p0) = G_GEP %0, %1(s64)
120     $x0 = COPY %2(p0)
124 # CHECK-LABEL: name: ptr_mask
125 name:            ptr_mask
126 legalized:       true
127 regBankSelected: true
129 # CHECK:  body:
130 # CHECK: %1:gpr64sp = ANDXri %0, 8060
131 body:             |
132   bb.0:
133       liveins: $x0
134     %0:gpr(p0) = COPY $x0
135     %1:gpr(p0) = G_PTR_MASK %0, 3
136     $x0 = COPY %1(p0)
140 # Global defined in the same linkage unit so no GOT is needed
141 # CHECK-LABEL: name: global_local
142 name:            global_local
143 legalized:       true
144 regBankSelected: true
145 registers:
146   - { id: 0, class: gpr }
148 # CHECK:  body:
149 # IOS: %0:gpr64 = MOVaddr target-flags(aarch64-page) @var_local, target-flags(aarch64-pageoff, aarch64-nc) @var_local
150 # LINUX-DEFAULT: %0:gpr64 = MOVaddr target-flags(aarch64-page) @var_local, target-flags(aarch64-pageoff, aarch64-nc) @var_local
151 # LINUX-PIC: %0:gpr64 = LOADgot target-flags(aarch64-got) @var_local
152 body:             |
153   bb.0:
154     %0(p0) = G_GLOBAL_VALUE @var_local
155     $x0 = COPY %0(p0)
159 # CHECK-LABEL: name: global_got
160 name:            global_got
161 legalized:       true
162 regBankSelected: true
163 registers:
164   - { id: 0, class: gpr }
166 # CHECK:  body:
167 # IOS: %0:gpr64 = LOADgot target-flags(aarch64-got) @var_got
168 # LINUX-DEFAULT: %0:gpr64 = MOVaddr target-flags(aarch64-page) @var_got, target-flags(aarch64-pageoff, aarch64-nc) @var_got
169 # LINUX-PIC: %0:gpr64 = LOADgot target-flags(aarch64-got) @var_got
170 body:             |
171   bb.0:
172     %0(p0) = G_GLOBAL_VALUE @var_got
173     $x0 = COPY %0(p0)
177 # CHECK-LABEL: name: icmp
178 name:            icmp
179 legalized:       true
180 regBankSelected: true
182 # CHECK:      registers:
183 # CHECK-NEXT:  - { id: 0, class: gpr32, preferred-register: '' }
184 # CHECK-NEXT:  - { id: 1, class: gpr32, preferred-register: '' }
185 # CHECK-NEXT:  - { id: 2, class: gpr64, preferred-register: '' }
186 # CHECK-NEXT:  - { id: 3, class: gpr32, preferred-register: '' }
187 # CHECK-NEXT:  - { id: 4, class: gpr64, preferred-register: '' }
188 # CHECK-NEXT:  - { id: 5, class: gpr32, preferred-register: '' }
189 registers:
190   - { id: 0, class: gpr }
191   - { id: 1, class: gpr }
192   - { id: 2, class: gpr }
193   - { id: 3, class: gpr }
194   - { id: 4, class: gpr }
195   - { id: 5, class: gpr }
196   - { id: 6, class: gpr }
197   - { id: 7, class: gpr }
198   - { id: 8, class: gpr }
199   - { id: 9, class: gpr }
200   - { id: 10, class: gpr }
201   - { id: 11, class: gpr }
203 # CHECK:  body:
204 # CHECK:    $wzr = SUBSWrr %0, %0, implicit-def $nzcv
205 # CHECK:    %1:gpr32 = CSINCWr $wzr, $wzr, 1, implicit $nzcv
207 # CHECK:    $xzr = SUBSXrr %2, %2, implicit-def $nzcv
208 # CHECK:    %3:gpr32 = CSINCWr $wzr, $wzr, 3, implicit $nzcv
210 # CHECK:    $xzr = SUBSXrr %4, %4, implicit-def $nzcv
211 # CHECK:    %5:gpr32 = CSINCWr $wzr, $wzr, 0, implicit $nzcv
213 body:             |
214   bb.0:
215     liveins: $w0, $x0
217     %0(s32) = COPY $w0
218     %1(s32) = G_ICMP intpred(eq), %0, %0
219     %6(s1) = G_TRUNC %1(s32)
220     %9(s32) = G_ANYEXT %6
221     $w0 = COPY %9(s32)
223     %2(s64) = COPY $x0
224     %3(s32) = G_ICMP intpred(uge), %2, %2
225     %7(s1) = G_TRUNC %3(s32)
226     %10(s32) = G_ANYEXT %7
227     $w0 = COPY %10(s32)
229     %4(p0) = COPY $x0
230     %5(s32) = G_ICMP intpred(ne), %4, %4
231     %8(s1) = G_TRUNC %5(s32)
232     %11(s32) = G_ANYEXT %8
233     $w0 = COPY %11(s32)
237 # CHECK-LABEL: name: fcmp
238 name:            fcmp
239 legalized:       true
240 regBankSelected: true
242 # CHECK:      registers:
243 # CHECK-NEXT:  - { id: 0, class: fpr32, preferred-register: '' }
244 # CHECK-NEXT:  - { id: 1, class: gpr32, preferred-register: '' }
245 # CHECK-NEXT:  - { id: 2, class: fpr64, preferred-register: '' }
246 # CHECK-NEXT:  - { id: 3, class: gpr32, preferred-register: '' }
247 # CHECK-NEXT:  - { id: 4, class: gpr32, preferred-register: '' }
248 # CHECK-NEXT:  - { id: 5, class: gpr32, preferred-register: '' }
249 registers:
250   - { id: 0, class: fpr }
251   - { id: 1, class: gpr }
252   - { id: 2, class: fpr }
253   - { id: 3, class: gpr }
254   - { id: 4, class: gpr }
255   - { id: 5, class: gpr }
256   - { id: 6, class: gpr }
257   - { id: 7, class: gpr }
259 # CHECK:  body:
260 # CHECK:    FCMPSrr %0, %0, implicit-def $nzcv
261 # CHECK:    [[TST_MI:%[0-9]+]]:gpr32 = CSINCWr $wzr, $wzr, 5, implicit $nzcv
262 # CHECK:    [[TST_GT:%[0-9]+]]:gpr32 = CSINCWr $wzr, $wzr, 13, implicit $nzcv
263 # CHECK:    %1:gpr32 = ORRWrr [[TST_MI]], [[TST_GT]]
265 # CHECK:    FCMPDrr %2, %2, implicit-def $nzcv
266 # CHECK:    %3:gpr32 = CSINCWr $wzr, $wzr, 4, implicit $nzcv
268 body:             |
269   bb.0:
270     liveins: $w0, $x0
272     %0(s32) = COPY $s0
273     %1(s32) = G_FCMP floatpred(one), %0, %0
274     %4(s1) = G_TRUNC %1(s32)
275     %6(s32) = G_ANYEXT %4
276     $w0 = COPY %6(s32)
278     %2(s64) = COPY $d0
279     %3(s32) = G_FCMP floatpred(uge), %2, %2
280     %5(s1) = G_TRUNC %3(s32)
281     %7(s32) = G_ANYEXT %5
282     $w0 = COPY %7(s32)
287 # CHECK-LABEL: name: phi
288 name:            phi
289 legalized:       true
290 regBankSelected: true
291 tracksRegLiveness: true
293 # CHECK:      registers:
294 # CHECK-NEXT:  - { id: 0, class: fpr32, preferred-register: '' }
295 # CHECK-NEXT:  - { id: 1, class: gpr32, preferred-register: '' }
296 # CHECK-NEXT:  - { id: 2, class: fpr32, preferred-register: '' }
297 registers:
298   - { id: 0, class: fpr }
299   - { id: 1, class: gpr }
300   - { id: 2, class: fpr }
302 # CHECK:  body:
303 # CHECK:    bb.1:
304 # CHECK:      %2:fpr32 = PHI %0, %bb.0, %2, %bb.1
306 body:             |
307   bb.0:
308     liveins: $s0, $w0
309     successors: %bb.1
310     %0(s32) = COPY $s0
311     %3:gpr(s32) = COPY $w0
312     %1(s1) = G_TRUNC %3
314   bb.1:
315     successors: %bb.1, %bb.2
316     %2(s32) = PHI %0, %bb.0, %2, %bb.1
317     G_BRCOND %1, %bb.1
319   bb.2:
320     $s0 = COPY %2
321     RET_ReallyLR implicit $s0
325 # CHECK-LABEL: name: select
326 name:            select
327 legalized:       true
328 regBankSelected: true
329 tracksRegLiveness: true
331 # CHECK:      registers:
332 # CHECK-NEXT:  - { id: 0, class: gpr32, preferred-register: '' }
333 # CHECK-NEXT:  - { id: 1, class: gpr32, preferred-register: '' }
334 # CHECK-NEXT:  - { id: 2, class: gpr32, preferred-register: '' }
335 # CHECK-NEXT:  - { id: 3, class: gpr32, preferred-register: '' }
336 # CHECK-NEXT:  - { id: 4, class: gpr64, preferred-register: '' }
337 # CHECK-NEXT:  - { id: 5, class: gpr64, preferred-register: '' }
338 # CHECK-NEXT:  - { id: 6, class: gpr64, preferred-register: '' }
339 # CHECK-NEXT:  - { id: 7, class: gpr64, preferred-register: '' }
340 # CHECK-NEXT:  - { id: 8, class: gpr64, preferred-register: '' }
341 # CHECK-NEXT:  - { id: 9, class: gpr64, preferred-register: '' }
342 registers:
343   - { id: 0, class: gpr }
344   - { id: 1, class: gpr }
345   - { id: 2, class: gpr }
346   - { id: 3, class: gpr }
347   - { id: 4, class: gpr }
348   - { id: 5, class: gpr }
349   - { id: 6, class: gpr }
350   - { id: 7, class: gpr }
351   - { id: 8, class: gpr }
352   - { id: 9, class: gpr }
354 # CHECK:  body:
355 # CHECK:      $wzr = ANDSWri %10, 0, implicit-def $nzcv
356 # CHECK:      %3:gpr32 = CSELWr %1, %2, 1, implicit $nzcv
357 # CHECK:      $wzr = ANDSWri %10, 0, implicit-def $nzcv
358 # CHECK:      %6:gpr64 = CSELXr %4, %5, 1, implicit $nzcv
359 # CHECK:      $wzr = ANDSWri %10, 0, implicit-def $nzcv
360 # CHECK:      %9:gpr64 = CSELXr %7, %8, 1, implicit $nzcv
361 body:             |
362   bb.0:
363     liveins: $w0, $w1, $w2
364     %10:gpr(s32) = COPY $w0
365     %0(s1) = G_TRUNC %10
367     %1(s32) = COPY $w1
368     %2(s32) = COPY $w2
369     %3(s32) = G_SELECT %0, %1, %2
370     $w0 = COPY %3(s32)
372     %4(s64) = COPY $x0
373     %5(s64) = COPY $x1
374     %6(s64) = G_SELECT %0, %4, %5
375     $x0 = COPY %6(s64)
377     %7(p0) = COPY $x0
378     %8(p0) = COPY $x1
379     %9(p0) = G_SELECT %0, %7, %8
380     $x0 = COPY %9(p0)