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