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
4
5--- |
6  target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
7
8  define void @frame_index() {
9    %ptr0 = alloca i64
10    ret void
11  }
12
13  define i8* @gep(i8* %in) { ret i8* undef }
14
15  define i8* @ptr_mask(i8* %in) { ret i8* undef }
16
17  @var_local = global i8 0
18  define i8* @global_local() { ret i8* undef }
19
20  @var_got = external global i8
21  define i8* @global_got() { ret i8* undef }
22
23  define void @icmp() { ret void }
24  define void @fcmp() { ret void }
25
26  define void @phi() { ret void }
27
28  define void @select() { ret void }
29...
30
31---
32# CHECK-LABEL: name: frame_index
33name:            frame_index
34legalized:       true
35regBankSelected: true
36
37# CHECK:      registers:
38# CHECK-NEXT:  - { id: 0, class: gpr64sp, preferred-register: '' }
39registers:
40  - { id: 0, class: gpr }
41
42stack:
43  - { id: 0, name: ptr0, offset: 0, size: 8, alignment: 8 }
44
45# CHECK:  body:
46# CHECK: %0:gpr64sp = ADDXri %stack.0.ptr0, 0, 0
47body:             |
48  bb.0:
49    %0(p0) = G_FRAME_INDEX %stack.0.ptr0
50    $x0 = COPY %0(p0)
51...
52
53---
54# CHECK-LABEL: name: gep
55name:            gep
56legalized:       true
57regBankSelected: true
58registers:
59  - { id: 0, class: gpr }
60  - { id: 1, class: gpr }
61  - { id: 2, class: gpr }
62
63# CHECK:  body:
64# CHECK: %1:gpr64 = MOVi64imm 42
65# CHECK: %2:gpr64 = ADDXrr %0, %1
66body:             |
67  bb.0:
68      liveins: $x0
69    %0(p0) = COPY $x0
70    %1(s64) = G_CONSTANT i64 42
71    %2(p0) = G_GEP %0, %1(s64)
72    $x0 = COPY %2(p0)
73...
74
75---
76# CHECK-LABEL: name: ptr_mask
77name:            ptr_mask
78legalized:       true
79regBankSelected: true
80
81# CHECK:  body:
82# CHECK: %1:gpr64sp = ANDXri %0, 8060
83body:             |
84  bb.0:
85      liveins: $x0
86    %0:gpr(p0) = COPY $x0
87    %1:gpr(p0) = G_PTR_MASK %0, 3
88    $x0 = COPY %1(p0)
89...
90
91---
92# Global defined in the same linkage unit so no GOT is needed
93# CHECK-LABEL: name: global_local
94name:            global_local
95legalized:       true
96regBankSelected: true
97registers:
98  - { id: 0, class: gpr }
99
100# CHECK:  body:
101# IOS: %0:gpr64 = MOVaddr target-flags(aarch64-page) @var_local, target-flags(aarch64-pageoff, aarch64-nc) @var_local
102# LINUX-DEFAULT: %0:gpr64 = MOVaddr target-flags(aarch64-page) @var_local, target-flags(aarch64-pageoff, aarch64-nc) @var_local
103# LINUX-PIC: %0:gpr64 = LOADgot target-flags(aarch64-got) @var_local
104body:             |
105  bb.0:
106    %0(p0) = G_GLOBAL_VALUE @var_local
107    $x0 = COPY %0(p0)
108...
109
110---
111# CHECK-LABEL: name: global_got
112name:            global_got
113legalized:       true
114regBankSelected: true
115registers:
116  - { id: 0, class: gpr }
117
118# CHECK:  body:
119# IOS: %0:gpr64 = LOADgot target-flags(aarch64-got) @var_got
120# LINUX-DEFAULT: %0:gpr64 = MOVaddr target-flags(aarch64-page) @var_got, target-flags(aarch64-pageoff, aarch64-nc) @var_got
121# LINUX-PIC: %0:gpr64 = LOADgot target-flags(aarch64-got) @var_got
122body:             |
123  bb.0:
124    %0(p0) = G_GLOBAL_VALUE @var_got
125    $x0 = COPY %0(p0)
126...
127
128---
129# CHECK-LABEL: name: icmp
130name:            icmp
131legalized:       true
132regBankSelected: true
133
134# CHECK:      registers:
135# CHECK-NEXT:  - { id: 0, class: gpr32, preferred-register: '' }
136# CHECK-NEXT:  - { id: 1, class: gpr32, preferred-register: '' }
137# CHECK-NEXT:  - { id: 2, class: gpr64, preferred-register: '' }
138# CHECK-NEXT:  - { id: 3, class: gpr32, preferred-register: '' }
139# CHECK-NEXT:  - { id: 4, class: gpr64, preferred-register: '' }
140# CHECK-NEXT:  - { id: 5, class: gpr32, preferred-register: '' }
141registers:
142  - { id: 0, class: gpr }
143  - { id: 1, class: gpr }
144  - { id: 2, class: gpr }
145  - { id: 3, class: gpr }
146  - { id: 4, class: gpr }
147  - { id: 5, class: gpr }
148  - { id: 6, class: gpr }
149  - { id: 7, class: gpr }
150  - { id: 8, class: gpr }
151  - { id: 9, class: gpr }
152  - { id: 10, class: gpr }
153  - { id: 11, class: gpr }
154
155# CHECK:  body:
156# CHECK:    $wzr = SUBSWrr %0, %0, implicit-def $nzcv
157# CHECK:    %1:gpr32 = CSINCWr $wzr, $wzr, 1, implicit $nzcv
158
159# CHECK:    $xzr = SUBSXrr %2, %2, implicit-def $nzcv
160# CHECK:    %3:gpr32 = CSINCWr $wzr, $wzr, 3, implicit $nzcv
161
162# CHECK:    $xzr = SUBSXrr %4, %4, implicit-def $nzcv
163# CHECK:    %5:gpr32 = CSINCWr $wzr, $wzr, 0, implicit $nzcv
164
165body:             |
166  bb.0:
167    liveins: $w0, $x0
168
169    %0(s32) = COPY $w0
170    %1(s32) = G_ICMP intpred(eq), %0, %0
171    %6(s1) = G_TRUNC %1(s32)
172    %9(s32) = G_ANYEXT %6
173    $w0 = COPY %9(s32)
174
175    %2(s64) = COPY $x0
176    %3(s32) = G_ICMP intpred(uge), %2, %2
177    %7(s1) = G_TRUNC %3(s32)
178    %10(s32) = G_ANYEXT %7
179    $w0 = COPY %10(s32)
180
181    %4(p0) = COPY $x0
182    %5(s32) = G_ICMP intpred(ne), %4, %4
183    %8(s1) = G_TRUNC %5(s32)
184    %11(s32) = G_ANYEXT %8
185    $w0 = COPY %11(s32)
186...
187
188---
189# CHECK-LABEL: name: fcmp
190name:            fcmp
191legalized:       true
192regBankSelected: true
193
194# CHECK:      registers:
195# CHECK-NEXT:  - { id: 0, class: fpr32, preferred-register: '' }
196# CHECK-NEXT:  - { id: 1, class: gpr32, preferred-register: '' }
197# CHECK-NEXT:  - { id: 2, class: fpr64, preferred-register: '' }
198# CHECK-NEXT:  - { id: 3, class: gpr32, preferred-register: '' }
199# CHECK-NEXT:  - { id: 4, class: gpr32, preferred-register: '' }
200# CHECK-NEXT:  - { id: 5, class: gpr32, preferred-register: '' }
201registers:
202  - { id: 0, class: fpr }
203  - { id: 1, class: gpr }
204  - { id: 2, class: fpr }
205  - { id: 3, class: gpr }
206  - { id: 4, class: gpr }
207  - { id: 5, class: gpr }
208  - { id: 6, class: gpr }
209  - { id: 7, class: gpr }
210
211# CHECK:  body:
212# CHECK:    FCMPSrr %0, %0, implicit-def $nzcv
213# CHECK:    [[TST_MI:%[0-9]+]]:gpr32 = CSINCWr $wzr, $wzr, 5, implicit $nzcv
214# CHECK:    [[TST_GT:%[0-9]+]]:gpr32 = CSINCWr $wzr, $wzr, 13, implicit $nzcv
215# CHECK:    %1:gpr32 = ORRWrr [[TST_MI]], [[TST_GT]]
216
217# CHECK:    FCMPDrr %2, %2, implicit-def $nzcv
218# CHECK:    %3:gpr32 = CSINCWr $wzr, $wzr, 4, implicit $nzcv
219
220body:             |
221  bb.0:
222    liveins: $w0, $x0
223
224    %0(s32) = COPY $s0
225    %1(s32) = G_FCMP floatpred(one), %0, %0
226    %4(s1) = G_TRUNC %1(s32)
227    %6(s32) = G_ANYEXT %4
228    $w0 = COPY %6(s32)
229
230    %2(s64) = COPY $d0
231    %3(s32) = G_FCMP floatpred(uge), %2, %2
232    %5(s1) = G_TRUNC %3(s32)
233    %7(s32) = G_ANYEXT %5
234    $w0 = COPY %7(s32)
235
236...
237
238---
239# CHECK-LABEL: name: phi
240name:            phi
241legalized:       true
242regBankSelected: true
243tracksRegLiveness: true
244
245# CHECK:      registers:
246# CHECK-NEXT:  - { id: 0, class: fpr32, preferred-register: '' }
247# CHECK-NEXT:  - { id: 1, class: gpr32, preferred-register: '' }
248# CHECK-NEXT:  - { id: 2, class: fpr32, preferred-register: '' }
249registers:
250  - { id: 0, class: fpr }
251  - { id: 1, class: gpr }
252  - { id: 2, class: fpr }
253
254# CHECK:  body:
255# CHECK:    bb.1:
256# CHECK:      %2:fpr32 = PHI %0, %bb.0, %2, %bb.1
257
258body:             |
259  bb.0:
260    liveins: $s0, $w0
261    successors: %bb.1
262    %0(s32) = COPY $s0
263    %3:gpr(s32) = COPY $w0
264    %1(s1) = G_TRUNC %3
265
266  bb.1:
267    successors: %bb.1, %bb.2
268    %2(s32) = PHI %0, %bb.0, %2, %bb.1
269    G_BRCOND %1, %bb.1
270
271  bb.2:
272    $s0 = COPY %2
273    RET_ReallyLR implicit $s0
274...
275
276---
277# CHECK-LABEL: name: select
278name:            select
279legalized:       true
280regBankSelected: true
281tracksRegLiveness: true
282
283# CHECK:      registers:
284# CHECK-NEXT:  - { id: 0, class: gpr32, preferred-register: '' }
285# CHECK-NEXT:  - { id: 1, class: gpr32, preferred-register: '' }
286# CHECK-NEXT:  - { id: 2, class: gpr32, preferred-register: '' }
287# CHECK-NEXT:  - { id: 3, class: gpr32, preferred-register: '' }
288# CHECK-NEXT:  - { id: 4, class: gpr64, preferred-register: '' }
289# CHECK-NEXT:  - { id: 5, class: gpr64, preferred-register: '' }
290# CHECK-NEXT:  - { id: 6, class: gpr64, preferred-register: '' }
291# CHECK-NEXT:  - { id: 7, class: gpr64, preferred-register: '' }
292# CHECK-NEXT:  - { id: 8, class: gpr64, preferred-register: '' }
293# CHECK-NEXT:  - { id: 9, class: gpr64, preferred-register: '' }
294registers:
295  - { id: 0, class: gpr }
296  - { id: 1, class: gpr }
297  - { id: 2, class: gpr }
298  - { id: 3, class: gpr }
299  - { id: 4, class: gpr }
300  - { id: 5, class: gpr }
301  - { id: 6, class: gpr }
302  - { id: 7, class: gpr }
303  - { id: 8, class: gpr }
304  - { id: 9, class: gpr }
305
306# CHECK:  body:
307# CHECK:      $wzr = ANDSWri %10, 0, implicit-def $nzcv
308# CHECK:      %3:gpr32 = CSELWr %1, %2, 1, implicit $nzcv
309# CHECK:      $wzr = ANDSWri %10, 0, implicit-def $nzcv
310# CHECK:      %6:gpr64 = CSELXr %4, %5, 1, implicit $nzcv
311# CHECK:      $wzr = ANDSWri %10, 0, implicit-def $nzcv
312# CHECK:      %9:gpr64 = CSELXr %7, %8, 1, implicit $nzcv
313body:             |
314  bb.0:
315    liveins: $w0, $w1, $w2
316    %10:gpr(s32) = COPY $w0
317    %0(s1) = G_TRUNC %10
318
319    %1(s32) = COPY $w1
320    %2(s32) = COPY $w2
321    %3(s32) = G_SELECT %0, %1, %2
322    $w0 = COPY %3(s32)
323
324    %4(s64) = COPY $x0
325    %5(s64) = COPY $x1
326    %6(s64) = G_SELECT %0, %4, %5
327    $x0 = COPY %6(s64)
328
329    %7(p0) = COPY $x0
330    %8(p0) = COPY $x1
331    %9(p0) = G_SELECT %0, %7, %8
332    $x0 = COPY %9(p0)
333...
334