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