1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=arm64-apple-ios -aarch64-enable-sink-fold=true -aarch64-redzone | FileCheck %s --check-prefixes=CHECK,CHECK64 3; RUN: llc < %s -mtriple=arm64-apple-ios -aarch64-enable-sink-fold=true -aarch64-redzone -global-isel -global-isel-abort=1 | FileCheck %s --check-prefixes=CHECK,GISEL 4; RUN: llc < %s -mtriple=arm64_32-apple-ios -aarch64-enable-sink-fold=true -aarch64-redzone | FileCheck %s --check-prefixes=CHECK,CHECK32 5 6define ptr @store64(ptr %ptr, i64 %index, i64 %spacing) { 7; CHECK-LABEL: store64: 8; CHECK: ; %bb.0: 9; CHECK-NEXT: str x2, [x0], #8 10; CHECK-NEXT: ret 11 %incdec.ptr = getelementptr inbounds i64, ptr %ptr, i64 1 12 store i64 %spacing, ptr %ptr, align 4 13 ret ptr %incdec.ptr 14} 15 16define ptr @store64idxpos256(ptr %ptr, i64 %index, i64 %spacing) { 17; CHECK-LABEL: store64idxpos256: 18; CHECK: ; %bb.0: 19; CHECK-NEXT: mov x8, x0 20; CHECK-NEXT: add x0, x0, #256 21; CHECK-NEXT: str x2, [x8] 22; CHECK-NEXT: ret 23 %incdec.ptr = getelementptr inbounds i64, ptr %ptr, i64 32 24 store i64 %spacing, ptr %ptr, align 4 25 ret ptr %incdec.ptr 26} 27 28define ptr @store64idxneg256(ptr %ptr, i64 %index, i64 %spacing) { 29; CHECK-LABEL: store64idxneg256: 30; CHECK: ; %bb.0: 31; CHECK-NEXT: str x2, [x0], #-256 32; CHECK-NEXT: ret 33 %incdec.ptr = getelementptr inbounds i64, ptr %ptr, i64 -32 34 store i64 %spacing, ptr %ptr, align 4 35 ret ptr %incdec.ptr 36} 37 38define ptr @store32(ptr %ptr, i32 %index, i32 %spacing) { 39; CHECK-LABEL: store32: 40; CHECK: ; %bb.0: 41; CHECK-NEXT: str w2, [x0], #4 42; CHECK-NEXT: ret 43 %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 1 44 store i32 %spacing, ptr %ptr, align 4 45 ret ptr %incdec.ptr 46} 47 48define ptr @store32idxpos256(ptr %ptr, i32 %index, i32 %spacing) { 49; CHECK-LABEL: store32idxpos256: 50; CHECK: ; %bb.0: 51; CHECK-NEXT: mov x8, x0 52; CHECK-NEXT: add x0, x0, #256 53; CHECK-NEXT: str w2, [x8] 54; CHECK-NEXT: ret 55 %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 64 56 store i32 %spacing, ptr %ptr, align 4 57 ret ptr %incdec.ptr 58} 59 60define ptr @store32idxneg256(ptr %ptr, i32 %index, i32 %spacing) { 61; CHECK-LABEL: store32idxneg256: 62; CHECK: ; %bb.0: 63; CHECK-NEXT: str w2, [x0], #-256 64; CHECK-NEXT: ret 65 %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 -64 66 store i32 %spacing, ptr %ptr, align 4 67 ret ptr %incdec.ptr 68} 69 70define ptr @store16(ptr %ptr, i16 %index, i16 %spacing) { 71; CHECK-LABEL: store16: 72; CHECK: ; %bb.0: 73; CHECK-NEXT: strh w2, [x0], #2 74; CHECK-NEXT: ret 75 %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 1 76 store i16 %spacing, ptr %ptr, align 4 77 ret ptr %incdec.ptr 78} 79 80define ptr @store16idxpos256(ptr %ptr, i16 %index, i16 %spacing) { 81; CHECK-LABEL: store16idxpos256: 82; CHECK: ; %bb.0: 83; CHECK-NEXT: mov x8, x0 84; CHECK-NEXT: add x0, x0, #256 85; CHECK-NEXT: strh w2, [x8] 86; CHECK-NEXT: ret 87 %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 128 88 store i16 %spacing, ptr %ptr, align 4 89 ret ptr %incdec.ptr 90} 91 92define ptr @store16idxneg256(ptr %ptr, i16 %index, i16 %spacing) { 93; CHECK-LABEL: store16idxneg256: 94; CHECK: ; %bb.0: 95; CHECK-NEXT: strh w2, [x0], #-256 96; CHECK-NEXT: ret 97 %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 -128 98 store i16 %spacing, ptr %ptr, align 4 99 ret ptr %incdec.ptr 100} 101 102define ptr @store8(ptr %ptr, i8 %index, i8 %spacing) { 103; CHECK-LABEL: store8: 104; CHECK: ; %bb.0: 105; CHECK-NEXT: strb w2, [x0], #1 106; CHECK-NEXT: ret 107 %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 1 108 store i8 %spacing, ptr %ptr, align 4 109 ret ptr %incdec.ptr 110} 111 112define ptr @store8idxpos256(ptr %ptr, i8 %index, i8 %spacing) { 113; CHECK-LABEL: store8idxpos256: 114; CHECK: ; %bb.0: 115; CHECK-NEXT: mov x8, x0 116; CHECK-NEXT: add x0, x0, #256 117; CHECK-NEXT: strb w2, [x8] 118; CHECK-NEXT: ret 119 %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 256 120 store i8 %spacing, ptr %ptr, align 4 121 ret ptr %incdec.ptr 122} 123 124define ptr @store8idxneg256(ptr %ptr, i8 %index, i8 %spacing) { 125; CHECK-LABEL: store8idxneg256: 126; CHECK: ; %bb.0: 127; CHECK-NEXT: strb w2, [x0], #-256 128; CHECK-NEXT: ret 129 %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 -256 130 store i8 %spacing, ptr %ptr, align 4 131 ret ptr %incdec.ptr 132} 133 134define ptr @truncst64to32(ptr %ptr, i32 %index, i64 %spacing) { 135; CHECK-LABEL: truncst64to32: 136; CHECK: ; %bb.0: 137; CHECK-NEXT: str w2, [x0], #4 138; CHECK-NEXT: ret 139 %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 1 140 %trunc = trunc i64 %spacing to i32 141 store i32 %trunc, ptr %ptr, align 4 142 ret ptr %incdec.ptr 143} 144 145define ptr @truncst64to16(ptr %ptr, i16 %index, i64 %spacing) { 146; CHECK-LABEL: truncst64to16: 147; CHECK: ; %bb.0: 148; CHECK-NEXT: strh w2, [x0], #2 149; CHECK-NEXT: ret 150 %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 1 151 %trunc = trunc i64 %spacing to i16 152 store i16 %trunc, ptr %ptr, align 4 153 ret ptr %incdec.ptr 154} 155 156define ptr @truncst64to8(ptr %ptr, i8 %index, i64 %spacing) { 157; CHECK-LABEL: truncst64to8: 158; CHECK: ; %bb.0: 159; CHECK-NEXT: strb w2, [x0], #1 160; CHECK-NEXT: ret 161 %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 1 162 %trunc = trunc i64 %spacing to i8 163 store i8 %trunc, ptr %ptr, align 4 164 ret ptr %incdec.ptr 165} 166 167 168define ptr @storef16(ptr %ptr, half %index, half %spacing) nounwind { 169; CHECK-LABEL: storef16: 170; CHECK: ; %bb.0: 171; CHECK-NEXT: str h1, [x0], #2 172; CHECK-NEXT: ret 173 %incdec.ptr = getelementptr inbounds half, ptr %ptr, i64 1 174 store half %spacing, ptr %ptr, align 2 175 ret ptr %incdec.ptr 176} 177 178define ptr @storef32(ptr %ptr, float %index, float %spacing) { 179; CHECK-LABEL: storef32: 180; CHECK: ; %bb.0: 181; CHECK-NEXT: str s1, [x0], #4 182; CHECK-NEXT: ret 183 %incdec.ptr = getelementptr inbounds float, ptr %ptr, i64 1 184 store float %spacing, ptr %ptr, align 4 185 ret ptr %incdec.ptr 186} 187 188define ptr @storef64(ptr %ptr, double %index, double %spacing) { 189; CHECK-LABEL: storef64: 190; CHECK: ; %bb.0: 191; CHECK-NEXT: str d1, [x0], #8 192; CHECK-NEXT: ret 193 %incdec.ptr = getelementptr inbounds double, ptr %ptr, i64 1 194 store double %spacing, ptr %ptr, align 4 195 ret ptr %incdec.ptr 196} 197 198 199define ptr @pref64(ptr %ptr, double %spacing) { 200; CHECK-LABEL: pref64: 201; CHECK: ; %bb.0: 202; CHECK-NEXT: str d0, [x0, #32]! 203; CHECK-NEXT: ret 204 %incdec.ptr = getelementptr inbounds double, ptr %ptr, i64 4 205 store double %spacing, ptr %incdec.ptr, align 4 206 ret ptr %incdec.ptr 207} 208 209define ptr @pref32(ptr %ptr, float %spacing) { 210; CHECK-LABEL: pref32: 211; CHECK: ; %bb.0: 212; CHECK-NEXT: str s0, [x0, #12]! 213; CHECK-NEXT: ret 214 %incdec.ptr = getelementptr inbounds float, ptr %ptr, i64 3 215 store float %spacing, ptr %incdec.ptr, align 4 216 ret ptr %incdec.ptr 217} 218 219define ptr @pref16(ptr %ptr, half %spacing) nounwind { 220; CHECK-LABEL: pref16: 221; CHECK: ; %bb.0: 222; CHECK-NEXT: str h0, [x0, #6]! 223; CHECK-NEXT: ret 224 %incdec.ptr = getelementptr inbounds half, ptr %ptr, i64 3 225 store half %spacing, ptr %incdec.ptr, align 2 226 ret ptr %incdec.ptr 227} 228 229define ptr @pre64(ptr %ptr, i64 %spacing) { 230; CHECK-LABEL: pre64: 231; CHECK: ; %bb.0: 232; CHECK-NEXT: str x1, [x0, #16]! 233; CHECK-NEXT: ret 234 %incdec.ptr = getelementptr inbounds i64, ptr %ptr, i64 2 235 store i64 %spacing, ptr %incdec.ptr, align 4 236 ret ptr %incdec.ptr 237} 238 239define ptr @pre64idxpos256(ptr %ptr, i64 %spacing) { 240; CHECK-LABEL: pre64idxpos256: 241; CHECK: ; %bb.0: 242; CHECK-NEXT: mov x8, x0 243; CHECK-NEXT: add x0, x0, #256 244; CHECK-NEXT: str x1, [x8, #256] 245; CHECK-NEXT: ret 246 %incdec.ptr = getelementptr inbounds i64, ptr %ptr, i64 32 247 store i64 %spacing, ptr %incdec.ptr, align 4 248 ret ptr %incdec.ptr 249} 250 251define ptr @pre64idxneg256(ptr %ptr, i64 %spacing) { 252; CHECK-LABEL: pre64idxneg256: 253; CHECK: ; %bb.0: 254; CHECK-NEXT: str x1, [x0, #-256]! 255; CHECK-NEXT: ret 256 %incdec.ptr = getelementptr inbounds i64, ptr %ptr, i64 -32 257 store i64 %spacing, ptr %incdec.ptr, align 4 258 ret ptr %incdec.ptr 259} 260 261define ptr @pre32(ptr %ptr, i32 %spacing) { 262; CHECK-LABEL: pre32: 263; CHECK: ; %bb.0: 264; CHECK-NEXT: str w1, [x0, #8]! 265; CHECK-NEXT: ret 266 %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 2 267 store i32 %spacing, ptr %incdec.ptr, align 4 268 ret ptr %incdec.ptr 269} 270 271define ptr @pre32idxpos256(ptr %ptr, i32 %spacing) { 272; CHECK-LABEL: pre32idxpos256: 273; CHECK: ; %bb.0: 274; CHECK-NEXT: mov x8, x0 275; CHECK-NEXT: add x0, x0, #256 276; CHECK-NEXT: str w1, [x8, #256] 277; CHECK-NEXT: ret 278 %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 64 279 store i32 %spacing, ptr %incdec.ptr, align 4 280 ret ptr %incdec.ptr 281} 282 283define ptr @pre32idxneg256(ptr %ptr, i32 %spacing) { 284; CHECK-LABEL: pre32idxneg256: 285; CHECK: ; %bb.0: 286; CHECK-NEXT: str w1, [x0, #-256]! 287; CHECK-NEXT: ret 288 %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 -64 289 store i32 %spacing, ptr %incdec.ptr, align 4 290 ret ptr %incdec.ptr 291} 292 293define ptr @pre16(ptr %ptr, i16 %spacing) { 294; CHECK-LABEL: pre16: 295; CHECK: ; %bb.0: 296; CHECK-NEXT: strh w1, [x0, #4]! 297; CHECK-NEXT: ret 298 %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 2 299 store i16 %spacing, ptr %incdec.ptr, align 4 300 ret ptr %incdec.ptr 301} 302 303define ptr @pre16idxpos256(ptr %ptr, i16 %spacing) { 304; CHECK-LABEL: pre16idxpos256: 305; CHECK: ; %bb.0: 306; CHECK-NEXT: mov x8, x0 307; CHECK-NEXT: add x0, x0, #256 308; CHECK-NEXT: strh w1, [x8, #256] 309; CHECK-NEXT: ret 310 %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 128 311 store i16 %spacing, ptr %incdec.ptr, align 4 312 ret ptr %incdec.ptr 313} 314 315define ptr @pre16idxneg256(ptr %ptr, i16 %spacing) { 316; CHECK-LABEL: pre16idxneg256: 317; CHECK: ; %bb.0: 318; CHECK-NEXT: strh w1, [x0, #-256]! 319; CHECK-NEXT: ret 320 %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 -128 321 store i16 %spacing, ptr %incdec.ptr, align 4 322 ret ptr %incdec.ptr 323} 324 325define ptr @pre8(ptr %ptr, i8 %spacing) { 326; CHECK-LABEL: pre8: 327; CHECK: ; %bb.0: 328; CHECK-NEXT: strb w1, [x0, #2]! 329; CHECK-NEXT: ret 330 %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 2 331 store i8 %spacing, ptr %incdec.ptr, align 4 332 ret ptr %incdec.ptr 333} 334 335define ptr @pre8idxpos256(ptr %ptr, i8 %spacing) { 336; CHECK-LABEL: pre8idxpos256: 337; CHECK: ; %bb.0: 338; CHECK-NEXT: mov x8, x0 339; CHECK-NEXT: add x0, x0, #256 340; CHECK-NEXT: strb w1, [x8, #256] 341; CHECK-NEXT: ret 342 %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 256 343 store i8 %spacing, ptr %incdec.ptr, align 4 344 ret ptr %incdec.ptr 345} 346 347define ptr @pre8idxneg256(ptr %ptr, i8 %spacing) { 348; CHECK-LABEL: pre8idxneg256: 349; CHECK: ; %bb.0: 350; CHECK-NEXT: strb w1, [x0, #-256]! 351; CHECK-NEXT: ret 352 %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 -256 353 store i8 %spacing, ptr %incdec.ptr, align 4 354 ret ptr %incdec.ptr 355} 356 357define ptr @pretrunc64to32(ptr %ptr, i64 %spacing) { 358; CHECK-LABEL: pretrunc64to32: 359; CHECK: ; %bb.0: 360; CHECK-NEXT: str w1, [x0, #8]! 361; CHECK-NEXT: ret 362 %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 2 363 %trunc = trunc i64 %spacing to i32 364 store i32 %trunc, ptr %incdec.ptr, align 4 365 ret ptr %incdec.ptr 366} 367 368define ptr @pretrunc64to16(ptr %ptr, i64 %spacing) { 369; CHECK-LABEL: pretrunc64to16: 370; CHECK: ; %bb.0: 371; CHECK-NEXT: strh w1, [x0, #4]! 372; CHECK-NEXT: ret 373 %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 2 374 %trunc = trunc i64 %spacing to i16 375 store i16 %trunc, ptr %incdec.ptr, align 4 376 ret ptr %incdec.ptr 377} 378 379define ptr @pretrunc64to8(ptr %ptr, i64 %spacing) { 380; CHECK-LABEL: pretrunc64to8: 381; CHECK: ; %bb.0: 382; CHECK-NEXT: strb w1, [x0, #2]! 383; CHECK-NEXT: ret 384 %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 2 385 %trunc = trunc i64 %spacing to i8 386 store i8 %trunc, ptr %incdec.ptr, align 4 387 ret ptr %incdec.ptr 388} 389 390;----- 391; Pre-indexed loads 392;----- 393define ptr @preidxf64(ptr %src, ptr %out) { 394; CHECK-LABEL: preidxf64: 395; CHECK: ; %bb.0: 396; CHECK-NEXT: ldr d0, [x0, #8]! 397; CHECK-NEXT: str d0, [x1] 398; CHECK-NEXT: ret 399 %ptr = getelementptr inbounds double, ptr %src, i64 1 400 %tmp = load double, ptr %ptr, align 4 401 store double %tmp, ptr %out, align 4 402 ret ptr %ptr 403} 404 405define ptr @preidxf32(ptr %src, ptr %out) { 406; CHECK-LABEL: preidxf32: 407; CHECK: ; %bb.0: 408; CHECK-NEXT: ldr s0, [x0, #4]! 409; CHECK-NEXT: str s0, [x1] 410; CHECK-NEXT: ret 411 %ptr = getelementptr inbounds float, ptr %src, i64 1 412 %tmp = load float, ptr %ptr, align 4 413 store float %tmp, ptr %out, align 4 414 ret ptr %ptr 415} 416 417define ptr @preidxf16(ptr %src, ptr %out) { 418; CHECK-LABEL: preidxf16: 419; CHECK: ; %bb.0: 420; CHECK-NEXT: ldr h0, [x0, #2]! 421; CHECK-NEXT: str h0, [x1] 422; CHECK-NEXT: ret 423 %ptr = getelementptr inbounds half, ptr %src, i64 1 424 %tmp = load half, ptr %ptr, align 2 425 store half %tmp, ptr %out, align 2 426 ret ptr %ptr 427} 428 429define ptr @preidx64(ptr %src, ptr %out) { 430; CHECK-LABEL: preidx64: 431; CHECK: ; %bb.0: 432; CHECK-NEXT: ldr x8, [x0, #8]! 433; CHECK-NEXT: str x8, [x1] 434; CHECK-NEXT: ret 435 %ptr = getelementptr inbounds i64, ptr %src, i64 1 436 %tmp = load i64, ptr %ptr, align 4 437 store i64 %tmp, ptr %out, align 4 438 ret ptr %ptr 439} 440 441define ptr @preidx32(ptr %src, ptr %out) { 442; CHECK-LABEL: preidx32: 443; CHECK: ; %bb.0: 444; CHECK-NEXT: ldr w8, [x0, #4]! 445; CHECK-NEXT: str w8, [x1] 446; CHECK-NEXT: ret 447 %ptr = getelementptr inbounds i32, ptr %src, i64 1 448 %tmp = load i32, ptr %ptr, align 4 449 store i32 %tmp, ptr %out, align 4 450 ret ptr %ptr 451} 452 453define ptr @preidx16zext32(ptr %src, ptr %out) { 454; CHECK-LABEL: preidx16zext32: 455; CHECK: ; %bb.0: 456; CHECK-NEXT: ldrh w8, [x0, #2]! 457; CHECK-NEXT: str w8, [x1] 458; CHECK-NEXT: ret 459 %ptr = getelementptr inbounds i16, ptr %src, i64 1 460 %tmp = load i16, ptr %ptr, align 4 461 %ext = zext i16 %tmp to i32 462 store i32 %ext, ptr %out, align 4 463 ret ptr %ptr 464} 465 466define ptr @preidx16zext64(ptr %src, ptr %out) { 467; CHECK-LABEL: preidx16zext64: 468; CHECK: ; %bb.0: 469; CHECK-NEXT: ldrh w8, [x0, #2]! 470; CHECK-NEXT: str x8, [x1] 471; CHECK-NEXT: ret 472 %ptr = getelementptr inbounds i16, ptr %src, i64 1 473 %tmp = load i16, ptr %ptr, align 4 474 %ext = zext i16 %tmp to i64 475 store i64 %ext, ptr %out, align 4 476 ret ptr %ptr 477} 478 479define ptr @preidx8zext32(ptr %src, ptr %out) { 480; CHECK-LABEL: preidx8zext32: 481; CHECK: ; %bb.0: 482; CHECK-NEXT: ldrb w8, [x0, #1]! 483; CHECK-NEXT: str w8, [x1] 484; CHECK-NEXT: ret 485 %ptr = getelementptr inbounds i8, ptr %src, i64 1 486 %tmp = load i8, ptr %ptr, align 4 487 %ext = zext i8 %tmp to i32 488 store i32 %ext, ptr %out, align 4 489 ret ptr %ptr 490} 491 492define ptr @preidx8zext64(ptr %src, ptr %out) { 493; CHECK-LABEL: preidx8zext64: 494; CHECK: ; %bb.0: 495; CHECK-NEXT: ldrb w8, [x0, #1]! 496; CHECK-NEXT: str x8, [x1] 497; CHECK-NEXT: ret 498 %ptr = getelementptr inbounds i8, ptr %src, i64 1 499 %tmp = load i8, ptr %ptr, align 4 500 %ext = zext i8 %tmp to i64 501 store i64 %ext, ptr %out, align 4 502 ret ptr %ptr 503} 504 505define ptr @preidx32sext64(ptr %src, ptr %out) { 506; CHECK-LABEL: preidx32sext64: 507; CHECK: ; %bb.0: 508; CHECK-NEXT: ldrsw x8, [x0, #4]! 509; CHECK-NEXT: str x8, [x1] 510; CHECK-NEXT: ret 511 %ptr = getelementptr inbounds i32, ptr %src, i64 1 512 %tmp = load i32, ptr %ptr, align 4 513 %ext = sext i32 %tmp to i64 514 store i64 %ext, ptr %out, align 8 515 ret ptr %ptr 516} 517 518define ptr @preidx16sext32(ptr %src, ptr %out) { 519; CHECK-LABEL: preidx16sext32: 520; CHECK: ; %bb.0: 521; CHECK-NEXT: ldrsh w8, [x0, #2]! 522; CHECK-NEXT: str w8, [x1] 523; CHECK-NEXT: ret 524 %ptr = getelementptr inbounds i16, ptr %src, i64 1 525 %tmp = load i16, ptr %ptr, align 4 526 %ext = sext i16 %tmp to i32 527 store i32 %ext, ptr %out, align 4 528 ret ptr %ptr 529} 530 531define ptr @preidx16sext64(ptr %src, ptr %out) { 532; CHECK-LABEL: preidx16sext64: 533; CHECK: ; %bb.0: 534; CHECK-NEXT: ldrsh x8, [x0, #2]! 535; CHECK-NEXT: str x8, [x1] 536; CHECK-NEXT: ret 537 %ptr = getelementptr inbounds i16, ptr %src, i64 1 538 %tmp = load i16, ptr %ptr, align 4 539 %ext = sext i16 %tmp to i64 540 store i64 %ext, ptr %out, align 4 541 ret ptr %ptr 542} 543 544define ptr @preidx8sext32(ptr %src, ptr %out) { 545; CHECK-LABEL: preidx8sext32: 546; CHECK: ; %bb.0: 547; CHECK-NEXT: ldrsb w8, [x0, #1]! 548; CHECK-NEXT: str w8, [x1] 549; CHECK-NEXT: ret 550 %ptr = getelementptr inbounds i8, ptr %src, i64 1 551 %tmp = load i8, ptr %ptr, align 4 552 %ext = sext i8 %tmp to i32 553 store i32 %ext, ptr %out, align 4 554 ret ptr %ptr 555} 556 557define ptr @preidx8sext64(ptr %src, ptr %out) { 558; CHECK-LABEL: preidx8sext64: 559; CHECK: ; %bb.0: 560; CHECK-NEXT: ldrsb x8, [x0, #1]! 561; CHECK-NEXT: str x8, [x1] 562; CHECK-NEXT: ret 563 %ptr = getelementptr inbounds i8, ptr %src, i64 1 564 %tmp = load i8, ptr %ptr, align 4 565 %ext = sext i8 %tmp to i64 566 store i64 %ext, ptr %out, align 4 567 ret ptr %ptr 568} 569 570; This test checks if illegal post-index is generated 571 572define ptr @postidx_clobber(ptr %addr) nounwind noinline ssp { 573; CHECK64-LABEL: postidx_clobber: 574; CHECK64: ; %bb.0: 575; CHECK64-NEXT: mov x8, x0 576; CHECK64-NEXT: str x0, [x8], #8 577; CHECK64-NEXT: mov x0, x8 578; CHECK64-NEXT: ret 579; 580; GISEL-LABEL: postidx_clobber: 581; GISEL: ; %bb.0: 582; GISEL-NEXT: mov x8, x0 583; GISEL-NEXT: str x0, [x8], #8 584; GISEL-NEXT: mov x0, x8 585; GISEL-NEXT: ret 586; 587; CHECK32-LABEL: postidx_clobber: 588; CHECK32: ; %bb.0: 589; CHECK32-NEXT: mov x8, x0 590; CHECK32-NEXT: add w0, w8, #8 591; CHECK32-NEXT: str w8, [x8] 592; CHECK32-NEXT: ret 593; ret 594 store ptr %addr, ptr %addr 595 %newaddr = getelementptr i64, ptr %addr, i32 1 596 ret ptr %newaddr 597} 598 599define ptr @preidx32_sb(ptr %src, ptr %out) { 600; CHECK-LABEL: preidx32_sb: 601; CHECK: ; %bb.0: 602; CHECK-NEXT: ldrsb w8, [x0, #1]! 603; CHECK-NEXT: str w8, [x1] 604; CHECK-NEXT: ret 605 %ptr = getelementptr inbounds i8, ptr %src, i64 1 606 %tmp = load i8, ptr %ptr, align 1 607 %sext = sext i8 %tmp to i32 608 store i32 %sext, ptr %out, align 4 609 ret ptr %ptr 610} 611 612define ptr @preidx32_sh(ptr %src, ptr %out) { 613; CHECK-LABEL: preidx32_sh: 614; CHECK: ; %bb.0: 615; CHECK-NEXT: ldrsh w8, [x0, #2]! 616; CHECK-NEXT: str w8, [x1] 617; CHECK-NEXT: ret 618 %ptr = getelementptr inbounds i16, ptr %src, i64 1 619 %tmp = load i16, ptr %ptr, align 2 620 %sext = sext i16 %tmp to i32 621 store i32 %sext, ptr %out, align 4 622 ret ptr %ptr 623} 624 625define ptr @preidx64_sb(ptr %src, ptr %out) { 626; CHECK-LABEL: preidx64_sb: 627; CHECK: ; %bb.0: 628; CHECK-NEXT: ldrsb x8, [x0, #1]! 629; CHECK-NEXT: str x8, [x1] 630; CHECK-NEXT: ret 631 %ptr = getelementptr inbounds i8, ptr %src, i64 1 632 %tmp = load i8, ptr %ptr, align 1 633 %sext = sext i8 %tmp to i64 634 store i64 %sext, ptr %out, align 8 635 ret ptr %ptr 636} 637 638define ptr @preidx64_sh(ptr %src, ptr %out) { 639; CHECK-LABEL: preidx64_sh: 640; CHECK: ; %bb.0: 641; CHECK-NEXT: ldrsh x8, [x0, #2]! 642; CHECK-NEXT: str x8, [x1] 643; CHECK-NEXT: ret 644 %ptr = getelementptr inbounds i16, ptr %src, i64 1 645 %tmp = load i16, ptr %ptr, align 2 646 %sext = sext i16 %tmp to i64 647 store i64 %sext, ptr %out, align 8 648 ret ptr %ptr 649} 650 651define ptr @preidx64_sw(ptr %src, ptr %out) { 652; CHECK-LABEL: preidx64_sw: 653; CHECK: ; %bb.0: 654; CHECK-NEXT: ldrsw x8, [x0, #4]! 655; CHECK-NEXT: str x8, [x1] 656; CHECK-NEXT: ret 657 %ptr = getelementptr inbounds i32, ptr %src, i64 1 658 %tmp = load i32, ptr %ptr, align 2 659 %sext = sext i32 %tmp to i64 660 store i64 %sext, ptr %out, align 8 661 ret ptr %ptr 662} 663 664define ptr @postidx32_sb(ptr %src, ptr %out) { 665; CHECK-LABEL: postidx32_sb: 666; CHECK: ; %bb.0: 667; CHECK-NEXT: ldrsb w8, [x0], #1 668; CHECK-NEXT: str w8, [x1] 669; CHECK-NEXT: ret 670 %tmp = load i8, ptr %src, align 1 671 %ptr = getelementptr inbounds i8, ptr %src, i64 1 672 %sext = sext i8 %tmp to i32 673 store i32 %sext, ptr %out, align 4 674 ret ptr %ptr 675} 676 677define ptr @postidx32_sh(ptr %src, ptr %out) { 678; CHECK-LABEL: postidx32_sh: 679; CHECK: ; %bb.0: 680; CHECK-NEXT: ldrsh w8, [x0], #2 681; CHECK-NEXT: str w8, [x1] 682; CHECK-NEXT: ret 683 %tmp = load i16, ptr %src, align 2 684 %ptr = getelementptr inbounds i16, ptr %src, i64 1 685 %sext = sext i16 %tmp to i32 686 store i32 %sext, ptr %out, align 4 687 ret ptr %ptr 688} 689 690define ptr @postidx64_sb(ptr %src, ptr %out) { 691; CHECK-LABEL: postidx64_sb: 692; CHECK: ; %bb.0: 693; CHECK-NEXT: ldrsb x8, [x0], #1 694; CHECK-NEXT: str x8, [x1] 695; CHECK-NEXT: ret 696 %tmp = load i8, ptr %src, align 1 697 %ptr = getelementptr inbounds i8, ptr %src, i64 1 698 %sext = sext i8 %tmp to i64 699 store i64 %sext, ptr %out, align 8 700 ret ptr %ptr 701} 702 703define ptr @postidx64_sh(ptr %src, ptr %out) { 704; CHECK-LABEL: postidx64_sh: 705; CHECK: ; %bb.0: 706; CHECK-NEXT: ldrsh x8, [x0], #2 707; CHECK-NEXT: str x8, [x1] 708; CHECK-NEXT: ret 709 %tmp = load i16, ptr %src, align 2 710 %ptr = getelementptr inbounds i16, ptr %src, i64 1 711 %sext = sext i16 %tmp to i64 712 store i64 %sext, ptr %out, align 8 713 ret ptr %ptr 714} 715 716define ptr @postidx64_sw(ptr %src, ptr %out) { 717; CHECK-LABEL: postidx64_sw: 718; CHECK: ; %bb.0: 719; CHECK-NEXT: ldrsw x8, [x0], #4 720; CHECK-NEXT: str x8, [x1] 721; CHECK-NEXT: ret 722 %tmp = load i32, ptr %src, align 4 723 %ptr = getelementptr inbounds i32, ptr %src, i64 1 724 %sext = sext i32 %tmp to i64 725 store i64 %sext, ptr %out, align 8 726 ret ptr %ptr 727} 728