brintos

brintos / llvm-project-archived public Read only

0
0
Text · 38.7 KiB · 6ad306d Raw
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