brintos

brintos / llvm-project-archived public Read only

0
0
Text · 38.0 KiB · f9a0bd7 Raw
875 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx512f | FileCheck %s --check-prefix=ALL3; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefix=ALL4;5; Just one 32-bit run to make sure we do reasonable things.6; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=X86-AVX512F7 8define <8 x double> @merge_8f64_2f64_12u4(ptr %ptr) nounwind uwtable noinline ssp {9; ALL-LABEL: merge_8f64_2f64_12u4:10; ALL:       # %bb.0:11; ALL-NEXT:    vmovups 16(%rdi), %zmm012; ALL-NEXT:    retq13;14; X86-AVX512F-LABEL: merge_8f64_2f64_12u4:15; X86-AVX512F:       # %bb.0:16; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax17; X86-AVX512F-NEXT:    vmovups 16(%eax), %zmm018; X86-AVX512F-NEXT:    retl19  %ptr0 = getelementptr inbounds <2 x double>, ptr %ptr, i64 120  %ptr1 = getelementptr inbounds <2 x double>, ptr %ptr, i64 221  %ptr3 = getelementptr inbounds <2 x double>, ptr %ptr, i64 422  %val0 = load <2 x double>, ptr %ptr023  %val1 = load <2 x double>, ptr %ptr124  %val3 = load <2 x double>, ptr %ptr325  %res01 = shufflevector <2 x double> %val0, <2 x double> %val1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>26  %res23 = shufflevector <2 x double> undef, <2 x double> %val3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>27  %res = shufflevector <4 x double> %res01, <4 x double> %res23, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>28  ret <8 x double> %res29}30 31define <8 x double> @merge_8f64_2f64_23z5(ptr %ptr) nounwind uwtable noinline ssp {32; ALL-LABEL: merge_8f64_2f64_23z5:33; ALL:       # %bb.0:34; ALL-NEXT:    vmovdqu64 32(%rdi), %zmm035; ALL-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm036; ALL-NEXT:    retq37;38; X86-AVX512F-LABEL: merge_8f64_2f64_23z5:39; X86-AVX512F:       # %bb.0:40; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax41; X86-AVX512F-NEXT:    vmovdqu64 32(%eax), %zmm042; X86-AVX512F-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}, %zmm0, %zmm043; X86-AVX512F-NEXT:    retl44  %ptr0 = getelementptr inbounds <2 x double>, ptr %ptr, i64 245  %ptr1 = getelementptr inbounds <2 x double>, ptr %ptr, i64 346  %ptr3 = getelementptr inbounds <2 x double>, ptr %ptr, i64 547  %val0 = load <2 x double>, ptr %ptr048  %val1 = load <2 x double>, ptr %ptr149  %val3 = load <2 x double>, ptr %ptr350  %res01 = shufflevector <2 x double> %val0, <2 x double> %val1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>51  %res23 = shufflevector <2 x double> zeroinitializer, <2 x double> %val3, <4 x i32> <i32 0, i32 1, i32 2, i32 3>52  %res = shufflevector <4 x double> %res01, <4 x double> %res23, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>53  ret <8 x double> %res54}55 56define <8 x double> @merge_8f64_4f64_z2(ptr %ptr) nounwind uwtable noinline ssp {57; ALL-LABEL: merge_8f64_4f64_z2:58; ALL:       # %bb.0:59; ALL-NEXT:    vxorps %xmm0, %xmm0, %xmm060; ALL-NEXT:    vinsertf64x4 $1, 64(%rdi), %zmm0, %zmm061; ALL-NEXT:    retq62;63; X86-AVX512F-LABEL: merge_8f64_4f64_z2:64; X86-AVX512F:       # %bb.0:65; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax66; X86-AVX512F-NEXT:    vxorps %xmm0, %xmm0, %xmm067; X86-AVX512F-NEXT:    vinsertf64x4 $1, 64(%eax), %zmm0, %zmm068; X86-AVX512F-NEXT:    retl69  %ptr1 = getelementptr inbounds <4 x double>, ptr %ptr, i64 270  %val1 = load <4 x double>, ptr %ptr171  %res = shufflevector <4 x double> zeroinitializer, <4 x double> %val1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>72  ret <8 x double> %res73}74 75define <8 x double> @merge_8f64_f64_23uuuuu9(ptr %ptr) nounwind uwtable noinline ssp {76; ALL-LABEL: merge_8f64_f64_23uuuuu9:77; ALL:       # %bb.0:78; ALL-NEXT:    vmovups 16(%rdi), %zmm079; ALL-NEXT:    retq80;81; X86-AVX512F-LABEL: merge_8f64_f64_23uuuuu9:82; X86-AVX512F:       # %bb.0:83; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax84; X86-AVX512F-NEXT:    vmovups 16(%eax), %zmm085; X86-AVX512F-NEXT:    retl86  %ptr0 = getelementptr inbounds double, ptr %ptr, i64 287  %ptr1 = getelementptr inbounds double, ptr %ptr, i64 388  %ptr7 = getelementptr inbounds double, ptr %ptr, i64 989  %val0 = load double, ptr %ptr090  %val1 = load double, ptr %ptr191  %val7 = load double, ptr %ptr792  %res0 = insertelement <8 x double> undef, double %val0, i32 093  %res1 = insertelement <8 x double> %res0, double %val1, i32 194  %res7 = insertelement <8 x double> %res1, double %val7, i32 795  ret <8 x double> %res796}97 98define <8 x double> @merge_8f64_f64_12zzuuzz(ptr %ptr) nounwind uwtable noinline ssp {99; ALL-LABEL: merge_8f64_f64_12zzuuzz:100; ALL:       # %bb.0:101; ALL-NEXT:    vmovups 8(%rdi), %xmm0102; ALL-NEXT:    retq103;104; X86-AVX512F-LABEL: merge_8f64_f64_12zzuuzz:105; X86-AVX512F:       # %bb.0:106; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax107; X86-AVX512F-NEXT:    vmovups 8(%eax), %xmm0108; X86-AVX512F-NEXT:    retl109  %ptr0 = getelementptr inbounds double, ptr %ptr, i64 1110  %ptr1 = getelementptr inbounds double, ptr %ptr, i64 2111  %val0 = load double, ptr %ptr0112  %val1 = load double, ptr %ptr1113  %res0 = insertelement <8 x double> undef, double %val0, i32 0114  %res1 = insertelement <8 x double> %res0, double %val1, i32 1115  %res2 = insertelement <8 x double> %res1, double   0.0, i32 2116  %res3 = insertelement <8 x double> %res2, double   0.0, i32 3117  %res6 = insertelement <8 x double> %res3, double   0.0, i32 6118  %res7 = insertelement <8 x double> %res6, double   0.0, i32 7119  ret <8 x double> %res7120}121 122define <8 x double> @merge_8f64_f64_1u3u5zu8(ptr %ptr) nounwind uwtable noinline ssp {123; ALL-LABEL: merge_8f64_f64_1u3u5zu8:124; ALL:       # %bb.0:125; ALL-NEXT:    vmovdqu64 8(%rdi), %zmm0126; ALL-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0127; ALL-NEXT:    retq128;129; X86-AVX512F-LABEL: merge_8f64_f64_1u3u5zu8:130; X86-AVX512F:       # %bb.0:131; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax132; X86-AVX512F-NEXT:    vmovdqu64 8(%eax), %zmm0133; X86-AVX512F-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}, %zmm0, %zmm0134; X86-AVX512F-NEXT:    retl135  %ptr0 = getelementptr inbounds double, ptr %ptr, i64 1136  %ptr2 = getelementptr inbounds double, ptr %ptr, i64 3137  %ptr4 = getelementptr inbounds double, ptr %ptr, i64 5138  %ptr7 = getelementptr inbounds double, ptr %ptr, i64 8139  %val0 = load double, ptr %ptr0140  %val2 = load double, ptr %ptr2141  %val4 = load double, ptr %ptr4142  %val7 = load double, ptr %ptr7143  %res0 = insertelement <8 x double> undef, double %val0, i32 0144  %res2 = insertelement <8 x double> %res0, double %val2, i32 2145  %res4 = insertelement <8 x double> %res2, double %val4, i32 4146  %res5 = insertelement <8 x double> %res4, double   0.0, i32 5147  %res7 = insertelement <8 x double> %res5, double %val7, i32 7148  ret <8 x double> %res7149}150 151define <8 x double> @merge_8f64_f64_76543210(ptr %ptr) nounwind uwtable noinline ssp {152; ALL-LABEL: merge_8f64_f64_76543210:153; ALL:       # %bb.0:154; ALL-NEXT:    vpmovsxbq {{.*#+}} zmm0 = [7,6,5,4,3,2,1,0]155; ALL-NEXT:    vpermpd (%rdi), %zmm0, %zmm0156; ALL-NEXT:    retq157;158; X86-AVX512F-LABEL: merge_8f64_f64_76543210:159; X86-AVX512F:       # %bb.0:160; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax161; X86-AVX512F-NEXT:    vpmovsxbq {{.*#+}} zmm0 = [7,6,5,4,3,2,1,0]162; X86-AVX512F-NEXT:    vpermpd (%eax), %zmm0, %zmm0163; X86-AVX512F-NEXT:    retl164  %ptr0 = getelementptr inbounds double, ptr %ptr, i64 7165  %ptr1 = getelementptr inbounds double, ptr %ptr, i64 6166  %ptr2 = getelementptr inbounds double, ptr %ptr, i64 5167  %ptr3 = getelementptr inbounds double, ptr %ptr, i64 4168  %ptr4 = getelementptr inbounds double, ptr %ptr, i64 3169  %ptr5 = getelementptr inbounds double, ptr %ptr, i64 2170  %ptr6 = getelementptr inbounds double, ptr %ptr, i64 1171  %ptr7 = getelementptr inbounds double, ptr %ptr, i64 0172  %val0 = load double, ptr %ptr0173  %val1 = load double, ptr %ptr1174  %val2 = load double, ptr %ptr2175  %val3 = load double, ptr %ptr3176  %val4 = load double, ptr %ptr4177  %val5 = load double, ptr %ptr5178  %val6 = load double, ptr %ptr6179  %val7 = load double, ptr %ptr7180  %res0 = insertelement <8 x double> poison, double %val0, i64 0181  %res1 = insertelement <8 x double> %res0, double %val1, i64 1182  %res2 = insertelement <8 x double> %res1, double %val2, i64 2183  %res3 = insertelement <8 x double> %res2, double %val3, i64 3184  %res4 = insertelement <8 x double> %res3, double %val4, i64 4185  %res5 = insertelement <8 x double> %res4, double %val5, i64 5186  %res6 = insertelement <8 x double> %res5, double %val6, i64 6187  %res7 = insertelement <8 x double> %res6, double %val7, i64 7188  ret <8 x double> %res7189}190 191define <8 x i64> @merge_8i64_4i64_z3(ptr %ptr) nounwind uwtable noinline ssp {192; ALL-LABEL: merge_8i64_4i64_z3:193; ALL:       # %bb.0:194; ALL-NEXT:    vxorps %xmm0, %xmm0, %xmm0195; ALL-NEXT:    vinsertf64x4 $1, 96(%rdi), %zmm0, %zmm0196; ALL-NEXT:    retq197;198; X86-AVX512F-LABEL: merge_8i64_4i64_z3:199; X86-AVX512F:       # %bb.0:200; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax201; X86-AVX512F-NEXT:    vxorps %xmm0, %xmm0, %xmm0202; X86-AVX512F-NEXT:    vinsertf64x4 $1, 96(%eax), %zmm0, %zmm0203; X86-AVX512F-NEXT:    retl204  %ptr1 = getelementptr inbounds <4 x i64>, ptr %ptr, i64 3205  %val1 = load <4 x i64>, ptr %ptr1206  %res = shufflevector <4 x i64> zeroinitializer, <4 x i64> %val1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>207  ret <8 x i64> %res208}209 210define <8 x i64> @merge_8i64_i64_56zz9uzz(ptr %ptr) nounwind uwtable noinline ssp {211; ALL-LABEL: merge_8i64_i64_56zz9uzz:212; ALL:       # %bb.0:213; ALL-NEXT:    vmovups 40(%rdi), %xmm0214; ALL-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero215; ALL-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0216; ALL-NEXT:    retq217;218; X86-AVX512F-LABEL: merge_8i64_i64_56zz9uzz:219; X86-AVX512F:       # %bb.0:220; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax221; X86-AVX512F-NEXT:    vmovups 40(%eax), %xmm0222; X86-AVX512F-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero223; X86-AVX512F-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0224; X86-AVX512F-NEXT:    retl225  %ptr0 = getelementptr inbounds i64, ptr %ptr, i64 5226  %ptr1 = getelementptr inbounds i64, ptr %ptr, i64 6227  %ptr4 = getelementptr inbounds i64, ptr %ptr, i64 9228  %val0 = load i64, ptr %ptr0229  %val1 = load i64, ptr %ptr1230  %val4 = load i64, ptr %ptr4231  %res0 = insertelement <8 x i64> undef, i64 %val0, i32 0232  %res1 = insertelement <8 x i64> %res0, i64 %val1, i32 1233  %res2 = insertelement <8 x i64> %res1, i64     0, i32 2234  %res3 = insertelement <8 x i64> %res2, i64     0, i32 3235  %res4 = insertelement <8 x i64> %res3, i64 %val4, i32 4236  %res6 = insertelement <8 x i64> %res4, i64     0, i32 6237  %res7 = insertelement <8 x i64> %res6, i64     0, i32 7238  ret <8 x i64> %res7239}240 241define <8 x i64> @merge_8i64_i64_1u3u5zu8(ptr %ptr) nounwind uwtable noinline ssp {242; ALL-LABEL: merge_8i64_i64_1u3u5zu8:243; ALL:       # %bb.0:244; ALL-NEXT:    vmovdqu64 8(%rdi), %zmm0245; ALL-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0246; ALL-NEXT:    retq247;248; X86-AVX512F-LABEL: merge_8i64_i64_1u3u5zu8:249; X86-AVX512F:       # %bb.0:250; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax251; X86-AVX512F-NEXT:    vmovdqu64 8(%eax), %zmm0252; X86-AVX512F-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}, %zmm0, %zmm0253; X86-AVX512F-NEXT:    retl254  %ptr0 = getelementptr inbounds i64, ptr %ptr, i64 1255  %ptr2 = getelementptr inbounds i64, ptr %ptr, i64 3256  %ptr4 = getelementptr inbounds i64, ptr %ptr, i64 5257  %ptr7 = getelementptr inbounds i64, ptr %ptr, i64 8258  %val0 = load i64, ptr %ptr0259  %val2 = load i64, ptr %ptr2260  %val4 = load i64, ptr %ptr4261  %val7 = load i64, ptr %ptr7262  %res0 = insertelement <8 x i64> undef, i64 %val0, i32 0263  %res2 = insertelement <8 x i64> %res0, i64 %val2, i32 2264  %res4 = insertelement <8 x i64> %res2, i64 %val4, i32 4265  %res5 = insertelement <8 x i64> %res4, i64     0, i32 5266  %res7 = insertelement <8 x i64> %res5, i64 %val7, i32 7267  ret <8 x i64> %res7268}269 270define <8 x i64> @merge_8i64_i64_76543210(ptr %ptr) nounwind uwtable noinline ssp {271; ALL-LABEL: merge_8i64_i64_76543210:272; ALL:       # %bb.0:273; ALL-NEXT:    vpmovsxbq {{.*#+}} zmm0 = [7,6,5,4,3,2,1,0]274; ALL-NEXT:    vpermpd (%rdi), %zmm0, %zmm0275; ALL-NEXT:    retq276;277; X86-AVX512F-LABEL: merge_8i64_i64_76543210:278; X86-AVX512F:       # %bb.0:279; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax280; X86-AVX512F-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero281; X86-AVX512F-NEXT:    vpinsrd $1, 12(%eax), %xmm0, %xmm0282; X86-AVX512F-NEXT:    vpinsrd $2, (%eax), %xmm0, %xmm0283; X86-AVX512F-NEXT:    vpinsrd $3, 4(%eax), %xmm0, %xmm0284; X86-AVX512F-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero285; X86-AVX512F-NEXT:    vpinsrd $1, 28(%eax), %xmm1, %xmm1286; X86-AVX512F-NEXT:    vpinsrd $2, 16(%eax), %xmm1, %xmm1287; X86-AVX512F-NEXT:    vpinsrd $3, 20(%eax), %xmm1, %xmm1288; X86-AVX512F-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0289; X86-AVX512F-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero290; X86-AVX512F-NEXT:    vpinsrd $1, 44(%eax), %xmm1, %xmm1291; X86-AVX512F-NEXT:    vpinsrd $2, 32(%eax), %xmm1, %xmm1292; X86-AVX512F-NEXT:    vpinsrd $3, 36(%eax), %xmm1, %xmm1293; X86-AVX512F-NEXT:    vmovd {{.*#+}} xmm2 = mem[0],zero,zero,zero294; X86-AVX512F-NEXT:    vpinsrd $1, 60(%eax), %xmm2, %xmm2295; X86-AVX512F-NEXT:    vpinsrd $2, 48(%eax), %xmm2, %xmm2296; X86-AVX512F-NEXT:    vpinsrd $3, 52(%eax), %xmm2, %xmm2297; X86-AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm2, %ymm1298; X86-AVX512F-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0299; X86-AVX512F-NEXT:    retl300  %ptr0 = getelementptr inbounds i64, ptr %ptr, i64 7301  %ptr1 = getelementptr inbounds i64, ptr %ptr, i64 6302  %ptr2 = getelementptr inbounds i64, ptr %ptr, i64 5303  %ptr3 = getelementptr inbounds i64, ptr %ptr, i64 4304  %ptr4 = getelementptr inbounds i64, ptr %ptr, i64 3305  %ptr5 = getelementptr inbounds i64, ptr %ptr, i64 2306  %ptr6 = getelementptr inbounds i64, ptr %ptr, i64 1307  %ptr7 = getelementptr inbounds i64, ptr %ptr, i64 0308  %val0 = load i64, ptr %ptr0309  %val1 = load i64, ptr %ptr1310  %val2 = load i64, ptr %ptr2311  %val3 = load i64, ptr %ptr3312  %val4 = load i64, ptr %ptr4313  %val5 = load i64, ptr %ptr5314  %val6 = load i64, ptr %ptr6315  %val7 = load i64, ptr %ptr7316  %res0 = insertelement <8 x i64> poison, i64 %val0, i64 0317  %res1 = insertelement <8 x i64> %res0, i64 %val1, i64 1318  %res2 = insertelement <8 x i64> %res1, i64 %val2, i64 2319  %res3 = insertelement <8 x i64> %res2, i64 %val3, i64 3320  %res4 = insertelement <8 x i64> %res3, i64 %val4, i64 4321  %res5 = insertelement <8 x i64> %res4, i64 %val5, i64 5322  %res6 = insertelement <8 x i64> %res5, i64 %val6, i64 6323  %res7 = insertelement <8 x i64> %res6, i64 %val7, i64 7324  ret <8 x i64> %res7325}326 327define <16 x float> @merge_16f32_f32_89zzzuuuuuuuuuuuz(ptr %ptr) nounwind uwtable noinline ssp {328; ALL-LABEL: merge_16f32_f32_89zzzuuuuuuuuuuuz:329; ALL:       # %bb.0:330; ALL-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero331; ALL-NEXT:    retq332;333; X86-AVX512F-LABEL: merge_16f32_f32_89zzzuuuuuuuuuuuz:334; X86-AVX512F:       # %bb.0:335; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax336; X86-AVX512F-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero337; X86-AVX512F-NEXT:    retl338  %ptr0 = getelementptr inbounds float, ptr %ptr, i64 8339  %ptr1 = getelementptr inbounds float, ptr %ptr, i64 9340  %val0 = load float, ptr %ptr0341  %val1 = load float, ptr %ptr1342  %res0 = insertelement <16 x float> undef, float %val0, i32 0343  %res1 = insertelement <16 x float> %res0, float %val1, i32 1344  %res2 = insertelement <16 x float> %res1, float   0.0, i32 2345  %res3 = insertelement <16 x float> %res2, float   0.0, i32 3346  %res4 = insertelement <16 x float> %res3, float   0.0, i32 4347  %resF = insertelement <16 x float> %res4, float   0.0, i32 15348  ret <16 x float> %resF349}350 351define <16 x float> @merge_16f32_f32_45u7uuuuuuuuuuuu(ptr %ptr) nounwind uwtable noinline ssp {352; ALL-LABEL: merge_16f32_f32_45u7uuuuuuuuuuuu:353; ALL:       # %bb.0:354; ALL-NEXT:    vmovups 16(%rdi), %xmm0355; ALL-NEXT:    retq356;357; X86-AVX512F-LABEL: merge_16f32_f32_45u7uuuuuuuuuuuu:358; X86-AVX512F:       # %bb.0:359; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax360; X86-AVX512F-NEXT:    vmovups 16(%eax), %xmm0361; X86-AVX512F-NEXT:    retl362  %ptr0 = getelementptr inbounds float, ptr %ptr, i64 4363  %ptr1 = getelementptr inbounds float, ptr %ptr, i64 5364  %ptr3 = getelementptr inbounds float, ptr %ptr, i64 7365  %val0 = load float, ptr %ptr0366  %val1 = load float, ptr %ptr1367  %val3 = load float, ptr %ptr3368  %res0 = insertelement <16 x float> undef, float %val0, i32 0369  %res1 = insertelement <16 x float> %res0, float %val1, i32 1370  %res3 = insertelement <16 x float> %res1, float %val3, i32 3371  ret <16 x float> %res3372}373 374define <16 x float> @merge_16f32_f32_0uu3uuuuuuuuCuEF(ptr %ptr) nounwind uwtable noinline ssp {375; ALL-LABEL: merge_16f32_f32_0uu3uuuuuuuuCuEF:376; ALL:       # %bb.0:377; ALL-NEXT:    vmovups (%rdi), %zmm0378; ALL-NEXT:    retq379;380; X86-AVX512F-LABEL: merge_16f32_f32_0uu3uuuuuuuuCuEF:381; X86-AVX512F:       # %bb.0:382; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax383; X86-AVX512F-NEXT:    vmovups (%eax), %zmm0384; X86-AVX512F-NEXT:    retl385  %ptr3 = getelementptr inbounds float, ptr %ptr, i64 3386  %ptrC = getelementptr inbounds float, ptr %ptr, i64 12387  %ptrE = getelementptr inbounds float, ptr %ptr, i64 14388  %ptrF = getelementptr inbounds float, ptr %ptr, i64 15389  %val0 = load float, ptr %ptr390  %val3 = load float, ptr %ptr3391  %valC = load float, ptr %ptrC392  %valE = load float, ptr %ptrE393  %valF = load float, ptr %ptrF394  %res0 = insertelement <16 x float> undef, float %val0, i32 0395  %res3 = insertelement <16 x float> %res0, float %val3, i32 3396  %resC = insertelement <16 x float> %res3, float %valC, i32 12397  %resE = insertelement <16 x float> %resC, float %valE, i32 14398  %resF = insertelement <16 x float> %resE, float %valF, i32 15399  ret <16 x float> %resF400}401 402define <16 x float> @merge_16f32_f32_0uu3zzuuuuuzCuEF(ptr %ptr) nounwind uwtable noinline ssp {403; ALL-LABEL: merge_16f32_f32_0uu3zzuuuuuzCuEF:404; ALL:       # %bb.0:405; ALL-NEXT:    vmovdqu64 (%rdi), %zmm0406; ALL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0407; ALL-NEXT:    retq408;409; X86-AVX512F-LABEL: merge_16f32_f32_0uu3zzuuuuuzCuEF:410; X86-AVX512F:       # %bb.0:411; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax412; X86-AVX512F-NEXT:    vmovdqu64 (%eax), %zmm0413; X86-AVX512F-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}, %zmm0, %zmm0414; X86-AVX512F-NEXT:    retl415  %ptr3 = getelementptr inbounds float, ptr %ptr, i64 3416  %ptrC = getelementptr inbounds float, ptr %ptr, i64 12417  %ptrE = getelementptr inbounds float, ptr %ptr, i64 14418  %ptrF = getelementptr inbounds float, ptr %ptr, i64 15419  %val0 = load float, ptr %ptr420  %val3 = load float, ptr %ptr3421  %valC = load float, ptr %ptrC422  %valE = load float, ptr %ptrE423  %valF = load float, ptr %ptrF424  %res0 = insertelement <16 x float> undef, float %val0, i32 0425  %res3 = insertelement <16 x float> %res0, float %val3, i32 3426  %res4 = insertelement <16 x float> %res3, float   0.0, i32 4427  %res5 = insertelement <16 x float> %res4, float   0.0, i32 5428  %resC = insertelement <16 x float> %res5, float %valC, i32 12429  %resD = insertelement <16 x float> %resC, float   0.0, i32 13430  %resE = insertelement <16 x float> %resD, float %valE, i32 14431  %resF = insertelement <16 x float> %resE, float %valF, i32 15432  ret <16 x float> %resF433}434 435define <16 x float> @merge_16f32_f32_FEDCBA9876543210(ptr %ptr) nounwind uwtable noinline ssp {436; ALL-LABEL: merge_16f32_f32_FEDCBA9876543210:437; ALL:       # %bb.0:438; ALL-NEXT:    vpermilps {{.*#+}} zmm0 = mem[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]439; ALL-NEXT:    vshuff64x2 {{.*#+}} zmm0 = zmm0[6,7,4,5,2,3,0,1]440; ALL-NEXT:    retq441;442; X86-AVX512F-LABEL: merge_16f32_f32_FEDCBA9876543210:443; X86-AVX512F:       # %bb.0:444; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax445; X86-AVX512F-NEXT:    vpermilps {{.*#+}} zmm0 = mem[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]446; X86-AVX512F-NEXT:    vshuff64x2 {{.*#+}} zmm0 = zmm0[6,7,4,5,2,3,0,1]447; X86-AVX512F-NEXT:    retl448  %ptr0 = getelementptr inbounds float, ptr %ptr, i64 15449  %ptr1 = getelementptr inbounds float, ptr %ptr, i64 14450  %ptr2 = getelementptr inbounds float, ptr %ptr, i64 13451  %ptr3 = getelementptr inbounds float, ptr %ptr, i64 12452  %ptr4 = getelementptr inbounds float, ptr %ptr, i64 11453  %ptr5 = getelementptr inbounds float, ptr %ptr, i64 10454  %ptr6 = getelementptr inbounds float, ptr %ptr, i64 9455  %ptr7 = getelementptr inbounds float, ptr %ptr, i64 8456  %ptr8 = getelementptr inbounds float, ptr %ptr, i64 7457  %ptr9 = getelementptr inbounds float, ptr %ptr, i64 6458  %ptrA = getelementptr inbounds float, ptr %ptr, i64 5459  %ptrB = getelementptr inbounds float, ptr %ptr, i64 4460  %ptrC = getelementptr inbounds float, ptr %ptr, i64 3461  %ptrD = getelementptr inbounds float, ptr %ptr, i64 2462  %ptrE = getelementptr inbounds float, ptr %ptr, i64 1463  %ptrF = getelementptr inbounds float, ptr %ptr, i64 0464  %val0 = load float, ptr %ptr0465  %val1 = load float, ptr %ptr1466  %val2 = load float, ptr %ptr2467  %val3 = load float, ptr %ptr3468  %val4 = load float, ptr %ptr4469  %val5 = load float, ptr %ptr5470  %val6 = load float, ptr %ptr6471  %val7 = load float, ptr %ptr7472  %val8 = load float, ptr %ptr8473  %val9 = load float, ptr %ptr9474  %valA = load float, ptr %ptrA475  %valB = load float, ptr %ptrB476  %valC = load float, ptr %ptrC477  %valD = load float, ptr %ptrD478  %valE = load float, ptr %ptrE479  %valF = load float, ptr %ptrF480  %res0 = insertelement <16 x float> poison, float %val0, i64 0481  %res1 = insertelement <16 x float> %res0, float %val1, i64 1482  %res2 = insertelement <16 x float> %res1, float %val2, i64 2483  %res3 = insertelement <16 x float> %res2, float %val3, i64 3484  %res4 = insertelement <16 x float> %res3, float %val4, i64 4485  %res5 = insertelement <16 x float> %res4, float %val5, i64 5486  %res6 = insertelement <16 x float> %res5, float %val6, i64 6487  %res7 = insertelement <16 x float> %res6, float %val7, i64 7488  %res8 = insertelement <16 x float> %res7, float %val8, i64 8489  %res9 = insertelement <16 x float> %res8, float %val9, i64 9490  %resA = insertelement <16 x float> %res9, float %valA, i64 10491  %resB = insertelement <16 x float> %resA, float %valB, i64 11492  %resC = insertelement <16 x float> %resB, float %valC, i64 12493  %resD = insertelement <16 x float> %resC, float %valD, i64 13494  %resE = insertelement <16 x float> %resD, float %valE, i64 14495  %resF = insertelement <16 x float> %resE, float %valF, i64 15496  ret <16 x float> %resF497}498 499define <16 x i32> @merge_16i32_i32_12zzzuuuuuuuuuuuz(ptr %ptr) nounwind uwtable noinline ssp {500; ALL-LABEL: merge_16i32_i32_12zzzuuuuuuuuuuuz:501; ALL:       # %bb.0:502; ALL-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero503; ALL-NEXT:    retq504;505; X86-AVX512F-LABEL: merge_16i32_i32_12zzzuuuuuuuuuuuz:506; X86-AVX512F:       # %bb.0:507; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax508; X86-AVX512F-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero509; X86-AVX512F-NEXT:    retl510  %ptr0 = getelementptr inbounds i32, ptr %ptr, i64 1511  %ptr1 = getelementptr inbounds i32, ptr %ptr, i64 2512  %val0 = load i32, ptr %ptr0513  %val1 = load i32, ptr %ptr1514  %res0 = insertelement <16 x i32> undef, i32 %val0, i32 0515  %res1 = insertelement <16 x i32> %res0, i32 %val1, i32 1516  %res2 = insertelement <16 x i32> %res1, i32     0, i32 2517  %res3 = insertelement <16 x i32> %res2, i32     0, i32 3518  %res4 = insertelement <16 x i32> %res3, i32     0, i32 4519  %resF = insertelement <16 x i32> %res4, i32     0, i32 15520  ret <16 x i32> %resF521}522 523define <16 x i32> @merge_16i32_i32_23u5uuuuuuuuuuuu(ptr %ptr) nounwind uwtable noinline ssp {524; ALL-LABEL: merge_16i32_i32_23u5uuuuuuuuuuuu:525; ALL:       # %bb.0:526; ALL-NEXT:    vmovups 8(%rdi), %xmm0527; ALL-NEXT:    retq528;529; X86-AVX512F-LABEL: merge_16i32_i32_23u5uuuuuuuuuuuu:530; X86-AVX512F:       # %bb.0:531; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax532; X86-AVX512F-NEXT:    vmovups 8(%eax), %xmm0533; X86-AVX512F-NEXT:    retl534  %ptr0 = getelementptr inbounds i32, ptr %ptr, i64 2535  %ptr1 = getelementptr inbounds i32, ptr %ptr, i64 3536  %ptr3 = getelementptr inbounds i32, ptr %ptr, i64 5537  %val0 = load i32, ptr %ptr0538  %val1 = load i32, ptr %ptr1539  %val3 = load i32, ptr %ptr3540  %res0 = insertelement <16 x i32> undef, i32 %val0, i32 0541  %res1 = insertelement <16 x i32> %res0, i32 %val1, i32 1542  %res3 = insertelement <16 x i32> %res1, i32 %val3, i32 3543  ret <16 x i32> %res3544}545 546define <16 x i32> @merge_16i32_i32_0uu3uuuuuuuuCuEF(ptr %ptr) nounwind uwtable noinline ssp {547; ALL-LABEL: merge_16i32_i32_0uu3uuuuuuuuCuEF:548; ALL:       # %bb.0:549; ALL-NEXT:    vmovups (%rdi), %zmm0550; ALL-NEXT:    retq551;552; X86-AVX512F-LABEL: merge_16i32_i32_0uu3uuuuuuuuCuEF:553; X86-AVX512F:       # %bb.0:554; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax555; X86-AVX512F-NEXT:    vmovups (%eax), %zmm0556; X86-AVX512F-NEXT:    retl557  %ptr3 = getelementptr inbounds i32, ptr %ptr, i64 3558  %ptrC = getelementptr inbounds i32, ptr %ptr, i64 12559  %ptrE = getelementptr inbounds i32, ptr %ptr, i64 14560  %ptrF = getelementptr inbounds i32, ptr %ptr, i64 15561  %val0 = load i32, ptr %ptr562  %val3 = load i32, ptr %ptr3563  %valC = load i32, ptr %ptrC564  %valE = load i32, ptr %ptrE565  %valF = load i32, ptr %ptrF566  %res0 = insertelement <16 x i32> undef, i32 %val0, i32 0567  %res3 = insertelement <16 x i32> %res0, i32 %val3, i32 3568  %resC = insertelement <16 x i32> %res3, i32 %valC, i32 12569  %resE = insertelement <16 x i32> %resC, i32 %valE, i32 14570  %resF = insertelement <16 x i32> %resE, i32 %valF, i32 15571  ret <16 x i32> %resF572}573 574define <16 x i32> @merge_16i32_i32_0uu3zzuuuuuzCuEF(ptr %ptr) nounwind uwtable noinline ssp {575; ALL-LABEL: merge_16i32_i32_0uu3zzuuuuuzCuEF:576; ALL:       # %bb.0:577; ALL-NEXT:    vmovdqu64 (%rdi), %zmm0578; ALL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0579; ALL-NEXT:    retq580;581; X86-AVX512F-LABEL: merge_16i32_i32_0uu3zzuuuuuzCuEF:582; X86-AVX512F:       # %bb.0:583; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax584; X86-AVX512F-NEXT:    vmovdqu64 (%eax), %zmm0585; X86-AVX512F-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}, %zmm0, %zmm0586; X86-AVX512F-NEXT:    retl587  %ptr3 = getelementptr inbounds i32, ptr %ptr, i64 3588  %ptrC = getelementptr inbounds i32, ptr %ptr, i64 12589  %ptrE = getelementptr inbounds i32, ptr %ptr, i64 14590  %ptrF = getelementptr inbounds i32, ptr %ptr, i64 15591  %val0 = load i32, ptr %ptr592  %val3 = load i32, ptr %ptr3593  %valC = load i32, ptr %ptrC594  %valE = load i32, ptr %ptrE595  %valF = load i32, ptr %ptrF596  %res0 = insertelement <16 x i32> undef, i32 %val0, i32 0597  %res3 = insertelement <16 x i32> %res0, i32 %val3, i32 3598  %res4 = insertelement <16 x i32> %res3, i32     0, i32 4599  %res5 = insertelement <16 x i32> %res4, i32     0, i32 5600  %resC = insertelement <16 x i32> %res5, i32 %valC, i32 12601  %resD = insertelement <16 x i32> %resC, i32     0, i32 13602  %resE = insertelement <16 x i32> %resD, i32 %valE, i32 14603  %resF = insertelement <16 x i32> %resE, i32 %valF, i32 15604  ret <16 x i32> %resF605}606 607define <16 x i32> @merge_16i32_i32_FEDCBA9876543210(ptr %ptr) nounwind uwtable noinline ssp {608; ALL-LABEL: merge_16i32_i32_FEDCBA9876543210:609; ALL:       # %bb.0:610; ALL-NEXT:    vpshufd {{.*#+}} zmm0 = mem[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]611; ALL-NEXT:    vshufi64x2 {{.*#+}} zmm0 = zmm0[6,7,4,5,2,3,0,1]612; ALL-NEXT:    retq613;614; X86-AVX512F-LABEL: merge_16i32_i32_FEDCBA9876543210:615; X86-AVX512F:       # %bb.0:616; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax617; X86-AVX512F-NEXT:    vpshufd {{.*#+}} zmm0 = mem[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]618; X86-AVX512F-NEXT:    vshufi64x2 {{.*#+}} zmm0 = zmm0[6,7,4,5,2,3,0,1]619; X86-AVX512F-NEXT:    retl620  %ptr0 = getelementptr inbounds i32, ptr %ptr, i64 15621  %ptr1 = getelementptr inbounds i32, ptr %ptr, i64 14622  %ptr2 = getelementptr inbounds i32, ptr %ptr, i64 13623  %ptr3 = getelementptr inbounds i32, ptr %ptr, i64 12624  %ptr4 = getelementptr inbounds i32, ptr %ptr, i64 11625  %ptr5 = getelementptr inbounds i32, ptr %ptr, i64 10626  %ptr6 = getelementptr inbounds i32, ptr %ptr, i64 9627  %ptr7 = getelementptr inbounds i32, ptr %ptr, i64 8628  %ptr8 = getelementptr inbounds i32, ptr %ptr, i64 7629  %ptr9 = getelementptr inbounds i32, ptr %ptr, i64 6630  %ptrA = getelementptr inbounds i32, ptr %ptr, i64 5631  %ptrB = getelementptr inbounds i32, ptr %ptr, i64 4632  %ptrC = getelementptr inbounds i32, ptr %ptr, i64 3633  %ptrD = getelementptr inbounds i32, ptr %ptr, i64 2634  %ptrE = getelementptr inbounds i32, ptr %ptr, i64 1635  %ptrF = getelementptr inbounds i32, ptr %ptr, i64 0636  %val0 = load i32, ptr %ptr0637  %val1 = load i32, ptr %ptr1638  %val2 = load i32, ptr %ptr2639  %val3 = load i32, ptr %ptr3640  %val4 = load i32, ptr %ptr4641  %val5 = load i32, ptr %ptr5642  %val6 = load i32, ptr %ptr6643  %val7 = load i32, ptr %ptr7644  %val8 = load i32, ptr %ptr8645  %val9 = load i32, ptr %ptr9646  %valA = load i32, ptr %ptrA647  %valB = load i32, ptr %ptrB648  %valC = load i32, ptr %ptrC649  %valD = load i32, ptr %ptrD650  %valE = load i32, ptr %ptrE651  %valF = load i32, ptr %ptrF652  %res0 = insertelement <16 x i32> poison, i32 %val0, i64 0653  %res1 = insertelement <16 x i32> %res0, i32 %val1, i64 1654  %res2 = insertelement <16 x i32> %res1, i32 %val2, i64 2655  %res3 = insertelement <16 x i32> %res2, i32 %val3, i64 3656  %res4 = insertelement <16 x i32> %res3, i32 %val4, i64 4657  %res5 = insertelement <16 x i32> %res4, i32 %val5, i64 5658  %res6 = insertelement <16 x i32> %res5, i32 %val6, i64 6659  %res7 = insertelement <16 x i32> %res6, i32 %val7, i64 7660  %res8 = insertelement <16 x i32> %res7, i32 %val8, i64 8661  %res9 = insertelement <16 x i32> %res8, i32 %val9, i64 9662  %resA = insertelement <16 x i32> %res9, i32 %valA, i64 10663  %resB = insertelement <16 x i32> %resA, i32 %valB, i64 11664  %resC = insertelement <16 x i32> %resB, i32 %valC, i64 12665  %resD = insertelement <16 x i32> %resC, i32 %valD, i64 13666  %resE = insertelement <16 x i32> %resD, i32 %valE, i64 14667  %resF = insertelement <16 x i32> %resE, i32 %valF, i64 15668  ret <16 x i32> %resF669}670 671define <32 x i16> @merge_32i16_i16_12u4uuuuuuuuuuuuuuuuuuuuuuuuuuzz(ptr %ptr) nounwind uwtable noinline ssp {672; ALL-LABEL: merge_32i16_i16_12u4uuuuuuuuuuuuuuuuuuuuuuuuuuzz:673; ALL:       # %bb.0:674; ALL-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero675; ALL-NEXT:    retq676;677; X86-AVX512F-LABEL: merge_32i16_i16_12u4uuuuuuuuuuuuuuuuuuuuuuuuuuzz:678; X86-AVX512F:       # %bb.0:679; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax680; X86-AVX512F-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero681; X86-AVX512F-NEXT:    retl682  %ptr0 = getelementptr inbounds i16, ptr %ptr, i64 1683  %ptr1 = getelementptr inbounds i16, ptr %ptr, i64 2684  %ptr3 = getelementptr inbounds i16, ptr %ptr, i64 4685  %val0 = load i16, ptr %ptr0686  %val1 = load i16, ptr %ptr1687  %val3 = load i16, ptr %ptr3688  %res0 = insertelement <32 x i16> undef, i16 %val0, i16 0689  %res1 = insertelement <32 x i16> %res0, i16 %val1, i16 1690  %res3 = insertelement <32 x i16> %res1, i16 %val3, i16 3691  %res30 = insertelement <32 x i16> %res3, i16 0, i16 30692  %res31 = insertelement <32 x i16> %res30, i16 0, i16 31693  ret <32 x i16> %res31694}695 696define <32 x i16> @merge_32i16_i16_45u7uuuuuuuuuuuuuuuuuuuuuuuuuuuu(ptr %ptr) nounwind uwtable noinline ssp {697; ALL-LABEL: merge_32i16_i16_45u7uuuuuuuuuuuuuuuuuuuuuuuuuuuu:698; ALL:       # %bb.0:699; ALL-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero700; ALL-NEXT:    retq701;702; X86-AVX512F-LABEL: merge_32i16_i16_45u7uuuuuuuuuuuuuuuuuuuuuuuuuuuu:703; X86-AVX512F:       # %bb.0:704; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax705; X86-AVX512F-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero706; X86-AVX512F-NEXT:    retl707  %ptr0 = getelementptr inbounds i16, ptr %ptr, i64 4708  %ptr1 = getelementptr inbounds i16, ptr %ptr, i64 5709  %ptr3 = getelementptr inbounds i16, ptr %ptr, i64 7710  %val0 = load i16, ptr %ptr0711  %val1 = load i16, ptr %ptr1712  %val3 = load i16, ptr %ptr3713  %res0 = insertelement <32 x i16> undef, i16 %val0, i16 0714  %res1 = insertelement <32 x i16> %res0, i16 %val1, i16 1715  %res3 = insertelement <32 x i16> %res1, i16 %val3, i16 3716  ret <32 x i16> %res3717}718 719define <32 x i16> @merge_32i16_i16_23uzuuuuuuuuuuzzzzuuuuuuuuuuuuuu(ptr %ptr) nounwind uwtable noinline ssp {720; ALL-LABEL: merge_32i16_i16_23uzuuuuuuuuuuzzzzuuuuuuuuuuuuuu:721; ALL:       # %bb.0:722; ALL-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero723; ALL-NEXT:    retq724;725; X86-AVX512F-LABEL: merge_32i16_i16_23uzuuuuuuuuuuzzzzuuuuuuuuuuuuuu:726; X86-AVX512F:       # %bb.0:727; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax728; X86-AVX512F-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero729; X86-AVX512F-NEXT:    retl730  %ptr0 = getelementptr inbounds i16, ptr %ptr, i64 2731  %ptr1 = getelementptr inbounds i16, ptr %ptr, i64 3732  %val0 = load i16, ptr %ptr0733  %val1 = load i16, ptr %ptr1734  %res0 = insertelement <32 x i16> undef, i16 %val0, i16 0735  %res1 = insertelement <32 x i16> %res0, i16 %val1, i16 1736  %res3 = insertelement <32 x i16> %res1, i16     0, i16 3737  %resE = insertelement <32 x i16> %res3, i16     0, i16 14738  %resF = insertelement <32 x i16> %resE, i16     0, i16 15739  %resG = insertelement <32 x i16> %resF, i16     0, i16 16740  %resH = insertelement <32 x i16> %resG, i16     0, i16 17741  ret <32 x i16> %resH742}743 744define <64 x i8> @merge_64i8_i8_12u4uuu8uuuuuuzzzzuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuz(ptr %ptr) nounwind uwtable noinline ssp {745; ALL-LABEL: merge_64i8_i8_12u4uuu8uuuuuuzzzzuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuz:746; ALL:       # %bb.0:747; ALL-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero748; ALL-NEXT:    retq749;750; X86-AVX512F-LABEL: merge_64i8_i8_12u4uuu8uuuuuuzzzzuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuz:751; X86-AVX512F:       # %bb.0:752; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax753; X86-AVX512F-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero754; X86-AVX512F-NEXT:    retl755  %ptr0 = getelementptr inbounds i8, ptr %ptr, i64 1756  %ptr1 = getelementptr inbounds i8, ptr %ptr, i64 2757  %ptr3 = getelementptr inbounds i8, ptr %ptr, i64 4758  %ptr7 = getelementptr inbounds i8, ptr %ptr, i64 8759  %val0 = load i8, ptr %ptr0760  %val1 = load i8, ptr %ptr1761  %val3 = load i8, ptr %ptr3762  %val7 = load i8, ptr %ptr7763  %res0  = insertelement <64 x i8> undef,  i8 %val0, i8 0764  %res1  = insertelement <64 x i8> %res0,  i8 %val1, i8 1765  %res3  = insertelement <64 x i8> %res1,  i8 %val3, i8 3766  %res7  = insertelement <64 x i8> %res3,  i8 %val7, i8 7767  %res14 = insertelement <64 x i8> %res7,  i8     0, i8 14768  %res15 = insertelement <64 x i8> %res14, i8     0, i8 15769  %res16 = insertelement <64 x i8> %res15, i8     0, i8 16770  %res17 = insertelement <64 x i8> %res16, i8     0, i8 17771  %res63 = insertelement <64 x i8> %res17, i8     0, i8 63772  ret <64 x i8> %res63773}774 775define <64 x i8> @merge_64i8_i8_12u4uuuuuuuuuuzzzzuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuz(ptr %ptr) nounwind uwtable noinline ssp {776; ALL-LABEL: merge_64i8_i8_12u4uuuuuuuuuuzzzzuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuz:777; ALL:       # %bb.0:778; ALL-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero779; ALL-NEXT:    retq780;781; X86-AVX512F-LABEL: merge_64i8_i8_12u4uuuuuuuuuuzzzzuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuz:782; X86-AVX512F:       # %bb.0:783; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax784; X86-AVX512F-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero785; X86-AVX512F-NEXT:    retl786  %ptr0 = getelementptr inbounds i8, ptr %ptr, i64 1787  %ptr1 = getelementptr inbounds i8, ptr %ptr, i64 2788  %ptr3 = getelementptr inbounds i8, ptr %ptr, i64 4789  %val0 = load i8, ptr %ptr0790  %val1 = load i8, ptr %ptr1791  %val3 = load i8, ptr %ptr3792  %res0  = insertelement <64 x i8> undef,  i8 %val0, i8 0793  %res1  = insertelement <64 x i8> %res0,  i8 %val1, i8 1794  %res3  = insertelement <64 x i8> %res1,  i8 %val3, i8 3795  %res14 = insertelement <64 x i8> %res3,  i8     0, i8 14796  %res15 = insertelement <64 x i8> %res14, i8     0, i8 15797  %res16 = insertelement <64 x i8> %res15, i8     0, i8 16798  %res17 = insertelement <64 x i8> %res16, i8     0, i8 17799  %res63 = insertelement <64 x i8> %res17, i8     0, i8 63800  ret <64 x i8> %res63801}802 803;804; consecutive loads including any/all volatiles may not be combined805;806 807define <8 x double> @merge_8f64_f64_23uuuuu9_volatile(ptr %ptr) nounwind uwtable noinline ssp {808; ALL-LABEL: merge_8f64_f64_23uuuuu9_volatile:809; ALL:       # %bb.0:810; ALL-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero811; ALL-NEXT:    vmovhps {{.*#+}} xmm0 = xmm0[0,1],mem[0,1]812; ALL-NEXT:    vbroadcastsd 72(%rdi), %ymm1813; ALL-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0814; ALL-NEXT:    retq815;816; X86-AVX512F-LABEL: merge_8f64_f64_23uuuuu9_volatile:817; X86-AVX512F:       # %bb.0:818; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax819; X86-AVX512F-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero820; X86-AVX512F-NEXT:    vmovhps {{.*#+}} xmm0 = xmm0[0,1],mem[0,1]821; X86-AVX512F-NEXT:    vbroadcastsd 72(%eax), %ymm1822; X86-AVX512F-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0823; X86-AVX512F-NEXT:    retl824  %ptr0 = getelementptr inbounds double, ptr %ptr, i64 2825  %ptr1 = getelementptr inbounds double, ptr %ptr, i64 3826  %ptr7 = getelementptr inbounds double, ptr %ptr, i64 9827  %val0 = load volatile double, ptr %ptr0828  %val1 = load double, ptr %ptr1829  %val7 = load double, ptr %ptr7830  %res0 = insertelement <8 x double> undef, double %val0, i32 0831  %res1 = insertelement <8 x double> %res0, double %val1, i32 1832  %res7 = insertelement <8 x double> %res1, double %val7, i32 7833  ret <8 x double> %res7834}835 836define <16 x i32> @merge_16i32_i32_0uu3uuuuuuuuCuEF_volatile(ptr %ptr) nounwind uwtable noinline ssp {837; ALL-LABEL: merge_16i32_i32_0uu3uuuuuuuuCuEF_volatile:838; ALL:       # %bb.0:839; ALL-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero840; ALL-NEXT:    vpinsrd $3, 12(%rdi), %xmm0, %xmm0841; ALL-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero842; ALL-NEXT:    vpinsrd $2, 56(%rdi), %xmm1, %xmm1843; ALL-NEXT:    vpinsrd $3, 60(%rdi), %xmm1, %xmm1844; ALL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm1845; ALL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0846; ALL-NEXT:    retq847;848; X86-AVX512F-LABEL: merge_16i32_i32_0uu3uuuuuuuuCuEF_volatile:849; X86-AVX512F:       # %bb.0:850; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax851; X86-AVX512F-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero852; X86-AVX512F-NEXT:    vpinsrd $3, 12(%eax), %xmm0, %xmm0853; X86-AVX512F-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero854; X86-AVX512F-NEXT:    vpinsrd $2, 56(%eax), %xmm1, %xmm1855; X86-AVX512F-NEXT:    vpinsrd $3, 60(%eax), %xmm1, %xmm1856; X86-AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm1857; X86-AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0858; X86-AVX512F-NEXT:    retl859  %ptr3 = getelementptr inbounds i32, ptr %ptr, i64 3860  %ptrC = getelementptr inbounds i32, ptr %ptr, i64 12861  %ptrE = getelementptr inbounds i32, ptr %ptr, i64 14862  %ptrF = getelementptr inbounds i32, ptr %ptr, i64 15863  %val0 = load volatile i32, ptr %ptr864  %val3 = load volatile i32, ptr %ptr3865  %valC = load volatile i32, ptr %ptrC866  %valE = load volatile i32, ptr %ptrE867  %valF = load volatile i32, ptr %ptrF868  %res0 = insertelement <16 x i32> undef, i32 %val0, i32 0869  %res3 = insertelement <16 x i32> %res0, i32 %val3, i32 3870  %resC = insertelement <16 x i32> %res3, i32 %valC, i32 12871  %resE = insertelement <16 x i32> %resC, i32 %valE, i32 14872  %resF = insertelement <16 x i32> %resE, i32 %valF, i32 15873  ret <16 x i32> %resF874}875