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