768 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=arm64-apple-ios -aarch64-enable-sink-fold=true -aarch64-redzone | FileCheck %s --check-prefixes=CHECK,CHECK643; 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,GISEL4; RUN: llc < %s -mtriple=arm64_32-apple-ios -aarch64-enable-sink-fold=true -aarch64-redzone | FileCheck %s --check-prefixes=CHECK,CHECK325 6define ptr @store64(ptr %ptr, i64 %index, i64 %spacing) {7; CHECK-LABEL: store64:8; CHECK: ; %bb.0:9; CHECK-NEXT: str x2, [x0], #810; CHECK-NEXT: ret11 %incdec.ptr = getelementptr inbounds i64, ptr %ptr, i64 112 store i64 %spacing, ptr %ptr, align 413 ret ptr %incdec.ptr14}15 16define ptr @store64idxpos256(ptr %ptr, i64 %index, i64 %spacing) {17; CHECK-LABEL: store64idxpos256:18; CHECK: ; %bb.0:19; CHECK-NEXT: mov x8, x020; CHECK-NEXT: add x0, x0, #25621; CHECK-NEXT: str x2, [x8]22; CHECK-NEXT: ret23 %incdec.ptr = getelementptr inbounds i64, ptr %ptr, i64 3224 store i64 %spacing, ptr %ptr, align 425 ret ptr %incdec.ptr26}27 28define ptr @store64idxneg256(ptr %ptr, i64 %index, i64 %spacing) {29; CHECK-LABEL: store64idxneg256:30; CHECK: ; %bb.0:31; CHECK-NEXT: str x2, [x0], #-25632; CHECK-NEXT: ret33 %incdec.ptr = getelementptr inbounds i64, ptr %ptr, i64 -3234 store i64 %spacing, ptr %ptr, align 435 ret ptr %incdec.ptr36}37 38define ptr @store32(ptr %ptr, i32 %index, i32 %spacing) {39; CHECK-LABEL: store32:40; CHECK: ; %bb.0:41; CHECK-NEXT: str w2, [x0], #442; CHECK-NEXT: ret43 %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 144 store i32 %spacing, ptr %ptr, align 445 ret ptr %incdec.ptr46}47 48define ptr @store32idxpos256(ptr %ptr, i32 %index, i32 %spacing) {49; CHECK-LABEL: store32idxpos256:50; CHECK: ; %bb.0:51; CHECK-NEXT: mov x8, x052; CHECK-NEXT: add x0, x0, #25653; CHECK-NEXT: str w2, [x8]54; CHECK-NEXT: ret55 %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 6456 store i32 %spacing, ptr %ptr, align 457 ret ptr %incdec.ptr58}59 60define ptr @store32idxneg256(ptr %ptr, i32 %index, i32 %spacing) {61; CHECK-LABEL: store32idxneg256:62; CHECK: ; %bb.0:63; CHECK-NEXT: str w2, [x0], #-25664; CHECK-NEXT: ret65 %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 -6466 store i32 %spacing, ptr %ptr, align 467 ret ptr %incdec.ptr68}69 70define ptr @store16(ptr %ptr, i16 %index, i16 %spacing) {71; CHECK-LABEL: store16:72; CHECK: ; %bb.0:73; CHECK-NEXT: strh w2, [x0], #274; CHECK-NEXT: ret75 %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 176 store i16 %spacing, ptr %ptr, align 477 ret ptr %incdec.ptr78}79 80define ptr @store16idxpos256(ptr %ptr, i16 %index, i16 %spacing) {81; CHECK-LABEL: store16idxpos256:82; CHECK: ; %bb.0:83; CHECK-NEXT: mov x8, x084; CHECK-NEXT: add x0, x0, #25685; CHECK-NEXT: strh w2, [x8]86; CHECK-NEXT: ret87 %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 12888 store i16 %spacing, ptr %ptr, align 489 ret ptr %incdec.ptr90}91 92define ptr @store16idxneg256(ptr %ptr, i16 %index, i16 %spacing) {93; CHECK-LABEL: store16idxneg256:94; CHECK: ; %bb.0:95; CHECK-NEXT: strh w2, [x0], #-25696; CHECK-NEXT: ret97 %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 -12898 store i16 %spacing, ptr %ptr, align 499 ret ptr %incdec.ptr100}101 102define ptr @store8(ptr %ptr, i8 %index, i8 %spacing) {103; CHECK-LABEL: store8:104; CHECK: ; %bb.0:105; CHECK-NEXT: strb w2, [x0], #1106; CHECK-NEXT: ret107 %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 1108 store i8 %spacing, ptr %ptr, align 4109 ret ptr %incdec.ptr110}111 112define ptr @store8idxpos256(ptr %ptr, i8 %index, i8 %spacing) {113; CHECK-LABEL: store8idxpos256:114; CHECK: ; %bb.0:115; CHECK-NEXT: mov x8, x0116; CHECK-NEXT: add x0, x0, #256117; CHECK-NEXT: strb w2, [x8]118; CHECK-NEXT: ret119 %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 256120 store i8 %spacing, ptr %ptr, align 4121 ret ptr %incdec.ptr122}123 124define ptr @store8idxneg256(ptr %ptr, i8 %index, i8 %spacing) {125; CHECK-LABEL: store8idxneg256:126; CHECK: ; %bb.0:127; CHECK-NEXT: strb w2, [x0], #-256128; CHECK-NEXT: ret129 %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 -256130 store i8 %spacing, ptr %ptr, align 4131 ret ptr %incdec.ptr132}133 134define ptr @truncst64to32(ptr %ptr, i32 %index, i64 %spacing) {135; CHECK-LABEL: truncst64to32:136; CHECK: ; %bb.0:137; CHECK-NEXT: str w2, [x0], #4138; CHECK-NEXT: ret139 %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 1140 %trunc = trunc i64 %spacing to i32141 store i32 %trunc, ptr %ptr, align 4142 ret ptr %incdec.ptr143}144 145define ptr @truncst64to16(ptr %ptr, i16 %index, i64 %spacing) {146; CHECK-LABEL: truncst64to16:147; CHECK: ; %bb.0:148; CHECK-NEXT: strh w2, [x0], #2149; CHECK-NEXT: ret150 %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 1151 %trunc = trunc i64 %spacing to i16152 store i16 %trunc, ptr %ptr, align 4153 ret ptr %incdec.ptr154}155 156define ptr @truncst64to8(ptr %ptr, i8 %index, i64 %spacing) {157; CHECK-LABEL: truncst64to8:158; CHECK: ; %bb.0:159; CHECK-NEXT: strb w2, [x0], #1160; CHECK-NEXT: ret161 %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 1162 %trunc = trunc i64 %spacing to i8163 store i8 %trunc, ptr %ptr, align 4164 ret ptr %incdec.ptr165}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], #2172; CHECK-NEXT: ret173 %incdec.ptr = getelementptr inbounds half, ptr %ptr, i64 1174 store half %spacing, ptr %ptr, align 2175 ret ptr %incdec.ptr176}177 178define ptr @storef32(ptr %ptr, float %index, float %spacing) {179; CHECK-LABEL: storef32:180; CHECK: ; %bb.0:181; CHECK-NEXT: str s1, [x0], #4182; CHECK-NEXT: ret183 %incdec.ptr = getelementptr inbounds float, ptr %ptr, i64 1184 store float %spacing, ptr %ptr, align 4185 ret ptr %incdec.ptr186}187 188define ptr @storef64(ptr %ptr, double %index, double %spacing) {189; CHECK-LABEL: storef64:190; CHECK: ; %bb.0:191; CHECK-NEXT: str d1, [x0], #8192; CHECK-NEXT: ret193 %incdec.ptr = getelementptr inbounds double, ptr %ptr, i64 1194 store double %spacing, ptr %ptr, align 4195 ret ptr %incdec.ptr196}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: ret204 %incdec.ptr = getelementptr inbounds double, ptr %ptr, i64 4205 store double %spacing, ptr %incdec.ptr, align 4206 ret ptr %incdec.ptr207}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: ret214 %incdec.ptr = getelementptr inbounds float, ptr %ptr, i64 3215 store float %spacing, ptr %incdec.ptr, align 4216 ret ptr %incdec.ptr217}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: ret224 %incdec.ptr = getelementptr inbounds half, ptr %ptr, i64 3225 store half %spacing, ptr %incdec.ptr, align 2226 ret ptr %incdec.ptr227}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: ret234 %incdec.ptr = getelementptr inbounds i64, ptr %ptr, i64 2235 store i64 %spacing, ptr %incdec.ptr, align 4236 ret ptr %incdec.ptr237}238 239define ptr @pre64idxpos256(ptr %ptr, i64 %spacing) {240; CHECK-LABEL: pre64idxpos256:241; CHECK: ; %bb.0:242; CHECK-NEXT: mov x8, x0243; CHECK-NEXT: add x0, x0, #256244; CHECK-NEXT: str x1, [x8, #256]245; CHECK-NEXT: ret246 %incdec.ptr = getelementptr inbounds i64, ptr %ptr, i64 32247 store i64 %spacing, ptr %incdec.ptr, align 4248 ret ptr %incdec.ptr249}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: ret256 %incdec.ptr = getelementptr inbounds i64, ptr %ptr, i64 -32257 store i64 %spacing, ptr %incdec.ptr, align 4258 ret ptr %incdec.ptr259}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: ret266 %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 2267 store i32 %spacing, ptr %incdec.ptr, align 4268 ret ptr %incdec.ptr269}270 271define ptr @pre32idxpos256(ptr %ptr, i32 %spacing) {272; CHECK-LABEL: pre32idxpos256:273; CHECK: ; %bb.0:274; CHECK-NEXT: mov x8, x0275; CHECK-NEXT: add x0, x0, #256276; CHECK-NEXT: str w1, [x8, #256]277; CHECK-NEXT: ret278 %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 64279 store i32 %spacing, ptr %incdec.ptr, align 4280 ret ptr %incdec.ptr281}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: ret288 %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 -64289 store i32 %spacing, ptr %incdec.ptr, align 4290 ret ptr %incdec.ptr291}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: ret298 %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 2299 store i16 %spacing, ptr %incdec.ptr, align 4300 ret ptr %incdec.ptr301}302 303define ptr @pre16idxpos256(ptr %ptr, i16 %spacing) {304; CHECK-LABEL: pre16idxpos256:305; CHECK: ; %bb.0:306; CHECK-NEXT: mov x8, x0307; CHECK-NEXT: add x0, x0, #256308; CHECK-NEXT: strh w1, [x8, #256]309; CHECK-NEXT: ret310 %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 128311 store i16 %spacing, ptr %incdec.ptr, align 4312 ret ptr %incdec.ptr313}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: ret320 %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 -128321 store i16 %spacing, ptr %incdec.ptr, align 4322 ret ptr %incdec.ptr323}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: ret330 %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 2331 store i8 %spacing, ptr %incdec.ptr, align 4332 ret ptr %incdec.ptr333}334 335define ptr @pre8idxpos256(ptr %ptr, i8 %spacing) {336; CHECK-LABEL: pre8idxpos256:337; CHECK: ; %bb.0:338; CHECK-NEXT: mov x8, x0339; CHECK-NEXT: add x0, x0, #256340; CHECK-NEXT: strb w1, [x8, #256]341; CHECK-NEXT: ret342 %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 256343 store i8 %spacing, ptr %incdec.ptr, align 4344 ret ptr %incdec.ptr345}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: ret352 %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 -256353 store i8 %spacing, ptr %incdec.ptr, align 4354 ret ptr %incdec.ptr355}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: ret362 %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 2363 %trunc = trunc i64 %spacing to i32364 store i32 %trunc, ptr %incdec.ptr, align 4365 ret ptr %incdec.ptr366}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: ret373 %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 2374 %trunc = trunc i64 %spacing to i16375 store i16 %trunc, ptr %incdec.ptr, align 4376 ret ptr %incdec.ptr377}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: ret384 %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 2385 %trunc = trunc i64 %spacing to i8386 store i8 %trunc, ptr %incdec.ptr, align 4387 ret ptr %incdec.ptr388}389 390;-----391; Pre-indexed loads392;-----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: ret399 %ptr = getelementptr inbounds double, ptr %src, i64 1400 %tmp = load double, ptr %ptr, align 4401 store double %tmp, ptr %out, align 4402 ret ptr %ptr403}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: ret411 %ptr = getelementptr inbounds float, ptr %src, i64 1412 %tmp = load float, ptr %ptr, align 4413 store float %tmp, ptr %out, align 4414 ret ptr %ptr415}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: ret423 %ptr = getelementptr inbounds half, ptr %src, i64 1424 %tmp = load half, ptr %ptr, align 2425 store half %tmp, ptr %out, align 2426 ret ptr %ptr427}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: ret435 %ptr = getelementptr inbounds i64, ptr %src, i64 1436 %tmp = load i64, ptr %ptr, align 4437 store i64 %tmp, ptr %out, align 4438 ret ptr %ptr439}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: ret447 %ptr = getelementptr inbounds i32, ptr %src, i64 1448 %tmp = load i32, ptr %ptr, align 4449 store i32 %tmp, ptr %out, align 4450 ret ptr %ptr451}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: ret459 %ptr = getelementptr inbounds i16, ptr %src, i64 1460 %tmp = load i16, ptr %ptr, align 4461 %ext = zext i16 %tmp to i32462 store i32 %ext, ptr %out, align 4463 ret ptr %ptr464}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: ret472 %ptr = getelementptr inbounds i16, ptr %src, i64 1473 %tmp = load i16, ptr %ptr, align 4474 %ext = zext i16 %tmp to i64475 store i64 %ext, ptr %out, align 4476 ret ptr %ptr477}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: ret485 %ptr = getelementptr inbounds i8, ptr %src, i64 1486 %tmp = load i8, ptr %ptr, align 4487 %ext = zext i8 %tmp to i32488 store i32 %ext, ptr %out, align 4489 ret ptr %ptr490}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: ret498 %ptr = getelementptr inbounds i8, ptr %src, i64 1499 %tmp = load i8, ptr %ptr, align 4500 %ext = zext i8 %tmp to i64501 store i64 %ext, ptr %out, align 4502 ret ptr %ptr503}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: ret511 %ptr = getelementptr inbounds i32, ptr %src, i64 1512 %tmp = load i32, ptr %ptr, align 4513 %ext = sext i32 %tmp to i64514 store i64 %ext, ptr %out, align 8515 ret ptr %ptr516}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: ret524 %ptr = getelementptr inbounds i16, ptr %src, i64 1525 %tmp = load i16, ptr %ptr, align 4526 %ext = sext i16 %tmp to i32527 store i32 %ext, ptr %out, align 4528 ret ptr %ptr529}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: ret537 %ptr = getelementptr inbounds i16, ptr %src, i64 1538 %tmp = load i16, ptr %ptr, align 4539 %ext = sext i16 %tmp to i64540 store i64 %ext, ptr %out, align 4541 ret ptr %ptr542}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: ret550 %ptr = getelementptr inbounds i8, ptr %src, i64 1551 %tmp = load i8, ptr %ptr, align 4552 %ext = sext i8 %tmp to i32553 store i32 %ext, ptr %out, align 4554 ret ptr %ptr555}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: ret563 %ptr = getelementptr inbounds i8, ptr %src, i64 1564 %tmp = load i8, ptr %ptr, align 4565 %ext = sext i8 %tmp to i64566 store i64 %ext, ptr %out, align 4567 ret ptr %ptr568}569 570; This test checks if illegal post-index is generated571 572define ptr @postidx_clobber(ptr %addr) nounwind noinline ssp {573; CHECK64-LABEL: postidx_clobber:574; CHECK64: ; %bb.0:575; CHECK64-NEXT: mov x8, x0576; CHECK64-NEXT: str x0, [x8], #8577; CHECK64-NEXT: mov x0, x8578; CHECK64-NEXT: ret579;580; GISEL-LABEL: postidx_clobber:581; GISEL: ; %bb.0:582; GISEL-NEXT: mov x8, x0583; GISEL-NEXT: str x0, [x8], #8584; GISEL-NEXT: mov x0, x8585; GISEL-NEXT: ret586;587; CHECK32-LABEL: postidx_clobber:588; CHECK32: ; %bb.0:589; CHECK32-NEXT: mov x8, x0590; CHECK32-NEXT: add w0, w8, #8591; CHECK32-NEXT: str w8, [x8]592; CHECK32-NEXT: ret593; ret594 store ptr %addr, ptr %addr595 %newaddr = getelementptr i64, ptr %addr, i32 1596 ret ptr %newaddr597}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: ret605 %ptr = getelementptr inbounds i8, ptr %src, i64 1606 %tmp = load i8, ptr %ptr, align 1607 %sext = sext i8 %tmp to i32608 store i32 %sext, ptr %out, align 4609 ret ptr %ptr610}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: ret618 %ptr = getelementptr inbounds i16, ptr %src, i64 1619 %tmp = load i16, ptr %ptr, align 2620 %sext = sext i16 %tmp to i32621 store i32 %sext, ptr %out, align 4622 ret ptr %ptr623}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: ret631 %ptr = getelementptr inbounds i8, ptr %src, i64 1632 %tmp = load i8, ptr %ptr, align 1633 %sext = sext i8 %tmp to i64634 store i64 %sext, ptr %out, align 8635 ret ptr %ptr636}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: ret644 %ptr = getelementptr inbounds i16, ptr %src, i64 1645 %tmp = load i16, ptr %ptr, align 2646 %sext = sext i16 %tmp to i64647 store i64 %sext, ptr %out, align 8648 ret ptr %ptr649}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: ret657 %ptr = getelementptr inbounds i32, ptr %src, i64 1658 %tmp = load i32, ptr %ptr, align 2659 %sext = sext i32 %tmp to i64660 store i64 %sext, ptr %out, align 8661 ret ptr %ptr662}663 664define ptr @postidx32_sb(ptr %src, ptr %out) {665; CHECK-LABEL: postidx32_sb:666; CHECK: ; %bb.0:667; CHECK-NEXT: ldrsb w8, [x0], #1668; CHECK-NEXT: str w8, [x1]669; CHECK-NEXT: ret670 %tmp = load i8, ptr %src, align 1671 %ptr = getelementptr inbounds i8, ptr %src, i64 1672 %sext = sext i8 %tmp to i32673 store i32 %sext, ptr %out, align 4674 ret ptr %ptr675}676 677define ptr @postidx32_sh(ptr %src, ptr %out) {678; CHECK-LABEL: postidx32_sh:679; CHECK: ; %bb.0:680; CHECK-NEXT: ldrsh w8, [x0], #2681; CHECK-NEXT: str w8, [x1]682; CHECK-NEXT: ret683 %tmp = load i16, ptr %src, align 2684 %ptr = getelementptr inbounds i16, ptr %src, i64 1685 %sext = sext i16 %tmp to i32686 store i32 %sext, ptr %out, align 4687 ret ptr %ptr688}689 690define ptr @postidx64_sb(ptr %src, ptr %out) {691; CHECK-LABEL: postidx64_sb:692; CHECK: ; %bb.0:693; CHECK-NEXT: ldrsb x8, [x0], #1694; CHECK-NEXT: str x8, [x1]695; CHECK-NEXT: ret696 %tmp = load i8, ptr %src, align 1697 %ptr = getelementptr inbounds i8, ptr %src, i64 1698 %sext = sext i8 %tmp to i64699 store i64 %sext, ptr %out, align 8700 ret ptr %ptr701}702 703define ptr @postidx64_sh(ptr %src, ptr %out) {704; CHECK-LABEL: postidx64_sh:705; CHECK: ; %bb.0:706; CHECK-NEXT: ldrsh x8, [x0], #2707; CHECK-NEXT: str x8, [x1]708; CHECK-NEXT: ret709 %tmp = load i16, ptr %src, align 2710 %ptr = getelementptr inbounds i16, ptr %src, i64 1711 %sext = sext i16 %tmp to i64712 store i64 %sext, ptr %out, align 8713 ret ptr %ptr714}715 716define ptr @postidx64_sw(ptr %src, ptr %out) {717; CHECK-LABEL: postidx64_sw:718; CHECK: ; %bb.0:719; CHECK-NEXT: ldrsw x8, [x0], #4720; CHECK-NEXT: str x8, [x1]721; CHECK-NEXT: ret722 %tmp = load i32, ptr %src, align 4723 %ptr = getelementptr inbounds i32, ptr %src, i64 1724 %sext = sext i32 %tmp to i64725 store i64 %sext, ptr %out, align 8726 ret ptr %ptr727}728 729define ptr @postidx32_shalf(ptr %src, ptr %out, half %a) {730; CHECK64-LABEL: postidx32_shalf:731; CHECK64: ; %bb.0:732; CHECK64-NEXT: ldr h1, [x0], #4733; CHECK64-NEXT: ; kill: def $h0 killed $h0 def $s0734; CHECK64-NEXT: fcvt s2, h1735; CHECK64-NEXT: fcmp s2, #0.0736; CHECK64-NEXT: fcsel s0, s1, s0, mi737; CHECK64-NEXT: str h0, [x1]738; CHECK64-NEXT: ret739;740; GISEL-LABEL: postidx32_shalf:741; GISEL: ; %bb.0:742; GISEL-NEXT: ldr h1, [x0], #4743; GISEL-NEXT: ; kill: def $h0 killed $h0 def $s0744; GISEL-NEXT: fmov w9, s0745; GISEL-NEXT: fcvt s2, h1746; GISEL-NEXT: fmov w8, s1747; GISEL-NEXT: fcmp s2, #0.0748; GISEL-NEXT: csel w8, w8, w9, mi749; GISEL-NEXT: strh w8, [x1]750; GISEL-NEXT: ret751;752; CHECK32-LABEL: postidx32_shalf:753; CHECK32: ; %bb.0:754; CHECK32-NEXT: ldr h1, [x0], #4755; CHECK32-NEXT: ; kill: def $h0 killed $h0 def $s0756; CHECK32-NEXT: fcvt s2, h1757; CHECK32-NEXT: fcmp s2, #0.0758; CHECK32-NEXT: fcsel s0, s1, s0, mi759; CHECK32-NEXT: str h0, [x1]760; CHECK32-NEXT: ret761 %tmp = load half, ptr %src, align 2762 %ptr = getelementptr inbounds i32, ptr %src, i64 1763 %c = fcmp olt half %tmp, 0.0764 %s = select i1 %c, half %tmp, half %a765 store half %s, ptr %out, align 8766 ret ptr %ptr767}768