[llvm-objdump] - Remove one overload of reportError. NFCI.
[llvm-complete.git] / test / CodeGen / AArch64 / GlobalISel / select.mir
blob5a3b63003b2cdc34e029ef7ed2fc8717c4ccc468
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: %1:gpr64 = MOVi64imm 10000
112 # CHECK: %2:gpr64 = ADDXrr %0, %1
113 body:             |
114   bb.0:
115       liveins: $x0, $x1
116     %0(p0) = COPY $x0
117     %1(s64) = G_CONSTANT i64 10000
118     %2(p0) = G_GEP %0, %1(s64)
119     $x0 = COPY %2(p0)
123 # CHECK-LABEL: name: ptr_mask
124 name:            ptr_mask
125 legalized:       true
126 regBankSelected: true
128 # CHECK:  body:
129 # CHECK: %1:gpr64sp = ANDXri %0, 8060
130 body:             |
131   bb.0:
132       liveins: $x0
133     %0:gpr(p0) = COPY $x0
134     %1:gpr(p0) = G_PTR_MASK %0, 3
135     $x0 = COPY %1(p0)
139 # Global defined in the same linkage unit so no GOT is needed
140 # CHECK-LABEL: name: global_local
141 name:            global_local
142 legalized:       true
143 regBankSelected: true
144 registers:
145   - { id: 0, class: gpr }
147 # CHECK:  body:
148 # IOS: %0:gpr64 = MOVaddr target-flags(aarch64-page) @var_local, target-flags(aarch64-pageoff, aarch64-nc) @var_local
149 # LINUX-DEFAULT: %0:gpr64 = MOVaddr target-flags(aarch64-page) @var_local, target-flags(aarch64-pageoff, aarch64-nc) @var_local
150 # LINUX-PIC: %0:gpr64 = LOADgot target-flags(aarch64-got) @var_local
151 body:             |
152   bb.0:
153     %0(p0) = G_GLOBAL_VALUE @var_local
154     $x0 = COPY %0(p0)
158 # CHECK-LABEL: name: global_got
159 name:            global_got
160 legalized:       true
161 regBankSelected: true
162 registers:
163   - { id: 0, class: gpr }
165 # CHECK:  body:
166 # IOS: %0:gpr64 = LOADgot target-flags(aarch64-got) @var_got
167 # LINUX-DEFAULT: %0:gpr64 = MOVaddr target-flags(aarch64-page) @var_got, target-flags(aarch64-pageoff, aarch64-nc) @var_got
168 # LINUX-PIC: %0:gpr64 = LOADgot target-flags(aarch64-got) @var_got
169 body:             |
170   bb.0:
171     %0(p0) = G_GLOBAL_VALUE @var_got
172     $x0 = COPY %0(p0)
176 # CHECK-LABEL: name: icmp
177 name:            icmp
178 legalized:       true
179 regBankSelected: true
181 # CHECK:      registers:
182 # CHECK-NEXT:  - { id: 0, class: gpr32, preferred-register: '' }
183 # CHECK-NEXT:  - { id: 1, class: gpr32, preferred-register: '' }
184 # CHECK-NEXT:  - { id: 2, class: gpr64, preferred-register: '' }
185 # CHECK-NEXT:  - { id: 3, class: gpr32, preferred-register: '' }
186 # CHECK-NEXT:  - { id: 4, class: gpr64, preferred-register: '' }
187 # CHECK-NEXT:  - { id: 5, class: gpr32, preferred-register: '' }
188 registers:
189   - { id: 0, class: gpr }
190   - { id: 1, class: gpr }
191   - { id: 2, class: gpr }
192   - { id: 3, class: gpr }
193   - { id: 4, class: gpr }
194   - { id: 5, class: gpr }
195   - { id: 6, class: gpr }
196   - { id: 7, class: gpr }
197   - { id: 8, class: gpr }
198   - { id: 9, class: gpr }
199   - { id: 10, class: gpr }
200   - { id: 11, class: gpr }
202 # CHECK:  body:
203 # CHECK:    $wzr = SUBSWrr %0, %0, implicit-def $nzcv
204 # CHECK:    %1:gpr32 = CSINCWr $wzr, $wzr, 1, implicit $nzcv
206 # CHECK:    $xzr = SUBSXrr %2, %2, implicit-def $nzcv
207 # CHECK:    %3:gpr32 = CSINCWr $wzr, $wzr, 3, implicit $nzcv
209 # CHECK:    $xzr = SUBSXrr %4, %4, implicit-def $nzcv
210 # CHECK:    %5:gpr32 = CSINCWr $wzr, $wzr, 0, implicit $nzcv
212 body:             |
213   bb.0:
214     liveins: $w0, $x0
216     %0(s32) = COPY $w0
217     %1(s32) = G_ICMP intpred(eq), %0, %0
218     %6(s1) = G_TRUNC %1(s32)
219     %9(s32) = G_ANYEXT %6
220     $w0 = COPY %9(s32)
222     %2(s64) = COPY $x0
223     %3(s32) = G_ICMP intpred(uge), %2, %2
224     %7(s1) = G_TRUNC %3(s32)
225     %10(s32) = G_ANYEXT %7
226     $w0 = COPY %10(s32)
228     %4(p0) = COPY $x0
229     %5(s32) = G_ICMP intpred(ne), %4, %4
230     %8(s1) = G_TRUNC %5(s32)
231     %11(s32) = G_ANYEXT %8
232     $w0 = COPY %11(s32)
236 # CHECK-LABEL: name: fcmp
237 name:            fcmp
238 legalized:       true
239 regBankSelected: true
241 # CHECK:      registers:
242 # CHECK-NEXT:  - { id: 0, class: fpr32, preferred-register: '' }
243 # CHECK-NEXT:  - { id: 1, class: gpr32, preferred-register: '' }
244 # CHECK-NEXT:  - { id: 2, class: fpr64, preferred-register: '' }
245 # CHECK-NEXT:  - { id: 3, class: gpr32, preferred-register: '' }
246 # CHECK-NEXT:  - { id: 4, class: gpr32, preferred-register: '' }
247 # CHECK-NEXT:  - { id: 5, class: gpr32, preferred-register: '' }
248 registers:
249   - { id: 0, class: fpr }
250   - { id: 1, class: gpr }
251   - { id: 2, class: fpr }
252   - { id: 3, class: gpr }
253   - { id: 4, class: gpr }
254   - { id: 5, class: gpr }
255   - { id: 6, class: gpr }
256   - { id: 7, class: gpr }
258 # CHECK:  body:
259 # CHECK:    FCMPSrr %0, %0, implicit-def $nzcv
260 # CHECK:    [[TST_MI:%[0-9]+]]:gpr32 = CSINCWr $wzr, $wzr, 5, implicit $nzcv
261 # CHECK:    [[TST_GT:%[0-9]+]]:gpr32 = CSINCWr $wzr, $wzr, 13, implicit $nzcv
262 # CHECK:    %1:gpr32 = ORRWrr [[TST_MI]], [[TST_GT]]
264 # CHECK:    FCMPDrr %2, %2, implicit-def $nzcv
265 # CHECK:    %3:gpr32 = CSINCWr $wzr, $wzr, 4, implicit $nzcv
267 body:             |
268   bb.0:
269     liveins: $w0, $x0
271     %0(s32) = COPY $s0
272     %1(s32) = G_FCMP floatpred(one), %0, %0
273     %4(s1) = G_TRUNC %1(s32)
274     %6(s32) = G_ANYEXT %4
275     $w0 = COPY %6(s32)
277     %2(s64) = COPY $d0
278     %3(s32) = G_FCMP floatpred(uge), %2, %2
279     %5(s1) = G_TRUNC %3(s32)
280     %7(s32) = G_ANYEXT %5
281     $w0 = COPY %7(s32)
286 # CHECK-LABEL: name: phi
287 name:            phi
288 legalized:       true
289 regBankSelected: true
290 tracksRegLiveness: true
292 # CHECK:      registers:
293 # CHECK-NEXT:  - { id: 0, class: fpr32, preferred-register: '' }
294 # CHECK-NEXT:  - { id: 1, class: gpr32, preferred-register: '' }
295 # CHECK-NEXT:  - { id: 2, class: fpr32, preferred-register: '' }
296 registers:
297   - { id: 0, class: fpr }
298   - { id: 1, class: gpr }
299   - { id: 2, class: fpr }
301 # CHECK:  body:
302 # CHECK:    bb.1:
303 # CHECK:      %2:fpr32 = PHI %0, %bb.0, %2, %bb.1
305 body:             |
306   bb.0:
307     liveins: $s0, $w0
308     successors: %bb.1
309     %0(s32) = COPY $s0
310     %3:gpr(s32) = COPY $w0
311     %1(s1) = G_TRUNC %3
313   bb.1:
314     successors: %bb.1, %bb.2
315     %2(s32) = PHI %0, %bb.0, %2, %bb.1
316     G_BRCOND %1, %bb.1
318   bb.2:
319     $s0 = COPY %2
320     RET_ReallyLR implicit $s0
324 # CHECK-LABEL: name: select
325 name:            select
326 legalized:       true
327 regBankSelected: true
328 tracksRegLiveness: true
330 # CHECK:      registers:
331 # CHECK-NEXT:  - { id: 0, class: gpr32, preferred-register: '' }
332 # CHECK-NEXT:  - { id: 1, class: gpr32, preferred-register: '' }
333 # CHECK-NEXT:  - { id: 2, class: gpr32, preferred-register: '' }
334 # CHECK-NEXT:  - { id: 3, class: gpr32, preferred-register: '' }
335 # CHECK-NEXT:  - { id: 4, class: gpr64, preferred-register: '' }
336 # CHECK-NEXT:  - { id: 5, class: gpr64, preferred-register: '' }
337 # CHECK-NEXT:  - { id: 6, class: gpr64, preferred-register: '' }
338 # CHECK-NEXT:  - { id: 7, class: gpr64, preferred-register: '' }
339 # CHECK-NEXT:  - { id: 8, class: gpr64, preferred-register: '' }
340 # CHECK-NEXT:  - { id: 9, class: gpr64, preferred-register: '' }
341 registers:
342   - { id: 0, class: gpr }
343   - { id: 1, class: gpr }
344   - { id: 2, class: gpr }
345   - { id: 3, class: gpr }
346   - { id: 4, class: gpr }
347   - { id: 5, class: gpr }
348   - { id: 6, class: gpr }
349   - { id: 7, class: gpr }
350   - { id: 8, class: gpr }
351   - { id: 9, class: gpr }
353 # CHECK:  body:
354 # CHECK:      $wzr = ANDSWri %10, 0, implicit-def $nzcv
355 # CHECK:      %3:gpr32 = CSELWr %1, %2, 1, implicit $nzcv
356 # CHECK:      $wzr = ANDSWri %10, 0, implicit-def $nzcv
357 # CHECK:      %6:gpr64 = CSELXr %4, %5, 1, implicit $nzcv
358 # CHECK:      $wzr = ANDSWri %10, 0, implicit-def $nzcv
359 # CHECK:      %9:gpr64 = CSELXr %7, %8, 1, implicit $nzcv
360 body:             |
361   bb.0:
362     liveins: $w0, $w1, $w2
363     %10:gpr(s32) = COPY $w0
364     %0(s1) = G_TRUNC %10
366     %1(s32) = COPY $w1
367     %2(s32) = COPY $w2
368     %3(s32) = G_SELECT %0, %1, %2
369     $w0 = COPY %3(s32)
371     %4(s64) = COPY $x0
372     %5(s64) = COPY $x1
373     %6(s64) = G_SELECT %0, %4, %5
374     $x0 = COPY %6(s64)
376     %7(p0) = COPY $x0
377     %8(p0) = COPY $x1
378     %9(p0) = G_SELECT %0, %7, %8
379     $x0 = COPY %9(p0)