972 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX13; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX24; RUN: llc < %s -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX --check-prefix=AVX512F5;6; Just one 32-bit run to make sure we do reasonable things.7; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=X86-AVX8 9define <4 x double> @merge_4f64_2f64_23(ptr %ptr) nounwind uwtable noinline ssp {10; AVX-LABEL: merge_4f64_2f64_23:11; AVX: # %bb.0:12; AVX-NEXT: vmovups 32(%rdi), %ymm013; AVX-NEXT: retq14;15; X86-AVX-LABEL: merge_4f64_2f64_23:16; X86-AVX: # %bb.0:17; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax18; X86-AVX-NEXT: vmovups 32(%eax), %ymm019; X86-AVX-NEXT: retl20 %ptr0 = getelementptr inbounds <2 x double>, ptr %ptr, i64 221 %ptr1 = getelementptr inbounds <2 x double>, ptr %ptr, i64 322 %val0 = load <2 x double>, ptr %ptr023 %val1 = load <2 x double>, ptr %ptr124 %res = shufflevector <2 x double> %val0, <2 x double> %val1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>25 ret <4 x double> %res26}27 28define <4 x double> @merge_4f64_2f64_2z(ptr %ptr) nounwind uwtable noinline ssp {29; AVX-LABEL: merge_4f64_2f64_2z:30; AVX: # %bb.0:31; AVX-NEXT: vmovaps 32(%rdi), %xmm032; AVX-NEXT: retq33;34; X86-AVX-LABEL: merge_4f64_2f64_2z:35; X86-AVX: # %bb.0:36; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax37; X86-AVX-NEXT: vmovaps 32(%eax), %xmm038; X86-AVX-NEXT: retl39 %ptr0 = getelementptr inbounds <2 x double>, ptr %ptr, i64 240 %val0 = load <2 x double>, ptr %ptr041 %res = shufflevector <2 x double> %val0, <2 x double> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>42 ret <4 x double> %res43}44 45define <4 x double> @merge_4f64_f64_2345(ptr %ptr) nounwind uwtable noinline ssp {46; AVX-LABEL: merge_4f64_f64_2345:47; AVX: # %bb.0:48; AVX-NEXT: vmovups 16(%rdi), %ymm049; AVX-NEXT: retq50;51; X86-AVX-LABEL: merge_4f64_f64_2345:52; X86-AVX: # %bb.0:53; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax54; X86-AVX-NEXT: vmovups 16(%eax), %ymm055; X86-AVX-NEXT: retl56 %ptr0 = getelementptr inbounds double, ptr %ptr, i64 257 %ptr1 = getelementptr inbounds double, ptr %ptr, i64 358 %ptr2 = getelementptr inbounds double, ptr %ptr, i64 459 %ptr3 = getelementptr inbounds double, ptr %ptr, i64 560 %val0 = load double, ptr %ptr061 %val1 = load double, ptr %ptr162 %val2 = load double, ptr %ptr263 %val3 = load double, ptr %ptr364 %res0 = insertelement <4 x double> undef, double %val0, i32 065 %res1 = insertelement <4 x double> %res0, double %val1, i32 166 %res2 = insertelement <4 x double> %res1, double %val2, i32 267 %res3 = insertelement <4 x double> %res2, double %val3, i32 368 ret <4 x double> %res369}70 71define <4 x double> @merge_4f64_f64_3zuu(ptr %ptr) nounwind uwtable noinline ssp {72; AVX-LABEL: merge_4f64_f64_3zuu:73; AVX: # %bb.0:74; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero75; AVX-NEXT: retq76;77; X86-AVX-LABEL: merge_4f64_f64_3zuu:78; X86-AVX: # %bb.0:79; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax80; X86-AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero81; X86-AVX-NEXT: retl82 %ptr0 = getelementptr inbounds double, ptr %ptr, i64 383 %val0 = load double, ptr %ptr084 %res0 = insertelement <4 x double> undef, double %val0, i32 085 %res1 = insertelement <4 x double> %res0, double 0.0, i32 186 ret <4 x double> %res187}88 89define <4 x double> @merge_4f64_f64_34uu(ptr %ptr) nounwind uwtable noinline ssp {90; AVX-LABEL: merge_4f64_f64_34uu:91; AVX: # %bb.0:92; AVX-NEXT: vmovups 24(%rdi), %xmm093; AVX-NEXT: retq94;95; X86-AVX-LABEL: merge_4f64_f64_34uu:96; X86-AVX: # %bb.0:97; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax98; X86-AVX-NEXT: vmovups 24(%eax), %xmm099; X86-AVX-NEXT: retl100 %ptr0 = getelementptr inbounds double, ptr %ptr, i64 3101 %ptr1 = getelementptr inbounds double, ptr %ptr, i64 4102 %val0 = load double, ptr %ptr0103 %val1 = load double, ptr %ptr1104 %res0 = insertelement <4 x double> undef, double %val0, i32 0105 %res1 = insertelement <4 x double> %res0, double %val1, i32 1106 ret <4 x double> %res1107}108 109define <4 x double> @merge_4f64_f64_45zz(ptr %ptr) nounwind uwtable noinline ssp {110; AVX-LABEL: merge_4f64_f64_45zz:111; AVX: # %bb.0:112; AVX-NEXT: vmovups 32(%rdi), %xmm0113; AVX-NEXT: retq114;115; X86-AVX-LABEL: merge_4f64_f64_45zz:116; X86-AVX: # %bb.0:117; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax118; X86-AVX-NEXT: vmovups 32(%eax), %xmm0119; X86-AVX-NEXT: retl120 %ptr0 = getelementptr inbounds double, ptr %ptr, i64 4121 %ptr1 = getelementptr inbounds double, ptr %ptr, i64 5122 %val0 = load double, ptr %ptr0123 %val1 = load double, ptr %ptr1124 %res0 = insertelement <4 x double> zeroinitializer, double %val0, i32 0125 %res1 = insertelement <4 x double> %res0, double %val1, i32 1126 ret <4 x double> %res1127}128 129define <4 x double> @merge_v4f64_f64_3210(ptr %ptr) nounwind uwtable noinline ssp {130; AVX1-LABEL: merge_v4f64_f64_3210:131; AVX1: # %bb.0:132; AVX1-NEXT: vperm2f128 {{.*#+}} ymm0 = mem[2,3,0,1]133; AVX1-NEXT: vshufpd {{.*#+}} ymm0 = ymm0[1,0,3,2]134; AVX1-NEXT: retq135;136; AVX2-LABEL: merge_v4f64_f64_3210:137; AVX2: # %bb.0:138; AVX2-NEXT: vpermpd {{.*#+}} ymm0 = mem[3,2,1,0]139; AVX2-NEXT: retq140;141; AVX512F-LABEL: merge_v4f64_f64_3210:142; AVX512F: # %bb.0:143; AVX512F-NEXT: vpermpd {{.*#+}} ymm0 = mem[3,2,1,0]144; AVX512F-NEXT: retq145;146; X86-AVX-LABEL: merge_v4f64_f64_3210:147; X86-AVX: # %bb.0:148; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax149; X86-AVX-NEXT: vperm2f128 {{.*#+}} ymm0 = mem[2,3,0,1]150; X86-AVX-NEXT: vshufpd {{.*#+}} ymm0 = ymm0[1,0,3,2]151; X86-AVX-NEXT: retl152 %ptr0 = getelementptr inbounds double, ptr %ptr, i64 3153 %ptr1 = getelementptr inbounds double, ptr %ptr, i64 2154 %ptr2 = getelementptr inbounds double, ptr %ptr, i64 1155 %ptr3 = getelementptr inbounds double, ptr %ptr, i64 0156 %val0 = load double, ptr %ptr0, align 4157 %val1 = load double, ptr %ptr1, align 4158 %val2 = load double, ptr %ptr2, align 4159 %val3 = load double, ptr %ptr3, align 4160 %res0 = insertelement <4 x double> poison, double %val0, i64 0161 %res1 = insertelement <4 x double> %res0, double %val1, i64 1162 %res2 = insertelement <4 x double> %res1, double %val2, i64 2163 %res3 = insertelement <4 x double> %res2, double %val3, i64 3164 ret <4 x double> %res3165}166 167define <4 x double> @merge_4f64_f64_34z6(ptr %ptr) nounwind uwtable noinline ssp {168; AVX-LABEL: merge_4f64_f64_34z6:169; AVX: # %bb.0:170; AVX-NEXT: vxorps %xmm0, %xmm0, %xmm0171; AVX-NEXT: vblendps {{.*#+}} ymm0 = mem[0,1,2,3],ymm0[4,5],mem[6,7]172; AVX-NEXT: retq173;174; X86-AVX-LABEL: merge_4f64_f64_34z6:175; X86-AVX: # %bb.0:176; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax177; X86-AVX-NEXT: vxorps %xmm0, %xmm0, %xmm0178; X86-AVX-NEXT: vblendps {{.*#+}} ymm0 = mem[0,1,2,3],ymm0[4,5],mem[6,7]179; X86-AVX-NEXT: retl180 %ptr0 = getelementptr inbounds double, ptr %ptr, i64 3181 %ptr1 = getelementptr inbounds double, ptr %ptr, i64 4182 %ptr3 = getelementptr inbounds double, ptr %ptr, i64 6183 %val0 = load double, ptr %ptr0184 %val1 = load double, ptr %ptr1185 %val3 = load double, ptr %ptr3186 %res0 = insertelement <4 x double> undef, double %val0, i32 0187 %res1 = insertelement <4 x double> %res0, double %val1, i32 1188 %res2 = insertelement <4 x double> %res1, double 0.0, i32 2189 %res3 = insertelement <4 x double> %res2, double %val3, i32 3190 ret <4 x double> %res3191}192 193define <4 x i64> @merge_4i64_2i64_3z(ptr %ptr) nounwind uwtable noinline ssp {194; AVX-LABEL: merge_4i64_2i64_3z:195; AVX: # %bb.0:196; AVX-NEXT: vmovaps 48(%rdi), %xmm0197; AVX-NEXT: retq198;199; X86-AVX-LABEL: merge_4i64_2i64_3z:200; X86-AVX: # %bb.0:201; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax202; X86-AVX-NEXT: vmovaps 48(%eax), %xmm0203; X86-AVX-NEXT: retl204 %ptr0 = getelementptr inbounds <2 x i64>, ptr %ptr, i64 3205 %val0 = load <2 x i64>, ptr %ptr0206 %res = shufflevector <2 x i64> %val0, <2 x i64> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>207 ret <4 x i64> %res208}209 210define <4 x i64> @merge_4i64_i64_1234(ptr %ptr) nounwind uwtable noinline ssp {211; AVX-LABEL: merge_4i64_i64_1234:212; AVX: # %bb.0:213; AVX-NEXT: vmovups 8(%rdi), %ymm0214; AVX-NEXT: retq215;216; X86-AVX-LABEL: merge_4i64_i64_1234:217; X86-AVX: # %bb.0:218; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax219; X86-AVX-NEXT: vmovups 8(%eax), %ymm0220; X86-AVX-NEXT: retl221 %ptr0 = getelementptr inbounds i64, ptr %ptr, i64 1222 %ptr1 = getelementptr inbounds i64, ptr %ptr, i64 2223 %ptr2 = getelementptr inbounds i64, ptr %ptr, i64 3224 %ptr3 = getelementptr inbounds i64, ptr %ptr, i64 4225 %val0 = load i64, ptr %ptr0226 %val1 = load i64, ptr %ptr1227 %val2 = load i64, ptr %ptr2228 %val3 = load i64, ptr %ptr3229 %res0 = insertelement <4 x i64> undef, i64 %val0, i32 0230 %res1 = insertelement <4 x i64> %res0, i64 %val1, i32 1231 %res2 = insertelement <4 x i64> %res1, i64 %val2, i32 2232 %res3 = insertelement <4 x i64> %res2, i64 %val3, i32 3233 ret <4 x i64> %res3234}235 236define <4 x i64> @merge_4i64_i64_1zzu(ptr %ptr) nounwind uwtable noinline ssp {237; AVX-LABEL: merge_4i64_i64_1zzu:238; AVX: # %bb.0:239; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero240; AVX-NEXT: retq241;242; X86-AVX-LABEL: merge_4i64_i64_1zzu:243; X86-AVX: # %bb.0:244; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax245; X86-AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero246; X86-AVX-NEXT: retl247 %ptr0 = getelementptr inbounds i64, ptr %ptr, i64 1248 %val0 = load i64, ptr %ptr0249 %res0 = insertelement <4 x i64> undef, i64 %val0, i32 0250 %res1 = insertelement <4 x i64> %res0, i64 0, i32 1251 %res2 = insertelement <4 x i64> %res1, i64 0, i32 2252 ret <4 x i64> %res2253}254 255define <4 x i64> @merge_4i64_i64_23zz(ptr %ptr) nounwind uwtable noinline ssp {256; AVX-LABEL: merge_4i64_i64_23zz:257; AVX: # %bb.0:258; AVX-NEXT: vmovups 16(%rdi), %xmm0259; AVX-NEXT: retq260;261; X86-AVX-LABEL: merge_4i64_i64_23zz:262; X86-AVX: # %bb.0:263; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax264; X86-AVX-NEXT: vmovups 16(%eax), %xmm0265; X86-AVX-NEXT: retl266 %ptr0 = getelementptr inbounds i64, ptr %ptr, i64 2267 %ptr1 = getelementptr inbounds i64, ptr %ptr, i64 3268 %val0 = load i64, ptr %ptr0269 %val1 = load i64, ptr %ptr1270 %res0 = insertelement <4 x i64> zeroinitializer, i64 %val0, i32 0271 %res1 = insertelement <4 x i64> %res0, i64 %val1, i32 1272 ret <4 x i64> %res1273}274 275define <4 x i64> @merge_v4i64_i64_3210(ptr %ptr) nounwind uwtable noinline ssp {276; AVX1-LABEL: merge_v4i64_i64_3210:277; AVX1: # %bb.0:278; AVX1-NEXT: vperm2f128 {{.*#+}} ymm0 = mem[2,3,0,1]279; AVX1-NEXT: vshufpd {{.*#+}} ymm0 = ymm0[1,0,3,2]280; AVX1-NEXT: retq281;282; AVX2-LABEL: merge_v4i64_i64_3210:283; AVX2: # %bb.0:284; AVX2-NEXT: vpermpd {{.*#+}} ymm0 = mem[3,2,1,0]285; AVX2-NEXT: retq286;287; AVX512F-LABEL: merge_v4i64_i64_3210:288; AVX512F: # %bb.0:289; AVX512F-NEXT: vpermpd {{.*#+}} ymm0 = mem[3,2,1,0]290; AVX512F-NEXT: retq291;292; X86-AVX-LABEL: merge_v4i64_i64_3210:293; X86-AVX: # %bb.0:294; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax295; X86-AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero296; X86-AVX-NEXT: vpinsrd $1, 12(%eax), %xmm0, %xmm0297; X86-AVX-NEXT: vpinsrd $2, (%eax), %xmm0, %xmm0298; X86-AVX-NEXT: vpinsrd $3, 4(%eax), %xmm0, %xmm0299; X86-AVX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero300; X86-AVX-NEXT: vpinsrd $1, 28(%eax), %xmm1, %xmm1301; X86-AVX-NEXT: vpinsrd $2, 16(%eax), %xmm1, %xmm1302; X86-AVX-NEXT: vpinsrd $3, 20(%eax), %xmm1, %xmm1303; X86-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0304; X86-AVX-NEXT: retl305 %ptr0 = getelementptr inbounds i64, ptr %ptr, i64 3306 %ptr1 = getelementptr inbounds i64, ptr %ptr, i64 2307 %ptr2 = getelementptr inbounds i64, ptr %ptr, i64 1308 %ptr3 = getelementptr inbounds i64, ptr %ptr, i64 0309 %val0 = load i64, ptr %ptr0, align 4310 %val1 = load i64, ptr %ptr1, align 4311 %val2 = load i64, ptr %ptr2, align 4312 %val3 = load i64, ptr %ptr3, align 4313 %res0 = insertelement <4 x i64> poison, i64 %val0, i64 0314 %res1 = insertelement <4 x i64> %res0, i64 %val1, i64 1315 %res2 = insertelement <4 x i64> %res1, i64 %val2, i64 2316 %res3 = insertelement <4 x i64> %res2, i64 %val3, i64 3317 ret <4 x i64> %res3318}319 320define <8 x float> @merge_8f32_2f32_23z5(ptr %ptr) nounwind uwtable noinline ssp {321; AVX-LABEL: merge_8f32_2f32_23z5:322; AVX: # %bb.0:323; AVX-NEXT: vmovups 16(%rdi), %xmm0324; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1325; AVX-NEXT: vmovhps {{.*#+}} xmm1 = xmm1[0,1],mem[0,1]326; AVX-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0327; AVX-NEXT: retq328;329; X86-AVX-LABEL: merge_8f32_2f32_23z5:330; X86-AVX: # %bb.0:331; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax332; X86-AVX-NEXT: vmovups 16(%eax), %xmm0333; X86-AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1334; X86-AVX-NEXT: vmovhps {{.*#+}} xmm1 = xmm1[0,1],mem[0,1]335; X86-AVX-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0336; X86-AVX-NEXT: retl337 %ptr0 = getelementptr inbounds <2 x float>, ptr %ptr, i64 2338 %ptr1 = getelementptr inbounds <2 x float>, ptr %ptr, i64 3339 %ptr3 = getelementptr inbounds <2 x float>, ptr %ptr, i64 5340 %val0 = load <2 x float>, ptr %ptr0341 %val1 = load <2 x float>, ptr %ptr1342 %val3 = load <2 x float>, ptr %ptr3343 %res01 = shufflevector <2 x float> %val0, <2 x float> %val1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>344 %res23 = shufflevector <2 x float> zeroinitializer, <2 x float> %val3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>345 %res = shufflevector <4 x float> %res01, <4 x float> %res23, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>346 ret <8 x float> %res347}348 349define <8 x float> @merge_8f32_4f32_z2(ptr %ptr) nounwind uwtable noinline ssp {350; AVX-LABEL: merge_8f32_4f32_z2:351; AVX: # %bb.0:352; AVX-NEXT: vxorps %xmm0, %xmm0, %xmm0353; AVX-NEXT: vinsertf128 $1, 32(%rdi), %ymm0, %ymm0354; AVX-NEXT: retq355;356; X86-AVX-LABEL: merge_8f32_4f32_z2:357; X86-AVX: # %bb.0:358; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax359; X86-AVX-NEXT: vxorps %xmm0, %xmm0, %xmm0360; X86-AVX-NEXT: vinsertf128 $1, 32(%eax), %ymm0, %ymm0361; X86-AVX-NEXT: retl362 %ptr1 = getelementptr inbounds <4 x float>, ptr %ptr, i64 2363 %val1 = load <4 x float>, ptr %ptr1364 %res = shufflevector <4 x float> zeroinitializer, <4 x float> %val1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>365 ret <8 x float> %res366}367 368define <8 x float> @merge_8f32_f32_12zzuuzz(ptr %ptr) nounwind uwtable noinline ssp {369; AVX-LABEL: merge_8f32_f32_12zzuuzz:370; AVX: # %bb.0:371; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero372; AVX-NEXT: retq373;374; X86-AVX-LABEL: merge_8f32_f32_12zzuuzz:375; X86-AVX: # %bb.0:376; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax377; X86-AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero378; X86-AVX-NEXT: retl379 %ptr0 = getelementptr inbounds float, ptr %ptr, i64 1380 %ptr1 = getelementptr inbounds float, ptr %ptr, i64 2381 %val0 = load float, ptr %ptr0382 %val1 = load float, ptr %ptr1383 %res0 = insertelement <8 x float> undef, float %val0, i32 0384 %res1 = insertelement <8 x float> %res0, float %val1, i32 1385 %res2 = insertelement <8 x float> %res1, float 0.0, i32 2386 %res3 = insertelement <8 x float> %res2, float 0.0, i32 3387 %res6 = insertelement <8 x float> %res3, float 0.0, i32 6388 %res7 = insertelement <8 x float> %res6, float 0.0, i32 7389 ret <8 x float> %res7390}391 392define <8 x float> @merge_8f32_f32_1u3u5zu8(ptr %ptr) nounwind uwtable noinline ssp {393; AVX-LABEL: merge_8f32_f32_1u3u5zu8:394; AVX: # %bb.0:395; AVX-NEXT: vxorps %xmm0, %xmm0, %xmm0396; AVX-NEXT: vblendps {{.*#+}} ymm0 = mem[0,1,2,3,4],ymm0[5],mem[6,7]397; AVX-NEXT: retq398;399; X86-AVX-LABEL: merge_8f32_f32_1u3u5zu8:400; X86-AVX: # %bb.0:401; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax402; X86-AVX-NEXT: vxorps %xmm0, %xmm0, %xmm0403; X86-AVX-NEXT: vblendps {{.*#+}} ymm0 = mem[0,1,2,3,4],ymm0[5],mem[6,7]404; X86-AVX-NEXT: retl405 %ptr0 = getelementptr inbounds float, ptr %ptr, i64 1406 %ptr2 = getelementptr inbounds float, ptr %ptr, i64 3407 %ptr4 = getelementptr inbounds float, ptr %ptr, i64 5408 %ptr7 = getelementptr inbounds float, ptr %ptr, i64 8409 %val0 = load float, ptr %ptr0410 %val2 = load float, ptr %ptr2411 %val4 = load float, ptr %ptr4412 %val7 = load float, ptr %ptr7413 %res0 = insertelement <8 x float> undef, float %val0, i32 0414 %res2 = insertelement <8 x float> %res0, float %val2, i32 2415 %res4 = insertelement <8 x float> %res2, float %val4, i32 4416 %res5 = insertelement <8 x float> %res4, float 0.0, i32 5417 %res7 = insertelement <8 x float> %res5, float %val7, i32 7418 ret <8 x float> %res7419}420 421define <8 x float> @merge_8f32_f32_76543210(ptr %ptr) nounwind uwtable noinline ssp {422; AVX1-LABEL: merge_8f32_f32_76543210:423; AVX1: # %bb.0:424; AVX1-NEXT: vperm2f128 {{.*#+}} ymm0 = mem[2,3,0,1]425; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[3,2,1,0,7,6,5,4]426; AVX1-NEXT: retq427;428; AVX2-LABEL: merge_8f32_f32_76543210:429; AVX2: # %bb.0:430; AVX2-NEXT: vpermilps {{.*#+}} ymm0 = mem[3,2,1,0,7,6,5,4]431; AVX2-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[2,3,0,1]432; AVX2-NEXT: retq433;434; AVX512F-LABEL: merge_8f32_f32_76543210:435; AVX512F: # %bb.0:436; AVX512F-NEXT: vpermilps {{.*#+}} ymm0 = mem[3,2,1,0,7,6,5,4]437; AVX512F-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[2,3,0,1]438; AVX512F-NEXT: retq439;440; X86-AVX-LABEL: merge_8f32_f32_76543210:441; X86-AVX: # %bb.0:442; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax443; X86-AVX-NEXT: vperm2f128 {{.*#+}} ymm0 = mem[2,3,0,1]444; X86-AVX-NEXT: vshufps {{.*#+}} ymm0 = ymm0[3,2,1,0,7,6,5,4]445; X86-AVX-NEXT: retl446 %ptr0 = getelementptr inbounds float, ptr %ptr, i64 7447 %ptr1 = getelementptr inbounds float, ptr %ptr, i64 6448 %ptr2 = getelementptr inbounds float, ptr %ptr, i64 5449 %ptr3 = getelementptr inbounds float, ptr %ptr, i64 4450 %ptr4 = getelementptr inbounds float, ptr %ptr, i64 3451 %ptr5 = getelementptr inbounds float, ptr %ptr, i64 2452 %ptr6 = getelementptr inbounds float, ptr %ptr, i64 1453 %ptr7 = getelementptr inbounds float, ptr %ptr, i64 0454 %val0 = load float, ptr %ptr0455 %val1 = load float, ptr %ptr1456 %val2 = load float, ptr %ptr2457 %val3 = load float, ptr %ptr3458 %val4 = load float, ptr %ptr4459 %val5 = load float, ptr %ptr5460 %val6 = load float, ptr %ptr6461 %val7 = load float, ptr %ptr7462 %res0 = insertelement <8 x float> poison, float %val0, i64 0463 %res1 = insertelement <8 x float> %res0, float %val1, i64 1464 %res2 = insertelement <8 x float> %res1, float %val2, i64 2465 %res3 = insertelement <8 x float> %res2, float %val3, i64 3466 %res4 = insertelement <8 x float> %res3, float %val4, i64 4467 %res5 = insertelement <8 x float> %res4, float %val5, i64 5468 %res6 = insertelement <8 x float> %res5, float %val6, i64 6469 %res7 = insertelement <8 x float> %res6, float %val7, i64 7470 ret <8 x float> %res7471}472 473define <8 x i32> @merge_8i32_4i32_z3(ptr %ptr) nounwind uwtable noinline ssp {474; AVX-LABEL: merge_8i32_4i32_z3:475; AVX: # %bb.0:476; AVX-NEXT: vxorps %xmm0, %xmm0, %xmm0477; AVX-NEXT: vinsertf128 $1, 48(%rdi), %ymm0, %ymm0478; AVX-NEXT: retq479;480; X86-AVX-LABEL: merge_8i32_4i32_z3:481; X86-AVX: # %bb.0:482; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax483; X86-AVX-NEXT: vxorps %xmm0, %xmm0, %xmm0484; X86-AVX-NEXT: vinsertf128 $1, 48(%eax), %ymm0, %ymm0485; X86-AVX-NEXT: retl486 %ptr1 = getelementptr inbounds <4 x i32>, ptr %ptr, i64 3487 %val1 = load <4 x i32>, ptr %ptr1488 %res = shufflevector <4 x i32> zeroinitializer, <4 x i32> %val1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>489 ret <8 x i32> %res490}491 492define <8 x i32> @merge_8i32_i32_56zz9uzz(ptr %ptr) nounwind uwtable noinline ssp {493; AVX-LABEL: merge_8i32_i32_56zz9uzz:494; AVX: # %bb.0:495; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero496; AVX-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero497; AVX-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0498; AVX-NEXT: retq499;500; X86-AVX-LABEL: merge_8i32_i32_56zz9uzz:501; X86-AVX: # %bb.0:502; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax503; X86-AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero504; X86-AVX-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero505; X86-AVX-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0506; X86-AVX-NEXT: retl507 %ptr0 = getelementptr inbounds i32, ptr %ptr, i64 5508 %ptr1 = getelementptr inbounds i32, ptr %ptr, i64 6509 %ptr4 = getelementptr inbounds i32, ptr %ptr, i64 9510 %val0 = load i32, ptr %ptr0511 %val1 = load i32, ptr %ptr1512 %val4 = load i32, ptr %ptr4513 %res0 = insertelement <8 x i32> undef, i32 %val0, i32 0514 %res1 = insertelement <8 x i32> %res0, i32 %val1, i32 1515 %res2 = insertelement <8 x i32> %res1, i32 0, i32 2516 %res3 = insertelement <8 x i32> %res2, i32 0, i32 3517 %res4 = insertelement <8 x i32> %res3, i32 %val4, i32 4518 %res6 = insertelement <8 x i32> %res4, i32 0, i32 6519 %res7 = insertelement <8 x i32> %res6, i32 0, i32 7520 ret <8 x i32> %res7521}522 523define <8 x i32> @merge_8i32_i32_1u3u5zu8(ptr %ptr) nounwind uwtable noinline ssp {524; AVX-LABEL: merge_8i32_i32_1u3u5zu8:525; AVX: # %bb.0:526; AVX-NEXT: vxorps %xmm0, %xmm0, %xmm0527; AVX-NEXT: vblendps {{.*#+}} ymm0 = mem[0,1,2,3,4],ymm0[5],mem[6,7]528; AVX-NEXT: retq529;530; X86-AVX-LABEL: merge_8i32_i32_1u3u5zu8:531; X86-AVX: # %bb.0:532; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax533; X86-AVX-NEXT: vxorps %xmm0, %xmm0, %xmm0534; X86-AVX-NEXT: vblendps {{.*#+}} ymm0 = mem[0,1,2,3,4],ymm0[5],mem[6,7]535; X86-AVX-NEXT: retl536 %ptr0 = getelementptr inbounds i32, ptr %ptr, i64 1537 %ptr2 = getelementptr inbounds i32, ptr %ptr, i64 3538 %ptr4 = getelementptr inbounds i32, ptr %ptr, i64 5539 %ptr7 = getelementptr inbounds i32, ptr %ptr, i64 8540 %val0 = load i32, ptr %ptr0541 %val2 = load i32, ptr %ptr2542 %val4 = load i32, ptr %ptr4543 %val7 = load i32, ptr %ptr7544 %res0 = insertelement <8 x i32> undef, i32 %val0, i32 0545 %res2 = insertelement <8 x i32> %res0, i32 %val2, i32 2546 %res4 = insertelement <8 x i32> %res2, i32 %val4, i32 4547 %res5 = insertelement <8 x i32> %res4, i32 0, i32 5548 %res7 = insertelement <8 x i32> %res5, i32 %val7, i32 7549 ret <8 x i32> %res7550}551 552define <8 x i32> @merge_8i32_i32_76543210(ptr %ptr) nounwind uwtable noinline ssp {553; AVX1-LABEL: merge_8i32_i32_76543210:554; AVX1: # %bb.0:555; AVX1-NEXT: vperm2f128 {{.*#+}} ymm0 = mem[2,3,0,1]556; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[3,2,1,0,7,6,5,4]557; AVX1-NEXT: retq558;559; AVX2-LABEL: merge_8i32_i32_76543210:560; AVX2: # %bb.0:561; AVX2-NEXT: vpermilps {{.*#+}} ymm0 = mem[3,2,1,0,7,6,5,4]562; AVX2-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[2,3,0,1]563; AVX2-NEXT: retq564;565; AVX512F-LABEL: merge_8i32_i32_76543210:566; AVX512F: # %bb.0:567; AVX512F-NEXT: vpermilps {{.*#+}} ymm0 = mem[3,2,1,0,7,6,5,4]568; AVX512F-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[2,3,0,1]569; AVX512F-NEXT: retq570;571; X86-AVX-LABEL: merge_8i32_i32_76543210:572; X86-AVX: # %bb.0:573; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax574; X86-AVX-NEXT: vperm2f128 {{.*#+}} ymm0 = mem[2,3,0,1]575; X86-AVX-NEXT: vshufps {{.*#+}} ymm0 = ymm0[3,2,1,0,7,6,5,4]576; X86-AVX-NEXT: retl577 %ptr0 = getelementptr inbounds i32, ptr %ptr, i64 7578 %ptr1 = getelementptr inbounds i32, ptr %ptr, i64 6579 %ptr2 = getelementptr inbounds i32, ptr %ptr, i64 5580 %ptr3 = getelementptr inbounds i32, ptr %ptr, i64 4581 %ptr4 = getelementptr inbounds i32, ptr %ptr, i64 3582 %ptr5 = getelementptr inbounds i32, ptr %ptr, i64 2583 %ptr6 = getelementptr inbounds i32, ptr %ptr, i64 1584 %ptr7 = getelementptr inbounds i32, ptr %ptr, i64 0585 %val0 = load i32, ptr %ptr0586 %val1 = load i32, ptr %ptr1587 %val2 = load i32, ptr %ptr2588 %val3 = load i32, ptr %ptr3589 %val4 = load i32, ptr %ptr4590 %val5 = load i32, ptr %ptr5591 %val6 = load i32, ptr %ptr6592 %val7 = load i32, ptr %ptr7593 %res0 = insertelement <8 x i32> poison, i32 %val0, i64 0594 %res1 = insertelement <8 x i32> %res0, i32 %val1, i64 1595 %res2 = insertelement <8 x i32> %res1, i32 %val2, i64 2596 %res3 = insertelement <8 x i32> %res2, i32 %val3, i64 3597 %res4 = insertelement <8 x i32> %res3, i32 %val4, i64 4598 %res5 = insertelement <8 x i32> %res4, i32 %val5, i64 5599 %res6 = insertelement <8 x i32> %res5, i32 %val6, i64 6600 %res7 = insertelement <8 x i32> %res6, i32 %val7, i64 7601 ret <8 x i32> %res7602}603 604define <16 x i16> @merge_16i16_i16_89zzzuuuuuuuuuuuz(ptr %ptr) nounwind uwtable noinline ssp {605; AVX-LABEL: merge_16i16_i16_89zzzuuuuuuuuuuuz:606; AVX: # %bb.0:607; AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero608; AVX-NEXT: retq609;610; X86-AVX-LABEL: merge_16i16_i16_89zzzuuuuuuuuuuuz:611; X86-AVX: # %bb.0:612; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax613; X86-AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero614; X86-AVX-NEXT: retl615 %ptr0 = getelementptr inbounds i16, ptr %ptr, i64 8616 %ptr1 = getelementptr inbounds i16, ptr %ptr, i64 9617 %val0 = load i16, ptr %ptr0618 %val1 = load i16, ptr %ptr1619 %res0 = insertelement <16 x i16> undef, i16 %val0, i16 0620 %res1 = insertelement <16 x i16> %res0, i16 %val1, i16 1621 %res2 = insertelement <16 x i16> %res1, i16 0, i16 2622 %res3 = insertelement <16 x i16> %res2, i16 0, i16 3623 %res4 = insertelement <16 x i16> %res3, i16 0, i16 4624 %resF = insertelement <16 x i16> %res4, i16 0, i16 15625 ret <16 x i16> %resF626}627 628define <16 x i16> @merge_16i16_i16_45u7uuuuuuuuuuuu(ptr %ptr) nounwind uwtable noinline ssp {629; AVX-LABEL: merge_16i16_i16_45u7uuuuuuuuuuuu:630; AVX: # %bb.0:631; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero632; AVX-NEXT: retq633;634; X86-AVX-LABEL: merge_16i16_i16_45u7uuuuuuuuuuuu:635; X86-AVX: # %bb.0:636; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax637; X86-AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero638; X86-AVX-NEXT: retl639 %ptr0 = getelementptr inbounds i16, ptr %ptr, i64 4640 %ptr1 = getelementptr inbounds i16, ptr %ptr, i64 5641 %ptr3 = getelementptr inbounds i16, ptr %ptr, i64 7642 %val0 = load i16, ptr %ptr0643 %val1 = load i16, ptr %ptr1644 %val3 = load i16, ptr %ptr3645 %res0 = insertelement <16 x i16> undef, i16 %val0, i16 0646 %res1 = insertelement <16 x i16> %res0, i16 %val1, i16 1647 %res3 = insertelement <16 x i16> %res1, i16 %val3, i16 3648 ret <16 x i16> %res3649}650 651define <16 x i16> @merge_16i16_i16_0uu3uuuuuuuuCuEF(ptr %ptr) nounwind uwtable noinline ssp {652; AVX-LABEL: merge_16i16_i16_0uu3uuuuuuuuCuEF:653; AVX: # %bb.0:654; AVX-NEXT: vmovups (%rdi), %ymm0655; AVX-NEXT: retq656;657; X86-AVX-LABEL: merge_16i16_i16_0uu3uuuuuuuuCuEF:658; X86-AVX: # %bb.0:659; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax660; X86-AVX-NEXT: vmovups (%eax), %ymm0661; X86-AVX-NEXT: retl662 %ptr3 = getelementptr inbounds i16, ptr %ptr, i64 3663 %ptrC = getelementptr inbounds i16, ptr %ptr, i64 12664 %ptrE = getelementptr inbounds i16, ptr %ptr, i64 14665 %ptrF = getelementptr inbounds i16, ptr %ptr, i64 15666 %val0 = load i16, ptr %ptr667 %val3 = load i16, ptr %ptr3668 %valC = load i16, ptr %ptrC669 %valE = load i16, ptr %ptrE670 %valF = load i16, ptr %ptrF671 %res0 = insertelement <16 x i16> undef, i16 %val0, i16 0672 %res3 = insertelement <16 x i16> %res0, i16 %val3, i16 3673 %resC = insertelement <16 x i16> %res3, i16 %valC, i16 12674 %resE = insertelement <16 x i16> %resC, i16 %valE, i16 14675 %resF = insertelement <16 x i16> %resE, i16 %valF, i16 15676 ret <16 x i16> %resF677}678 679define <16 x i16> @merge_16i16_i16_0uu3zzuuuuuzCuEF(ptr %ptr) nounwind uwtable noinline ssp {680; AVX-LABEL: merge_16i16_i16_0uu3zzuuuuuzCuEF:681; AVX: # %bb.0:682; AVX-NEXT: vmovups (%rdi), %ymm0683; AVX-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0684; AVX-NEXT: retq685;686; X86-AVX-LABEL: merge_16i16_i16_0uu3zzuuuuuzCuEF:687; X86-AVX: # %bb.0:688; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax689; X86-AVX-NEXT: vmovups (%eax), %ymm0690; X86-AVX-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm0691; X86-AVX-NEXT: retl692 %ptr3 = getelementptr inbounds i16, ptr %ptr, i64 3693 %ptrC = getelementptr inbounds i16, ptr %ptr, i64 12694 %ptrE = getelementptr inbounds i16, ptr %ptr, i64 14695 %ptrF = getelementptr inbounds i16, ptr %ptr, i64 15696 %val0 = load i16, ptr %ptr697 %val3 = load i16, ptr %ptr3698 %valC = load i16, ptr %ptrC699 %valE = load i16, ptr %ptrE700 %valF = load i16, ptr %ptrF701 %res0 = insertelement <16 x i16> undef, i16 %val0, i16 0702 %res3 = insertelement <16 x i16> %res0, i16 %val3, i16 3703 %res4 = insertelement <16 x i16> %res3, i16 0, i16 4704 %res5 = insertelement <16 x i16> %res4, i16 0, i16 5705 %resC = insertelement <16 x i16> %res5, i16 %valC, i16 12706 %resD = insertelement <16 x i16> %resC, i16 0, i16 13707 %resE = insertelement <16 x i16> %resD, i16 %valE, i16 14708 %resF = insertelement <16 x i16> %resE, i16 %valF, i16 15709 ret <16 x i16> %resF710}711 712define <16 x i16> @merge_16i16_i16_FEDCBA9876543210(ptr %ptr) nounwind uwtable noinline ssp {713; AVX1-LABEL: merge_16i16_i16_FEDCBA9876543210:714; AVX1: # %bb.0:715; AVX1-NEXT: vmovdqu (%rdi), %xmm0716; AVX1-NEXT: vmovdqu 16(%rdi), %xmm1717; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [14,15,12,13,10,11,8,9,6,7,4,5,2,3,0,1]718; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm0719; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1720; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0721; AVX1-NEXT: retq722;723; AVX2-LABEL: merge_16i16_i16_FEDCBA9876543210:724; AVX2: # %bb.0:725; AVX2-NEXT: vmovdqu (%rdi), %ymm0726; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[14,15,12,13,10,11,8,9,6,7,4,5,2,3,0,1,30,31,28,29,26,27,24,25,22,23,20,21,18,19,16,17]727; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[2,3,0,1]728; AVX2-NEXT: retq729;730; AVX512F-LABEL: merge_16i16_i16_FEDCBA9876543210:731; AVX512F: # %bb.0:732; AVX512F-NEXT: vmovdqu (%rdi), %ymm0733; AVX512F-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[14,15,12,13,10,11,8,9,6,7,4,5,2,3,0,1,30,31,28,29,26,27,24,25,22,23,20,21,18,19,16,17]734; AVX512F-NEXT: vpermq {{.*#+}} ymm0 = ymm0[2,3,0,1]735; AVX512F-NEXT: retq736;737; X86-AVX-LABEL: merge_16i16_i16_FEDCBA9876543210:738; X86-AVX: # %bb.0:739; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax740; X86-AVX-NEXT: vmovdqu (%eax), %xmm0741; X86-AVX-NEXT: vmovdqu 16(%eax), %xmm1742; X86-AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [14,15,12,13,10,11,8,9,6,7,4,5,2,3,0,1]743; X86-AVX-NEXT: vpshufb %xmm2, %xmm0, %xmm0744; X86-AVX-NEXT: vpshufb %xmm2, %xmm1, %xmm1745; X86-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0746; X86-AVX-NEXT: retl747 %ptr0 = getelementptr inbounds i16, ptr %ptr, i64 15748 %ptr1 = getelementptr inbounds i16, ptr %ptr, i64 14749 %ptr2 = getelementptr inbounds i16, ptr %ptr, i64 13750 %ptr3 = getelementptr inbounds i16, ptr %ptr, i64 12751 %ptr4 = getelementptr inbounds i16, ptr %ptr, i64 11752 %ptr5 = getelementptr inbounds i16, ptr %ptr, i64 10753 %ptr6 = getelementptr inbounds i16, ptr %ptr, i64 9754 %ptr7 = getelementptr inbounds i16, ptr %ptr, i64 8755 %ptr8 = getelementptr inbounds i16, ptr %ptr, i64 7756 %ptr9 = getelementptr inbounds i16, ptr %ptr, i64 6757 %ptrA = getelementptr inbounds i16, ptr %ptr, i64 5758 %ptrB = getelementptr inbounds i16, ptr %ptr, i64 4759 %ptrC = getelementptr inbounds i16, ptr %ptr, i64 3760 %ptrD = getelementptr inbounds i16, ptr %ptr, i64 2761 %ptrE = getelementptr inbounds i16, ptr %ptr, i64 1762 %ptrF = getelementptr inbounds i16, ptr %ptr, i64 0763 %val0 = load i16, ptr %ptr0764 %val1 = load i16, ptr %ptr1765 %val2 = load i16, ptr %ptr2766 %val3 = load i16, ptr %ptr3767 %val4 = load i16, ptr %ptr4768 %val5 = load i16, ptr %ptr5769 %val6 = load i16, ptr %ptr6770 %val7 = load i16, ptr %ptr7771 %val8 = load i16, ptr %ptr8772 %val9 = load i16, ptr %ptr9773 %valA = load i16, ptr %ptrA774 %valB = load i16, ptr %ptrB775 %valC = load i16, ptr %ptrC776 %valD = load i16, ptr %ptrD777 %valE = load i16, ptr %ptrE778 %valF = load i16, ptr %ptrF779 %res0 = insertelement <16 x i16> poison, i16 %val0, i64 0780 %res1 = insertelement <16 x i16> %res0, i16 %val1, i64 1781 %res2 = insertelement <16 x i16> %res1, i16 %val2, i64 2782 %res3 = insertelement <16 x i16> %res2, i16 %val3, i64 3783 %res4 = insertelement <16 x i16> %res3, i16 %val4, i64 4784 %res5 = insertelement <16 x i16> %res4, i16 %val5, i64 5785 %res6 = insertelement <16 x i16> %res5, i16 %val6, i64 6786 %res7 = insertelement <16 x i16> %res6, i16 %val7, i64 7787 %res8 = insertelement <16 x i16> %res7, i16 %val8, i64 8788 %res9 = insertelement <16 x i16> %res8, i16 %val9, i64 9789 %resA = insertelement <16 x i16> %res9, i16 %valA, i64 10790 %resB = insertelement <16 x i16> %resA, i16 %valB, i64 11791 %resC = insertelement <16 x i16> %resB, i16 %valC, i64 12792 %resD = insertelement <16 x i16> %resC, i16 %valD, i64 13793 %resE = insertelement <16 x i16> %resD, i16 %valE, i64 14794 %resF = insertelement <16 x i16> %resE, i16 %valF, i64 15795 ret <16 x i16> %resF796}797 798define <32 x i8> @merge_32i8_i8_45u7uuuuuuuuuuuuuuuuuuuuuuuuuuuu(ptr %ptr) nounwind uwtable noinline ssp {799; AVX-LABEL: merge_32i8_i8_45u7uuuuuuuuuuuuuuuuuuuuuuuuuuuu:800; AVX: # %bb.0:801; AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero802; AVX-NEXT: retq803;804; X86-AVX-LABEL: merge_32i8_i8_45u7uuuuuuuuuuuuuuuuuuuuuuuuuuuu:805; X86-AVX: # %bb.0:806; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax807; X86-AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero808; X86-AVX-NEXT: retl809 %ptr0 = getelementptr inbounds i8, ptr %ptr, i64 4810 %ptr1 = getelementptr inbounds i8, ptr %ptr, i64 5811 %ptr3 = getelementptr inbounds i8, ptr %ptr, i64 7812 %val0 = load i8, ptr %ptr0813 %val1 = load i8, ptr %ptr1814 %val3 = load i8, ptr %ptr3815 %res0 = insertelement <32 x i8> undef, i8 %val0, i8 0816 %res1 = insertelement <32 x i8> %res0, i8 %val1, i8 1817 %res3 = insertelement <32 x i8> %res1, i8 %val3, i8 3818 ret <32 x i8> %res3819}820 821define <32 x i8> @merge_32i8_i8_23u5uuuuuuuuuuzzzzuuuuuuuuuuuuuu(ptr %ptr) nounwind uwtable noinline ssp {822; AVX-LABEL: merge_32i8_i8_23u5uuuuuuuuuuzzzzuuuuuuuuuuuuuu:823; AVX: # %bb.0:824; AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero825; AVX-NEXT: retq826;827; X86-AVX-LABEL: merge_32i8_i8_23u5uuuuuuuuuuzzzzuuuuuuuuuuuuuu:828; X86-AVX: # %bb.0:829; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax830; X86-AVX-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero831; X86-AVX-NEXT: retl832 %ptr0 = getelementptr inbounds i8, ptr %ptr, i64 2833 %ptr1 = getelementptr inbounds i8, ptr %ptr, i64 3834 %ptr3 = getelementptr inbounds i8, ptr %ptr, i64 5835 %val0 = load i8, ptr %ptr0836 %val1 = load i8, ptr %ptr1837 %val3 = load i8, ptr %ptr3838 %res0 = insertelement <32 x i8> undef, i8 %val0, i8 0839 %res1 = insertelement <32 x i8> %res0, i8 %val1, i8 1840 %res3 = insertelement <32 x i8> %res1, i8 %val3, i8 3841 %resE = insertelement <32 x i8> %res3, i8 0, i8 14842 %resF = insertelement <32 x i8> %resE, i8 0, i8 15843 %resG = insertelement <32 x i8> %resF, i8 0, i8 16844 %resH = insertelement <32 x i8> %resG, i8 0, i8 17845 ret <32 x i8> %resH846}847 848;849; consecutive loads including any/all volatiles may not be combined850;851 852define <4 x double> @merge_4f64_f64_34uz_volatile(ptr %ptr) nounwind uwtable noinline ssp {853; AVX-LABEL: merge_4f64_f64_34uz_volatile:854; AVX: # %bb.0:855; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero856; AVX-NEXT: vmovhps {{.*#+}} xmm0 = xmm0[0,1],mem[0,1]857; AVX-NEXT: retq858;859; X86-AVX-LABEL: merge_4f64_f64_34uz_volatile:860; X86-AVX: # %bb.0:861; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax862; X86-AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero863; X86-AVX-NEXT: vmovhps {{.*#+}} xmm0 = xmm0[0,1],mem[0,1]864; X86-AVX-NEXT: retl865 %ptr0 = getelementptr inbounds double, ptr %ptr, i64 3866 %ptr1 = getelementptr inbounds double, ptr %ptr, i64 4867 %val0 = load volatile double, ptr %ptr0868 %val1 = load volatile double, ptr %ptr1869 %res0 = insertelement <4 x double> undef, double %val0, i32 0870 %res1 = insertelement <4 x double> %res0, double %val1, i32 1871 %res3 = insertelement <4 x double> %res1, double 0.0, i32 3872 ret <4 x double> %res3873}874 875define <16 x i16> @merge_16i16_i16_0uu3zzuuuuuzCuEF_volatile(ptr %ptr) nounwind uwtable noinline ssp {876; AVX1-LABEL: merge_16i16_i16_0uu3zzuuuuuzCuEF_volatile:877; AVX1: # %bb.0:878; AVX1-NEXT: movzwl (%rdi), %eax879; AVX1-NEXT: vpxor %xmm0, %xmm0, %xmm0880; AVX1-NEXT: vpinsrw $4, 24(%rdi), %xmm0, %xmm0881; AVX1-NEXT: vpinsrw $6, 28(%rdi), %xmm0, %xmm0882; AVX1-NEXT: vpinsrw $7, 30(%rdi), %xmm0, %xmm0883; AVX1-NEXT: vmovd %eax, %xmm1884; AVX1-NEXT: vpinsrw $3, 6(%rdi), %xmm1, %xmm1885; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0886; AVX1-NEXT: retq887;888; AVX2-LABEL: merge_16i16_i16_0uu3zzuuuuuzCuEF_volatile:889; AVX2: # %bb.0:890; AVX2-NEXT: movzwl (%rdi), %eax891; AVX2-NEXT: vpxor %xmm0, %xmm0, %xmm0892; AVX2-NEXT: vpinsrw $4, 24(%rdi), %xmm0, %xmm0893; AVX2-NEXT: vpinsrw $6, 28(%rdi), %xmm0, %xmm0894; AVX2-NEXT: vpinsrw $7, 30(%rdi), %xmm0, %xmm0895; AVX2-NEXT: vmovd %eax, %xmm1896; AVX2-NEXT: vpinsrw $3, 6(%rdi), %xmm1, %xmm1897; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0898; AVX2-NEXT: retq899;900; AVX512F-LABEL: merge_16i16_i16_0uu3zzuuuuuzCuEF_volatile:901; AVX512F: # %bb.0:902; AVX512F-NEXT: movzwl (%rdi), %eax903; AVX512F-NEXT: vpxor %xmm0, %xmm0, %xmm0904; AVX512F-NEXT: vpinsrw $4, 24(%rdi), %xmm0, %xmm0905; AVX512F-NEXT: vpinsrw $6, 28(%rdi), %xmm0, %xmm0906; AVX512F-NEXT: vpinsrw $7, 30(%rdi), %xmm0, %xmm0907; AVX512F-NEXT: vmovd %eax, %xmm1908; AVX512F-NEXT: vpinsrw $3, 6(%rdi), %xmm1, %xmm1909; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0910; AVX512F-NEXT: retq911;912; X86-AVX-LABEL: merge_16i16_i16_0uu3zzuuuuuzCuEF_volatile:913; X86-AVX: # %bb.0:914; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax915; X86-AVX-NEXT: movzwl (%eax), %ecx916; X86-AVX-NEXT: vpxor %xmm0, %xmm0, %xmm0917; X86-AVX-NEXT: vpinsrw $4, 24(%eax), %xmm0, %xmm0918; X86-AVX-NEXT: vpinsrw $6, 28(%eax), %xmm0, %xmm0919; X86-AVX-NEXT: vpinsrw $7, 30(%eax), %xmm0, %xmm0920; X86-AVX-NEXT: vmovd %ecx, %xmm1921; X86-AVX-NEXT: vpinsrw $3, 6(%eax), %xmm1, %xmm1922; X86-AVX-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0923; X86-AVX-NEXT: retl924 %ptr3 = getelementptr inbounds i16, ptr %ptr, i64 3925 %ptrC = getelementptr inbounds i16, ptr %ptr, i64 12926 %ptrE = getelementptr inbounds i16, ptr %ptr, i64 14927 %ptrF = getelementptr inbounds i16, ptr %ptr, i64 15928 %val0 = load volatile i16, ptr %ptr929 %val3 = load i16, ptr %ptr3930 %valC = load i16, ptr %ptrC931 %valE = load i16, ptr %ptrE932 %valF = load volatile i16, ptr %ptrF933 %res0 = insertelement <16 x i16> undef, i16 %val0, i16 0934 %res3 = insertelement <16 x i16> %res0, i16 %val3, i16 3935 %res4 = insertelement <16 x i16> %res3, i16 0, i16 4936 %res5 = insertelement <16 x i16> %res4, i16 0, i16 5937 %resC = insertelement <16 x i16> %res5, i16 %valC, i16 12938 %resD = insertelement <16 x i16> %resC, i16 0, i16 13939 %resE = insertelement <16 x i16> %resD, i16 %valE, i16 14940 %resF = insertelement <16 x i16> %resE, i16 %valF, i16 15941 ret <16 x i16> %resF942}943 944;945; Volatile tests.946;947 948@l = external dso_local global <32 x i8>, align 32949 950define <2 x i8> @PR42846(ptr %j, <2 x i8> %k) {951; AVX-LABEL: PR42846:952; AVX: # %bb.0:953; AVX-NEXT: vmovdqa l(%rip), %ymm0954; AVX-NEXT: vpextrw $0, %xmm0, (%rdi)955; AVX-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0956; AVX-NEXT: vzeroupper957; AVX-NEXT: retq958;959; X86-AVX-LABEL: PR42846:960; X86-AVX: # %bb.0:961; X86-AVX-NEXT: movl {{[0-9]+}}(%esp), %eax962; X86-AVX-NEXT: vmovdqa l, %ymm0963; X86-AVX-NEXT: vpextrw $0, %xmm0, (%eax)964; X86-AVX-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0965; X86-AVX-NEXT: vzeroupper966; X86-AVX-NEXT: retl967 %t0 = load volatile <32 x i8>, ptr @l, align 32968 %shuffle = shufflevector <32 x i8> %t0, <32 x i8> undef, <2 x i32> <i32 0, i32 1>969 store <2 x i8> %shuffle, ptr %j, align 2970 ret <2 x i8> %shuffle971}972