426 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc < %s -mtriple=aarch64-unknown-unknown | FileCheck %s3 4define <8 x i8> @inserti8_first(ptr %p) {5; CHECK-LABEL: inserti8_first:6; CHECK: // %bb.0:7; CHECK-NEXT: ldr d0, [x0]8; CHECK-NEXT: ret9 %q = getelementptr inbounds i8, ptr %p, i32 110 %l1 = load <8 x i8>, ptr %q11 %l2 = load i8, ptr %p12 %s = shufflevector <8 x i8> %l1, <8 x i8> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>13 %ins = insertelement <8 x i8> %s, i8 %l2, i32 014 ret <8 x i8> %ins15}16 17define <8 x i8> @inserti8_last(ptr %p) {18; CHECK-LABEL: inserti8_last:19; CHECK: // %bb.0:20; CHECK-NEXT: ldur d0, [x0, #1]21; CHECK-NEXT: ret22 %q = getelementptr inbounds i8, ptr %p, i32 823 %l1 = load <8 x i8>, ptr %p24 %l2 = load i8, ptr %q25 %s = shufflevector <8 x i8> %l1, <8 x i8> undef, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef>26 %ins = insertelement <8 x i8> %s, i8 %l2, i32 727 ret <8 x i8> %ins28}29 30define <8 x i16> @inserti8_first_sext(ptr %p) {31; CHECK-LABEL: inserti8_first_sext:32; CHECK: // %bb.0:33; CHECK-NEXT: ldr d0, [x0]34; CHECK-NEXT: sshll v0.8h, v0.8b, #035; CHECK-NEXT: ret36 %q = getelementptr inbounds i8, ptr %p, i32 137 %l1 = load <8 x i8>, ptr %q38 %s1 = sext <8 x i8> %l1 to <8 x i16>39 %l2 = load i8, ptr %p40 %s2 = sext i8 %l2 to i1641 %s = shufflevector <8 x i16> %s1, <8 x i16> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>42 %ins = insertelement <8 x i16> %s, i16 %s2, i32 043 ret <8 x i16> %ins44}45 46define <8 x i16> @inserti8_last_sext(ptr %p) {47; CHECK-LABEL: inserti8_last_sext:48; CHECK: // %bb.0:49; CHECK-NEXT: ldur d0, [x0, #1]50; CHECK-NEXT: sshll v0.8h, v0.8b, #051; CHECK-NEXT: ret52 %q = getelementptr inbounds i8, ptr %p, i32 853 %l1 = load <8 x i8>, ptr %p54 %s1 = sext <8 x i8> %l1 to <8 x i16>55 %l2 = load i8, ptr %q56 %s2 = sext i8 %l2 to i1657 %s = shufflevector <8 x i16> %s1, <8 x i16> undef, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef>58 %ins = insertelement <8 x i16> %s, i16 %s2, i32 759 ret <8 x i16> %ins60}61 62define <8 x i16> @inserti8_first_zext(ptr %p) {63; CHECK-LABEL: inserti8_first_zext:64; CHECK: // %bb.0:65; CHECK-NEXT: ldr d0, [x0]66; CHECK-NEXT: ushll v0.8h, v0.8b, #067; CHECK-NEXT: ret68 %q = getelementptr inbounds i8, ptr %p, i32 169 %l1 = load <8 x i8>, ptr %q70 %s1 = zext <8 x i8> %l1 to <8 x i16>71 %l2 = load i8, ptr %p72 %s2 = zext i8 %l2 to i1673 %s = shufflevector <8 x i16> %s1, <8 x i16> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>74 %ins = insertelement <8 x i16> %s, i16 %s2, i32 075 ret <8 x i16> %ins76}77 78define <8 x i16> @inserti8_last_zext(ptr %p) {79; CHECK-LABEL: inserti8_last_zext:80; CHECK: // %bb.0:81; CHECK-NEXT: ldur d0, [x0, #1]82; CHECK-NEXT: ushll v0.8h, v0.8b, #083; CHECK-NEXT: ret84 %q = getelementptr inbounds i8, ptr %p, i32 885 %l1 = load <8 x i8>, ptr %p86 %s1 = zext <8 x i8> %l1 to <8 x i16>87 %l2 = load i8, ptr %q88 %s2 = zext i8 %l2 to i1689 %s = shufflevector <8 x i16> %s1, <8 x i16> undef, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef>90 %ins = insertelement <8 x i16> %s, i16 %s2, i32 791 ret <8 x i16> %ins92}93 94define <8 x i32> @inserti32_first(ptr %p) {95; CHECK-LABEL: inserti32_first:96; CHECK: // %bb.0:97; CHECK-NEXT: ldp q0, q1, [x0]98; CHECK-NEXT: ret99 %q = getelementptr inbounds i8, ptr %p, i32 4100 %l1 = load <8 x i32>, ptr %q101 %l2 = load i32, ptr %p102 %s = shufflevector <8 x i32> %l1, <8 x i32> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>103 %ins = insertelement <8 x i32> %s, i32 %l2, i32 0104 ret <8 x i32> %ins105}106 107define <8 x i32> @inserti32_last(ptr %p) {108; CHECK-LABEL: inserti32_last:109; CHECK: // %bb.0:110; CHECK-NEXT: ldur q0, [x0, #4]111; CHECK-NEXT: ldur q1, [x0, #20]112; CHECK-NEXT: ret113 %q = getelementptr inbounds i8, ptr %p, i32 32114 %l1 = load <8 x i32>, ptr %p115 %l2 = load i32, ptr %q116 %s = shufflevector <8 x i32> %l1, <8 x i32> undef, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef>117 %ins = insertelement <8 x i32> %s, i32 %l2, i32 7118 ret <8 x i32> %ins119}120 121define <8 x i32> @inserti32_first_multiuse(ptr %p) {122; CHECK-LABEL: inserti32_first_multiuse:123; CHECK: // %bb.0:124; CHECK-NEXT: ldp q3, q2, [x0]125; CHECK-NEXT: ldur q1, [x0, #20]126; CHECK-NEXT: ldur q0, [x0, #4]127; CHECK-NEXT: add v0.4s, v0.4s, v3.4s128; CHECK-NEXT: add v1.4s, v1.4s, v2.4s129; CHECK-NEXT: ret130 %q = getelementptr inbounds i8, ptr %p, i32 4131 %l1 = load <8 x i32>, ptr %q132 %l2 = load i32, ptr %p133 %s = shufflevector <8 x i32> %l1, <8 x i32> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>134 %ins = insertelement <8 x i32> %s, i32 %l2, i32 0135 %a = add <8 x i32> %l1, %ins136 ret <8 x i32> %a137}138 139define <8 x i32> @inserti32_last_multiuse(ptr %p) {140; CHECK-LABEL: inserti32_last_multiuse:141; CHECK: // %bb.0:142; CHECK-NEXT: ldp q0, q1, [x0]143; CHECK-NEXT: ldur q2, [x0, #20]144; CHECK-NEXT: ldur q3, [x0, #4]145; CHECK-NEXT: add v0.4s, v0.4s, v3.4s146; CHECK-NEXT: add v1.4s, v1.4s, v2.4s147; CHECK-NEXT: ret148 %q = getelementptr inbounds i8, ptr %p, i32 32149 %l1 = load <8 x i32>, ptr %p150 %l2 = load i32, ptr %q151 %s = shufflevector <8 x i32> %l1, <8 x i32> undef, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef>152 %ins = insertelement <8 x i32> %s, i32 %l2, i32 7153 %a = add <8 x i32> %l1, %ins154 ret <8 x i32> %a155}156 157define <4 x float> @insertf32_first(ptr %p) {158; CHECK-LABEL: insertf32_first:159; CHECK: // %bb.0:160; CHECK-NEXT: ldr q0, [x0]161; CHECK-NEXT: ret162 %q = getelementptr inbounds i8, ptr %p, i32 4163 %l1 = load <4 x float>, ptr %q164 %l2 = load float, ptr %p165 %s = shufflevector <4 x float> %l1, <4 x float> undef, <4 x i32> <i32 undef, i32 0, i32 1, i32 2>166 %ins = insertelement <4 x float> %s, float %l2, i32 0167 ret <4 x float> %ins168}169 170define <4 x float> @insertf32_last(ptr %p) {171; CHECK-LABEL: insertf32_last:172; CHECK: // %bb.0:173; CHECK-NEXT: ldur q0, [x0, #4]174; CHECK-NEXT: ret175 %q = getelementptr inbounds i8, ptr %p, i32 16176 %l1 = load <4 x float>, ptr %p177 %l2 = load float, ptr %q178 %s = shufflevector <4 x float> %l1, <4 x float> undef, <4 x i32> <i32 1, i32 2, i32 3, i32 undef>179 %ins = insertelement <4 x float> %s, float %l2, i32 3180 ret <4 x float> %ins181}182 183define <2 x i64> @inserti64_first(ptr %p) {184; CHECK-LABEL: inserti64_first:185; CHECK: // %bb.0:186; CHECK-NEXT: ldr q0, [x0]187; CHECK-NEXT: ret188 %q = getelementptr inbounds i8, ptr %p, i32 8189 %l1 = load <2 x i64>, ptr %q190 %l2 = load i64, ptr %p191 %s = shufflevector <2 x i64> %l1, <2 x i64> undef, <2 x i32> <i32 undef, i32 0>192 %ins = insertelement <2 x i64> %s, i64 %l2, i32 0193 ret <2 x i64> %ins194}195 196define <2 x i64> @inserti64_last(ptr %p) {197; CHECK-LABEL: inserti64_last:198; CHECK: // %bb.0:199; CHECK-NEXT: ldur q0, [x0, #8]200; CHECK-NEXT: ret201 %q = getelementptr inbounds i8, ptr %p, i32 16202 %l1 = load <2 x i64>, ptr %p203 %l2 = load i64, ptr %q204 %s = shufflevector <2 x i64> %l1, <2 x i64> undef, <2 x i32> <i32 1, i32 undef>205 %ins = insertelement <2 x i64> %s, i64 %l2, i32 1206 ret <2 x i64> %ins207}208 209define <8 x i8> @inserti8_first_undef(ptr %p) {210; CHECK-LABEL: inserti8_first_undef:211; CHECK: // %bb.0:212; CHECK-NEXT: ldr d0, [x0]213; CHECK-NEXT: ret214 %q = getelementptr inbounds i8, ptr %p, i32 1215 %l1 = load <8 x i8>, ptr %q216 %l2 = load i8, ptr %p217 %s = shufflevector <8 x i8> %l1, <8 x i8> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 undef, i32 3, i32 4, i32 5, i32 6>218 %ins = insertelement <8 x i8> %s, i8 %l2, i32 0219 ret <8 x i8> %ins220}221 222define <8 x i8> @inserti8_last_undef(ptr %p) {223; CHECK-LABEL: inserti8_last_undef:224; CHECK: // %bb.0:225; CHECK-NEXT: ldur d0, [x0, #1]226; CHECK-NEXT: ret227 %q = getelementptr inbounds i8, ptr %p, i32 8228 %l1 = load <8 x i8>, ptr %p229 %l2 = load i8, ptr %q230 %s = shufflevector <8 x i8> %l1, <8 x i8> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>231 %ins = insertelement <8 x i8> %s, i8 %l2, i32 7232 ret <8 x i8> %ins233}234 235 236 237define <8 x i16> @wrong_zextandsext(ptr %p) {238; CHECK-LABEL: wrong_zextandsext:239; CHECK: // %bb.0:240; CHECK-NEXT: ldur d0, [x0, #1]241; CHECK-NEXT: ldrsb w8, [x0]242; CHECK-NEXT: ushll v0.8h, v0.8b, #0243; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #14244; CHECK-NEXT: mov v0.h[0], w8245; CHECK-NEXT: ret246 %q = getelementptr inbounds i8, ptr %p, i32 1247 %l1 = load <8 x i8>, ptr %q248 %s1 = zext <8 x i8> %l1 to <8 x i16>249 %l2 = load i8, ptr %p250 %s2 = sext i8 %l2 to i16251 %s = shufflevector <8 x i16> %s1, <8 x i16> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>252 %ins = insertelement <8 x i16> %s, i16 %s2, i32 0253 ret <8 x i16> %ins254}255 256define <8 x i8> @wrongidx_first(ptr %p) {257; CHECK-LABEL: wrongidx_first:258; CHECK: // %bb.0:259; CHECK-NEXT: ldur d0, [x0, #1]260; CHECK-NEXT: ext v0.8b, v0.8b, v0.8b, #7261; CHECK-NEXT: ld1 { v0.b }[7], [x0]262; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0263; CHECK-NEXT: ret264 %q = getelementptr inbounds i8, ptr %p, i32 1265 %l1 = load <8 x i8>, ptr %q266 %l2 = load i8, ptr %p267 %s = shufflevector <8 x i8> %l1, <8 x i8> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>268 %ins = insertelement <8 x i8> %s, i8 %l2, i32 7269 ret <8 x i8> %ins270}271 272define <8 x i8> @wrong_last(ptr %p) {273; CHECK-LABEL: wrong_last:274; CHECK: // %bb.0:275; CHECK-NEXT: ldr d0, [x0]276; CHECK-NEXT: add x8, x0, #8277; CHECK-NEXT: ext v0.8b, v0.8b, v0.8b, #1278; CHECK-NEXT: ld1 { v0.b }[0], [x8]279; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0280; CHECK-NEXT: ret281 %q = getelementptr inbounds i8, ptr %p, i32 8282 %l1 = load <8 x i8>, ptr %p283 %l2 = load i8, ptr %q284 %s = shufflevector <8 x i8> %l1, <8 x i8> undef, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef>285 %ins = insertelement <8 x i8> %s, i8 %l2, i32 0286 ret <8 x i8> %ins287}288 289define <8 x i8> @wrong_shuffle(ptr %p) {290; CHECK-LABEL: wrong_shuffle:291; CHECK: // %bb.0:292; CHECK-NEXT: ldur d0, [x0, #1]293; CHECK-NEXT: adrp x8, .LCPI19_0294; CHECK-NEXT: ldr d1, [x8, :lo12:.LCPI19_0]295; CHECK-NEXT: mov v0.d[1], v0.d[0]296; CHECK-NEXT: tbl v0.8b, { v0.16b }, v1.8b297; CHECK-NEXT: ld1 { v0.b }[0], [x0]298; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0299; CHECK-NEXT: ret300 %q = getelementptr inbounds i8, ptr %p, i32 1301 %l1 = load <8 x i8>, ptr %q302 %l2 = load i8, ptr %p303 %s = shufflevector <8 x i8> %l1, <8 x i8> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 3, i32 3, i32 4, i32 5, i32 6>304 %ins = insertelement <8 x i8> %s, i8 %l2, i32 0305 ret <8 x i8> %ins306}307 308define <8 x i16> @wrong_exttype(ptr %p) {309; CHECK-LABEL: wrong_exttype:310; CHECK: // %bb.0:311; CHECK-NEXT: ldur d0, [x0, #1]312; CHECK-NEXT: sshll v0.8h, v0.8b, #0313; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #14314; CHECK-NEXT: ld1 { v0.h }[0], [x0]315; CHECK-NEXT: ret316 %q = getelementptr inbounds i8, ptr %p, i32 1317 %l1 = load <8 x i8>, ptr %q318 %s1 = sext <8 x i8> %l1 to <8 x i16>319 %l2 = load i16, ptr %p320 %s = shufflevector <8 x i16> %s1, <8 x i16> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>321 %ins = insertelement <8 x i16> %s, i16 %l2, i32 0322 ret <8 x i16> %ins323}324 325define <4 x i32> @wrong_exttype2(ptr %p) {326; CHECK-LABEL: wrong_exttype2:327; CHECK: // %bb.0:328; CHECK-NEXT: ldur s0, [x0, #1]329; CHECK-NEXT: ldrsh w8, [x0]330; CHECK-NEXT: sshll v0.8h, v0.8b, #0331; CHECK-NEXT: sshll v0.4s, v0.4h, #0332; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #12333; CHECK-NEXT: mov v0.s[0], w8334; CHECK-NEXT: ret335 %q = getelementptr inbounds i8, ptr %p, i32 1336 %l1 = load <4 x i8>, ptr %q337 %s1 = sext <4 x i8> %l1 to <4 x i32>338 %l2 = load i16, ptr %p339 %s2 = sext i16 %l2 to i32340 %s = shufflevector <4 x i32> %s1, <4 x i32> undef, <4 x i32> <i32 undef, i32 0, i32 1, i32 2>341 %ins = insertelement <4 x i32> %s, i32 %s2, i32 0342 ret <4 x i32> %ins343}344 345define <8 x i8> @wrong_offsetfirst(ptr %p) {346; CHECK-LABEL: wrong_offsetfirst:347; CHECK: // %bb.0:348; CHECK-NEXT: ldur d0, [x0, #-1]349; CHECK-NEXT: ext v0.8b, v0.8b, v0.8b, #7350; CHECK-NEXT: ld1 { v0.b }[0], [x0]351; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0352; CHECK-NEXT: ret353 %q = getelementptr inbounds i8, ptr %p, i32 -1354 %l1 = load <8 x i8>, ptr %q355 %l2 = load i8, ptr %p356 %s = shufflevector <8 x i8> %l1, <8 x i8> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>357 %ins = insertelement <8 x i8> %s, i8 %l2, i32 0358 ret <8 x i8> %ins359}360 361define <8 x i8> @wrong_offsetlast(ptr %p) {362; CHECK-LABEL: wrong_offsetlast:363; CHECK: // %bb.0:364; CHECK-NEXT: ldr d0, [x0]365; CHECK-NEXT: add x8, x0, #7366; CHECK-NEXT: ext v0.8b, v0.8b, v0.8b, #1367; CHECK-NEXT: ld1 { v0.b }[7], [x8]368; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0369; CHECK-NEXT: ret370 %q = getelementptr inbounds i8, ptr %p, i32 7371 %l1 = load <8 x i8>, ptr %p372 %l2 = load i8, ptr %q373 %s = shufflevector <8 x i8> %l1, <8 x i8> undef, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef>374 %ins = insertelement <8 x i8> %s, i8 %l2, i32 7375 ret <8 x i8> %ins376}377 378 379define <8 x i8> @storebetween(ptr %p, ptr %r) {380; CHECK-LABEL: storebetween:381; CHECK: // %bb.0:382; CHECK-NEXT: ldur d0, [x0, #1]383; CHECK-NEXT: strb wzr, [x1]384; CHECK-NEXT: ext v0.8b, v0.8b, v0.8b, #7385; CHECK-NEXT: ld1 { v0.b }[0], [x0]386; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0387; CHECK-NEXT: ret388 %q = getelementptr inbounds i8, ptr %p, i32 1389 %l1 = load <8 x i8>, ptr %q390 store i8 0, ptr %r391 %l2 = load i8, ptr %p392 %s = shufflevector <8 x i8> %l1, <8 x i8> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>393 %ins = insertelement <8 x i8> %s, i8 %l2, i32 0394 ret <8 x i8> %ins395}396 397define <8 x i8> @storebefore(ptr %p, ptr %r) {398; CHECK-LABEL: storebefore:399; CHECK: // %bb.0:400; CHECK-NEXT: strb wzr, [x1]401; CHECK-NEXT: ldr d0, [x0]402; CHECK-NEXT: ret403 %q = getelementptr inbounds i8, ptr %p, i32 1404 store i8 0, ptr %r405 %l1 = load <8 x i8>, ptr %q406 %l2 = load i8, ptr %p407 %s = shufflevector <8 x i8> %l1, <8 x i8> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>408 %ins = insertelement <8 x i8> %s, i8 %l2, i32 0409 ret <8 x i8> %ins410}411 412define <8 x i8> @storeafter(ptr %p, ptr %r) {413; CHECK-LABEL: storeafter:414; CHECK: // %bb.0:415; CHECK-NEXT: ldr d0, [x0]416; CHECK-NEXT: strb wzr, [x1]417; CHECK-NEXT: ret418 %q = getelementptr inbounds i8, ptr %p, i32 1419 %l1 = load <8 x i8>, ptr %q420 %l2 = load i8, ptr %p421 store i8 0, ptr %r422 %s = shufflevector <8 x i8> %l1, <8 x i8> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>423 %ins = insertelement <8 x i8> %s, i8 %l2, i32 0424 ret <8 x i8> %ins425}426