1475 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-apple-darwin -mattr=+avx2,+mmx | FileCheck %s --check-prefixes=X86,X86-AVX23; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx2,+mmx | FileCheck %s --check-prefixes=X64,X64-AVX24; RUN: llc < %s -mtriple=i686-apple-darwin -mattr=+avx512vl,+avx512dq,+mmx | FileCheck %s --check-prefixes=X86,X86-AVX512VL5; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512vl,+avx512dq,+mmx | FileCheck %s --check-prefixes=X64,X64-AVX512VL6 7define <16 x i8> @BB16(ptr %ptr) nounwind uwtable readnone ssp {8; X86-LABEL: BB16:9; X86: ## %bb.0: ## %entry10; X86-NEXT: movl {{[0-9]+}}(%esp), %eax11; X86-NEXT: vpbroadcastb (%eax), %xmm012; X86-NEXT: retl13;14; X64-LABEL: BB16:15; X64: ## %bb.0: ## %entry16; X64-NEXT: vpbroadcastb (%rdi), %xmm017; X64-NEXT: retq18entry:19 %q = load i8, ptr %ptr, align 420 %q0 = insertelement <16 x i8> undef, i8 %q, i32 021 %q1 = insertelement <16 x i8> %q0, i8 %q, i32 122 %q2 = insertelement <16 x i8> %q1, i8 %q, i32 223 %q3 = insertelement <16 x i8> %q2, i8 %q, i32 324 %q4 = insertelement <16 x i8> %q3, i8 %q, i32 425 %q5 = insertelement <16 x i8> %q4, i8 %q, i32 526 %q6 = insertelement <16 x i8> %q5, i8 %q, i32 627 %q7 = insertelement <16 x i8> %q6, i8 %q, i32 728 %q8 = insertelement <16 x i8> %q7, i8 %q, i32 829 %q9 = insertelement <16 x i8> %q8, i8 %q, i32 930 %qa = insertelement <16 x i8> %q9, i8 %q, i32 1031 %qb = insertelement <16 x i8> %qa, i8 %q, i32 1132 %qc = insertelement <16 x i8> %qb, i8 %q, i32 1233 %qd = insertelement <16 x i8> %qc, i8 %q, i32 1334 %qe = insertelement <16 x i8> %qd, i8 %q, i32 1435 %qf = insertelement <16 x i8> %qe, i8 %q, i32 1536 ret <16 x i8> %qf37}38 39define <32 x i8> @BB32(ptr %ptr) nounwind uwtable readnone ssp {40; X86-LABEL: BB32:41; X86: ## %bb.0: ## %entry42; X86-NEXT: movl {{[0-9]+}}(%esp), %eax43; X86-NEXT: vpbroadcastb (%eax), %ymm044; X86-NEXT: retl45;46; X64-LABEL: BB32:47; X64: ## %bb.0: ## %entry48; X64-NEXT: vpbroadcastb (%rdi), %ymm049; X64-NEXT: retq50entry:51 %q = load i8, ptr %ptr, align 452 %q0 = insertelement <32 x i8> undef, i8 %q, i32 053 %q1 = insertelement <32 x i8> %q0, i8 %q, i32 154 %q2 = insertelement <32 x i8> %q1, i8 %q, i32 255 %q3 = insertelement <32 x i8> %q2, i8 %q, i32 356 %q4 = insertelement <32 x i8> %q3, i8 %q, i32 457 %q5 = insertelement <32 x i8> %q4, i8 %q, i32 558 %q6 = insertelement <32 x i8> %q5, i8 %q, i32 659 %q7 = insertelement <32 x i8> %q6, i8 %q, i32 760 %q8 = insertelement <32 x i8> %q7, i8 %q, i32 861 %q9 = insertelement <32 x i8> %q8, i8 %q, i32 962 %qa = insertelement <32 x i8> %q9, i8 %q, i32 1063 %qb = insertelement <32 x i8> %qa, i8 %q, i32 1164 %qc = insertelement <32 x i8> %qb, i8 %q, i32 1265 %qd = insertelement <32 x i8> %qc, i8 %q, i32 1366 %qe = insertelement <32 x i8> %qd, i8 %q, i32 1467 %qf = insertelement <32 x i8> %qe, i8 %q, i32 1568 69 %q20 = insertelement <32 x i8> %qf, i8 %q, i32 1670 %q21 = insertelement <32 x i8> %q20, i8 %q, i32 1771 %q22 = insertelement <32 x i8> %q21, i8 %q, i32 1872 %q23 = insertelement <32 x i8> %q22, i8 %q, i32 1973 %q24 = insertelement <32 x i8> %q23, i8 %q, i32 2074 %q25 = insertelement <32 x i8> %q24, i8 %q, i32 2175 %q26 = insertelement <32 x i8> %q25, i8 %q, i32 2276 %q27 = insertelement <32 x i8> %q26, i8 %q, i32 2377 %q28 = insertelement <32 x i8> %q27, i8 %q, i32 2478 %q29 = insertelement <32 x i8> %q28, i8 %q, i32 2579 %q2a = insertelement <32 x i8> %q29, i8 %q, i32 2680 %q2b = insertelement <32 x i8> %q2a, i8 %q, i32 2781 %q2c = insertelement <32 x i8> %q2b, i8 %q, i32 2882 %q2d = insertelement <32 x i8> %q2c, i8 %q, i32 2983 %q2e = insertelement <32 x i8> %q2d, i8 %q, i32 3084 %q2f = insertelement <32 x i8> %q2e, i8 %q, i32 3185 ret <32 x i8> %q2f86}87 88define <8 x i16> @W16(ptr %ptr) nounwind uwtable readnone ssp {89; X86-LABEL: W16:90; X86: ## %bb.0: ## %entry91; X86-NEXT: movl {{[0-9]+}}(%esp), %eax92; X86-NEXT: vpbroadcastw (%eax), %xmm093; X86-NEXT: retl94;95; X64-LABEL: W16:96; X64: ## %bb.0: ## %entry97; X64-NEXT: vpbroadcastw (%rdi), %xmm098; X64-NEXT: retq99entry:100 %q = load i16, ptr %ptr, align 4101 %q0 = insertelement <8 x i16> undef, i16 %q, i32 0102 %q1 = insertelement <8 x i16> %q0, i16 %q, i32 1103 %q2 = insertelement <8 x i16> %q1, i16 %q, i32 2104 %q3 = insertelement <8 x i16> %q2, i16 %q, i32 3105 %q4 = insertelement <8 x i16> %q3, i16 %q, i32 4106 %q5 = insertelement <8 x i16> %q4, i16 %q, i32 5107 %q6 = insertelement <8 x i16> %q5, i16 %q, i32 6108 %q7 = insertelement <8 x i16> %q6, i16 %q, i32 7109 ret <8 x i16> %q7110}111 112define <16 x i16> @WW16(ptr %ptr) nounwind uwtable readnone ssp {113; X86-LABEL: WW16:114; X86: ## %bb.0: ## %entry115; X86-NEXT: movl {{[0-9]+}}(%esp), %eax116; X86-NEXT: vpbroadcastw (%eax), %ymm0117; X86-NEXT: retl118;119; X64-LABEL: WW16:120; X64: ## %bb.0: ## %entry121; X64-NEXT: vpbroadcastw (%rdi), %ymm0122; X64-NEXT: retq123entry:124 %q = load i16, ptr %ptr, align 4125 %q0 = insertelement <16 x i16> undef, i16 %q, i32 0126 %q1 = insertelement <16 x i16> %q0, i16 %q, i32 1127 %q2 = insertelement <16 x i16> %q1, i16 %q, i32 2128 %q3 = insertelement <16 x i16> %q2, i16 %q, i32 3129 %q4 = insertelement <16 x i16> %q3, i16 %q, i32 4130 %q5 = insertelement <16 x i16> %q4, i16 %q, i32 5131 %q6 = insertelement <16 x i16> %q5, i16 %q, i32 6132 %q7 = insertelement <16 x i16> %q6, i16 %q, i32 7133 %q8 = insertelement <16 x i16> %q7, i16 %q, i32 8134 %q9 = insertelement <16 x i16> %q8, i16 %q, i32 9135 %qa = insertelement <16 x i16> %q9, i16 %q, i32 10136 %qb = insertelement <16 x i16> %qa, i16 %q, i32 11137 %qc = insertelement <16 x i16> %qb, i16 %q, i32 12138 %qd = insertelement <16 x i16> %qc, i16 %q, i32 13139 %qe = insertelement <16 x i16> %qd, i16 %q, i32 14140 %qf = insertelement <16 x i16> %qe, i16 %q, i32 15141 ret <16 x i16> %qf142}143 144define <4 x i32> @D32(ptr %ptr) nounwind uwtable readnone ssp {145; X86-LABEL: D32:146; X86: ## %bb.0: ## %entry147; X86-NEXT: movl {{[0-9]+}}(%esp), %eax148; X86-NEXT: vbroadcastss (%eax), %xmm0149; X86-NEXT: retl150;151; X64-LABEL: D32:152; X64: ## %bb.0: ## %entry153; X64-NEXT: vbroadcastss (%rdi), %xmm0154; X64-NEXT: retq155entry:156 %q = load i32, ptr %ptr, align 4157 %q0 = insertelement <4 x i32> undef, i32 %q, i32 0158 %q1 = insertelement <4 x i32> %q0, i32 %q, i32 1159 %q2 = insertelement <4 x i32> %q1, i32 %q, i32 2160 %q3 = insertelement <4 x i32> %q2, i32 %q, i32 3161 ret <4 x i32> %q3162}163 164define <8 x i32> @DD32(ptr %ptr) nounwind uwtable readnone ssp {165; X86-LABEL: DD32:166; X86: ## %bb.0: ## %entry167; X86-NEXT: movl {{[0-9]+}}(%esp), %eax168; X86-NEXT: vbroadcastss (%eax), %ymm0169; X86-NEXT: retl170;171; X64-LABEL: DD32:172; X64: ## %bb.0: ## %entry173; X64-NEXT: vbroadcastss (%rdi), %ymm0174; X64-NEXT: retq175entry:176 %q = load i32, ptr %ptr, align 4177 %q0 = insertelement <8 x i32> undef, i32 %q, i32 0178 %q1 = insertelement <8 x i32> %q0, i32 %q, i32 1179 %q2 = insertelement <8 x i32> %q1, i32 %q, i32 2180 %q3 = insertelement <8 x i32> %q2, i32 %q, i32 3181 %q4 = insertelement <8 x i32> %q3, i32 %q, i32 4182 %q5 = insertelement <8 x i32> %q4, i32 %q, i32 5183 %q6 = insertelement <8 x i32> %q5, i32 %q, i32 6184 %q7 = insertelement <8 x i32> %q6, i32 %q, i32 7185 ret <8 x i32> %q7186}187 188define <2 x i64> @Q64(ptr %ptr) nounwind uwtable readnone ssp {189; X86-LABEL: Q64:190; X86: ## %bb.0: ## %entry191; X86-NEXT: movl {{[0-9]+}}(%esp), %eax192; X86-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]193; X86-NEXT: retl194;195; X64-LABEL: Q64:196; X64: ## %bb.0: ## %entry197; X64-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]198; X64-NEXT: retq199entry:200 %q = load i64, ptr %ptr, align 4201 %q0 = insertelement <2 x i64> undef, i64 %q, i32 0202 %q1 = insertelement <2 x i64> %q0, i64 %q, i32 1203 ret <2 x i64> %q1204}205 206define <4 x i64> @QQ64(ptr %ptr) nounwind uwtable readnone ssp {207; X86-LABEL: QQ64:208; X86: ## %bb.0: ## %entry209; X86-NEXT: movl {{[0-9]+}}(%esp), %eax210; X86-NEXT: vbroadcastsd (%eax), %ymm0211; X86-NEXT: retl212;213; X64-LABEL: QQ64:214; X64: ## %bb.0: ## %entry215; X64-NEXT: vbroadcastsd (%rdi), %ymm0216; X64-NEXT: retq217entry:218 %q = load i64, ptr %ptr, align 4219 %q0 = insertelement <4 x i64> undef, i64 %q, i32 0220 %q1 = insertelement <4 x i64> %q0, i64 %q, i32 1221 %q2 = insertelement <4 x i64> %q1, i64 %q, i32 2222 %q3 = insertelement <4 x i64> %q2, i64 %q, i32 3223 ret <4 x i64> %q3224}225 226define <8 x i16> @broadcast_mem_v4i16_v8i16(ptr %ptr) {227; X86-LABEL: broadcast_mem_v4i16_v8i16:228; X86: ## %bb.0:229; X86-NEXT: movl {{[0-9]+}}(%esp), %eax230; X86-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]231; X86-NEXT: retl232;233; X64-LABEL: broadcast_mem_v4i16_v8i16:234; X64: ## %bb.0:235; X64-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]236; X64-NEXT: retq237 %load = load <4 x i16>, ptr %ptr238 %shuf = shufflevector <4 x i16> %load, <4 x i16> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>239 ret <8 x i16> %shuf240}241 242define <16 x i16> @broadcast_mem_v4i16_v16i16(ptr %ptr) {243; X86-LABEL: broadcast_mem_v4i16_v16i16:244; X86: ## %bb.0:245; X86-NEXT: movl {{[0-9]+}}(%esp), %eax246; X86-NEXT: vbroadcastsd (%eax), %ymm0247; X86-NEXT: retl248;249; X64-LABEL: broadcast_mem_v4i16_v16i16:250; X64: ## %bb.0:251; X64-NEXT: vbroadcastsd (%rdi), %ymm0252; X64-NEXT: retq253 %load = load <4 x i16>, ptr %ptr254 %shuf = shufflevector <4 x i16> %load, <4 x i16> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>255 ret <16 x i16> %shuf256}257 258; FIXME: Pointer adjusted broadcasts259 260define <16 x i8> @load_splat_16i8_16i8_1111111111111111(ptr %ptr) nounwind uwtable readnone ssp {261; X86-LABEL: load_splat_16i8_16i8_1111111111111111:262; X86: ## %bb.0: ## %entry263; X86-NEXT: movl {{[0-9]+}}(%esp), %eax264; X86-NEXT: vpbroadcastb 1(%eax), %xmm0265; X86-NEXT: retl266;267; X64-LABEL: load_splat_16i8_16i8_1111111111111111:268; X64: ## %bb.0: ## %entry269; X64-NEXT: vpbroadcastb 1(%rdi), %xmm0270; X64-NEXT: retq271entry:272 %ld = load <16 x i8>, ptr %ptr273 %ret = shufflevector <16 x i8> %ld, <16 x i8> undef, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>274 ret <16 x i8> %ret275}276 277define <32 x i8> @load_splat_32i8_16i8_11111111111111111111111111111111(ptr %ptr) nounwind uwtable readnone ssp {278; X86-LABEL: load_splat_32i8_16i8_11111111111111111111111111111111:279; X86: ## %bb.0: ## %entry280; X86-NEXT: movl {{[0-9]+}}(%esp), %eax281; X86-NEXT: vpbroadcastb 1(%eax), %ymm0282; X86-NEXT: retl283;284; X64-LABEL: load_splat_32i8_16i8_11111111111111111111111111111111:285; X64: ## %bb.0: ## %entry286; X64-NEXT: vpbroadcastb 1(%rdi), %ymm0287; X64-NEXT: retq288entry:289 %ld = load <16 x i8>, ptr %ptr290 %ret = shufflevector <16 x i8> %ld, <16 x i8> undef, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>291 ret <32 x i8> %ret292}293 294define <32 x i8> @load_splat_32i8_32i8_11111111111111111111111111111111(ptr %ptr) nounwind uwtable readnone ssp {295; X86-LABEL: load_splat_32i8_32i8_11111111111111111111111111111111:296; X86: ## %bb.0: ## %entry297; X86-NEXT: movl {{[0-9]+}}(%esp), %eax298; X86-NEXT: vpbroadcastb 1(%eax), %ymm0299; X86-NEXT: retl300;301; X64-LABEL: load_splat_32i8_32i8_11111111111111111111111111111111:302; X64: ## %bb.0: ## %entry303; X64-NEXT: vpbroadcastb 1(%rdi), %ymm0304; X64-NEXT: retq305entry:306 %ld = load <32 x i8>, ptr %ptr307 %ret = shufflevector <32 x i8> %ld, <32 x i8> undef, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>308 ret <32 x i8> %ret309}310 311define <8 x i16> @load_splat_8i16_8i16_11111111(ptr %ptr) nounwind uwtable readnone ssp {312; X86-LABEL: load_splat_8i16_8i16_11111111:313; X86: ## %bb.0: ## %entry314; X86-NEXT: movl {{[0-9]+}}(%esp), %eax315; X86-NEXT: vpbroadcastw 2(%eax), %xmm0316; X86-NEXT: retl317;318; X64-LABEL: load_splat_8i16_8i16_11111111:319; X64: ## %bb.0: ## %entry320; X64-NEXT: vpbroadcastw 2(%rdi), %xmm0321; X64-NEXT: retq322entry:323 %ld = load <8 x i16>, ptr %ptr324 %ret = shufflevector <8 x i16> %ld, <8 x i16> undef, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>325 ret <8 x i16> %ret326}327 328define <16 x i16> @load_splat_16i16_8i16_1111111111111111(ptr %ptr) nounwind uwtable readnone ssp {329; X86-LABEL: load_splat_16i16_8i16_1111111111111111:330; X86: ## %bb.0: ## %entry331; X86-NEXT: movl {{[0-9]+}}(%esp), %eax332; X86-NEXT: vpbroadcastw 2(%eax), %ymm0333; X86-NEXT: retl334;335; X64-LABEL: load_splat_16i16_8i16_1111111111111111:336; X64: ## %bb.0: ## %entry337; X64-NEXT: vpbroadcastw 2(%rdi), %ymm0338; X64-NEXT: retq339entry:340 %ld = load <8 x i16>, ptr %ptr341 %ret = shufflevector <8 x i16> %ld, <8 x i16> undef, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>342 ret <16 x i16> %ret343}344 345define <16 x i16> @load_splat_16i16_16i16_1111111111111111(ptr %ptr) nounwind uwtable readnone ssp {346; X86-LABEL: load_splat_16i16_16i16_1111111111111111:347; X86: ## %bb.0: ## %entry348; X86-NEXT: movl {{[0-9]+}}(%esp), %eax349; X86-NEXT: vpbroadcastw 2(%eax), %ymm0350; X86-NEXT: retl351;352; X64-LABEL: load_splat_16i16_16i16_1111111111111111:353; X64: ## %bb.0: ## %entry354; X64-NEXT: vpbroadcastw 2(%rdi), %ymm0355; X64-NEXT: retq356entry:357 %ld = load <16 x i16>, ptr %ptr358 %ret = shufflevector <16 x i16> %ld, <16 x i16> undef, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>359 ret <16 x i16> %ret360}361 362define <4 x i32> @load_splat_4i32_4i32_1111(ptr %ptr) nounwind uwtable readnone ssp {363; X86-LABEL: load_splat_4i32_4i32_1111:364; X86: ## %bb.0: ## %entry365; X86-NEXT: movl {{[0-9]+}}(%esp), %eax366; X86-NEXT: vbroadcastss 4(%eax), %xmm0367; X86-NEXT: retl368;369; X64-LABEL: load_splat_4i32_4i32_1111:370; X64: ## %bb.0: ## %entry371; X64-NEXT: vbroadcastss 4(%rdi), %xmm0372; X64-NEXT: retq373entry:374 %ld = load <4 x i32>, ptr %ptr375 %ret = shufflevector <4 x i32> %ld, <4 x i32> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>376 ret <4 x i32> %ret377}378 379define <8 x i32> @load_splat_8i32_4i32_33333333(ptr %ptr) nounwind uwtable readnone ssp {380; X86-LABEL: load_splat_8i32_4i32_33333333:381; X86: ## %bb.0: ## %entry382; X86-NEXT: movl {{[0-9]+}}(%esp), %eax383; X86-NEXT: vbroadcastss 12(%eax), %ymm0384; X86-NEXT: retl385;386; X64-LABEL: load_splat_8i32_4i32_33333333:387; X64: ## %bb.0: ## %entry388; X64-NEXT: vbroadcastss 12(%rdi), %ymm0389; X64-NEXT: retq390entry:391 %ld = load <4 x i32>, ptr %ptr392 %ret = shufflevector <4 x i32> %ld, <4 x i32> undef, <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>393 ret <8 x i32> %ret394}395 396define <8 x i32> @load_splat_8i32_8i32_55555555(ptr %ptr) nounwind uwtable readnone ssp {397; X86-LABEL: load_splat_8i32_8i32_55555555:398; X86: ## %bb.0: ## %entry399; X86-NEXT: movl {{[0-9]+}}(%esp), %eax400; X86-NEXT: vbroadcastss 20(%eax), %ymm0401; X86-NEXT: retl402;403; X64-LABEL: load_splat_8i32_8i32_55555555:404; X64: ## %bb.0: ## %entry405; X64-NEXT: vbroadcastss 20(%rdi), %ymm0406; X64-NEXT: retq407entry:408 %ld = load <8 x i32>, ptr %ptr409 %ret = shufflevector <8 x i32> %ld, <8 x i32> undef, <8 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>410 ret <8 x i32> %ret411}412 413define <4 x float> @load_splat_4f32_4f32_1111(ptr %ptr) nounwind uwtable readnone ssp {414; X86-LABEL: load_splat_4f32_4f32_1111:415; X86: ## %bb.0: ## %entry416; X86-NEXT: movl {{[0-9]+}}(%esp), %eax417; X86-NEXT: vbroadcastss 4(%eax), %xmm0418; X86-NEXT: retl419;420; X64-LABEL: load_splat_4f32_4f32_1111:421; X64: ## %bb.0: ## %entry422; X64-NEXT: vbroadcastss 4(%rdi), %xmm0423; X64-NEXT: retq424entry:425 %ld = load <4 x float>, ptr %ptr426 %ret = shufflevector <4 x float> %ld, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>427 ret <4 x float> %ret428}429 430define <8 x float> @load_splat_8f32_4f32_33333333(ptr %ptr) nounwind uwtable readnone ssp {431; X86-LABEL: load_splat_8f32_4f32_33333333:432; X86: ## %bb.0: ## %entry433; X86-NEXT: movl {{[0-9]+}}(%esp), %eax434; X86-NEXT: vbroadcastss 12(%eax), %ymm0435; X86-NEXT: retl436;437; X64-LABEL: load_splat_8f32_4f32_33333333:438; X64: ## %bb.0: ## %entry439; X64-NEXT: vbroadcastss 12(%rdi), %ymm0440; X64-NEXT: retq441entry:442 %ld = load <4 x float>, ptr %ptr443 %ret = shufflevector <4 x float> %ld, <4 x float> undef, <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>444 ret <8 x float> %ret445}446 447define <8 x float> @load_splat_8f32_8f32_55555555(ptr %ptr) nounwind uwtable readnone ssp {448; X86-LABEL: load_splat_8f32_8f32_55555555:449; X86: ## %bb.0: ## %entry450; X86-NEXT: movl {{[0-9]+}}(%esp), %eax451; X86-NEXT: vbroadcastss 20(%eax), %ymm0452; X86-NEXT: retl453;454; X64-LABEL: load_splat_8f32_8f32_55555555:455; X64: ## %bb.0: ## %entry456; X64-NEXT: vbroadcastss 20(%rdi), %ymm0457; X64-NEXT: retq458entry:459 %ld = load <8 x float>, ptr %ptr460 %ret = shufflevector <8 x float> %ld, <8 x float> undef, <8 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>461 ret <8 x float> %ret462}463 464define <2 x i64> @load_splat_2i64_2i64_1111(ptr %ptr) nounwind uwtable readnone ssp {465; X86-LABEL: load_splat_2i64_2i64_1111:466; X86: ## %bb.0: ## %entry467; X86-NEXT: movl {{[0-9]+}}(%esp), %eax468; X86-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]469; X86-NEXT: retl470;471; X64-LABEL: load_splat_2i64_2i64_1111:472; X64: ## %bb.0: ## %entry473; X64-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]474; X64-NEXT: retq475entry:476 %ld = load <2 x i64>, ptr %ptr477 %ret = shufflevector <2 x i64> %ld, <2 x i64> undef, <2 x i32> <i32 1, i32 1>478 ret <2 x i64> %ret479}480 481define <4 x i64> @load_splat_4i64_2i64_1111(ptr %ptr) nounwind uwtable readnone ssp {482; X86-LABEL: load_splat_4i64_2i64_1111:483; X86: ## %bb.0: ## %entry484; X86-NEXT: movl {{[0-9]+}}(%esp), %eax485; X86-NEXT: vbroadcastsd 8(%eax), %ymm0486; X86-NEXT: retl487;488; X64-LABEL: load_splat_4i64_2i64_1111:489; X64: ## %bb.0: ## %entry490; X64-NEXT: vbroadcastsd 8(%rdi), %ymm0491; X64-NEXT: retq492entry:493 %ld = load <2 x i64>, ptr %ptr494 %ret = shufflevector <2 x i64> %ld, <2 x i64> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>495 ret <4 x i64> %ret496}497 498define <4 x i64> @load_splat_4i64_4i64_2222(ptr %ptr) nounwind uwtable readnone ssp {499; X86-LABEL: load_splat_4i64_4i64_2222:500; X86: ## %bb.0: ## %entry501; X86-NEXT: movl {{[0-9]+}}(%esp), %eax502; X86-NEXT: vbroadcastsd 16(%eax), %ymm0503; X86-NEXT: retl504;505; X64-LABEL: load_splat_4i64_4i64_2222:506; X64: ## %bb.0: ## %entry507; X64-NEXT: vbroadcastsd 16(%rdi), %ymm0508; X64-NEXT: retq509entry:510 %ld = load <4 x i64>, ptr %ptr511 %ret = shufflevector <4 x i64> %ld, <4 x i64> undef, <4 x i32> <i32 2, i32 2, i32 2, i32 2>512 ret <4 x i64> %ret513}514 515define <2 x double> @load_splat_2f64_2f64_1111(ptr %ptr) nounwind uwtable readnone ssp {516; X86-LABEL: load_splat_2f64_2f64_1111:517; X86: ## %bb.0: ## %entry518; X86-NEXT: movl {{[0-9]+}}(%esp), %eax519; X86-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]520; X86-NEXT: retl521;522; X64-LABEL: load_splat_2f64_2f64_1111:523; X64: ## %bb.0: ## %entry524; X64-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]525; X64-NEXT: retq526entry:527 %ld = load <2 x double>, ptr %ptr528 %ret = shufflevector <2 x double> %ld, <2 x double> undef, <2 x i32> <i32 1, i32 1>529 ret <2 x double> %ret530}531 532define <4 x double> @load_splat_4f64_2f64_1111(ptr %ptr) nounwind uwtable readnone ssp {533; X86-LABEL: load_splat_4f64_2f64_1111:534; X86: ## %bb.0: ## %entry535; X86-NEXT: movl {{[0-9]+}}(%esp), %eax536; X86-NEXT: vbroadcastsd 8(%eax), %ymm0537; X86-NEXT: retl538;539; X64-LABEL: load_splat_4f64_2f64_1111:540; X64: ## %bb.0: ## %entry541; X64-NEXT: vbroadcastsd 8(%rdi), %ymm0542; X64-NEXT: retq543entry:544 %ld = load <2 x double>, ptr %ptr545 %ret = shufflevector <2 x double> %ld, <2 x double> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>546 ret <4 x double> %ret547}548 549define <4 x double> @load_splat_4f64_4f64_2222(ptr %ptr) nounwind uwtable readnone ssp {550; X86-LABEL: load_splat_4f64_4f64_2222:551; X86: ## %bb.0: ## %entry552; X86-NEXT: movl {{[0-9]+}}(%esp), %eax553; X86-NEXT: vbroadcastsd 16(%eax), %ymm0554; X86-NEXT: retl555;556; X64-LABEL: load_splat_4f64_4f64_2222:557; X64: ## %bb.0: ## %entry558; X64-NEXT: vbroadcastsd 16(%rdi), %ymm0559; X64-NEXT: retq560entry:561 %ld = load <4 x double>, ptr %ptr562 %ret = shufflevector <4 x double> %ld, <4 x double> undef, <4 x i32> <i32 2, i32 2, i32 2, i32 2>563 ret <4 x double> %ret564}565 566; make sure that we still don't support broadcast double into 128-bit vector567; this used to crash568define <2 x double> @I(ptr %ptr) nounwind uwtable readnone ssp {569; X86-LABEL: I:570; X86: ## %bb.0: ## %entry571; X86-NEXT: movl {{[0-9]+}}(%esp), %eax572; X86-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]573; X86-NEXT: retl574;575; X64-LABEL: I:576; X64: ## %bb.0: ## %entry577; X64-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]578; X64-NEXT: retq579entry:580 %q = load double, ptr %ptr, align 4581 %vecinit.i = insertelement <2 x double> undef, double %q, i32 0582 %vecinit2.i = insertelement <2 x double> %vecinit.i, double %q, i32 1583 ret <2 x double> %vecinit2.i584}585 586define <8 x i32> @V111(<8 x i32> %in) nounwind uwtable readnone ssp {587; X86-AVX2-LABEL: V111:588; X86-AVX2: ## %bb.0: ## %entry589; X86-AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [2,2,2,2,2,2,2,2]590; X86-AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0591; X86-AVX2-NEXT: retl592;593; X64-AVX2-LABEL: V111:594; X64-AVX2: ## %bb.0: ## %entry595; X64-AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [2,2,2,2,2,2,2,2]596; X64-AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0597; X64-AVX2-NEXT: retq598;599; X86-AVX512VL-LABEL: V111:600; X86-AVX512VL: ## %bb.0: ## %entry601; X86-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}{1to8}, %ymm0, %ymm0602; X86-AVX512VL-NEXT: retl603;604; X64-AVX512VL-LABEL: V111:605; X64-AVX512VL: ## %bb.0: ## %entry606; X64-AVX512VL-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm0607; X64-AVX512VL-NEXT: retq608entry:609 %g = add <8 x i32> %in, <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>610 ret <8 x i32> %g611}612 613define <8 x float> @V113(<8 x float> %in) nounwind uwtable readnone ssp {614; X86-AVX2-LABEL: V113:615; X86-AVX2: ## %bb.0: ## %entry616; X86-AVX2-NEXT: vbroadcastss {{.*#+}} ymm1 = [-7.8125E-3,-7.8125E-3,-7.8125E-3,-7.8125E-3,-7.8125E-3,-7.8125E-3,-7.8125E-3,-7.8125E-3]617; X86-AVX2-NEXT: vaddps %ymm1, %ymm0, %ymm0618; X86-AVX2-NEXT: retl619;620; X64-AVX2-LABEL: V113:621; X64-AVX2: ## %bb.0: ## %entry622; X64-AVX2-NEXT: vbroadcastss {{.*#+}} ymm1 = [-7.8125E-3,-7.8125E-3,-7.8125E-3,-7.8125E-3,-7.8125E-3,-7.8125E-3,-7.8125E-3,-7.8125E-3]623; X64-AVX2-NEXT: vaddps %ymm1, %ymm0, %ymm0624; X64-AVX2-NEXT: retq625;626; X86-AVX512VL-LABEL: V113:627; X86-AVX512VL: ## %bb.0: ## %entry628; X86-AVX512VL-NEXT: vaddps {{\.?LCPI[0-9]+_[0-9]+}}{1to8}, %ymm0, %ymm0629; X86-AVX512VL-NEXT: retl630;631; X64-AVX512VL-LABEL: V113:632; X64-AVX512VL: ## %bb.0: ## %entry633; X64-AVX512VL-NEXT: vaddps {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm0634; X64-AVX512VL-NEXT: retq635entry:636 %g = fadd <8 x float> %in, <float 0xbf80000000000000, float 0xbf80000000000000, float 0xbf80000000000000, float 0xbf80000000000000, float 0xbf80000000000000, float 0xbf80000000000000, float 0xbf80000000000000, float 0xbf80000000000000>637 ret <8 x float> %g638}639 640define <4 x float> @_e2(ptr %ptr) nounwind uwtable readnone ssp {641; X86-LABEL: _e2:642; X86: ## %bb.0:643; X86-NEXT: vbroadcastss {{.*#+}} xmm0 = [-7.8125E-3,-7.8125E-3,-7.8125E-3,-7.8125E-3]644; X86-NEXT: retl645;646; X64-LABEL: _e2:647; X64: ## %bb.0:648; X64-NEXT: vbroadcastss {{.*#+}} xmm0 = [-7.8125E-3,-7.8125E-3,-7.8125E-3,-7.8125E-3]649; X64-NEXT: retq650 %vecinit.i = insertelement <4 x float> undef, float 0xbf80000000000000, i32 0651 %vecinit2.i = insertelement <4 x float> %vecinit.i, float 0xbf80000000000000, i32 1652 %vecinit4.i = insertelement <4 x float> %vecinit2.i, float 0xbf80000000000000, i32 2653 %vecinit6.i = insertelement <4 x float> %vecinit4.i, float 0xbf80000000000000, i32 3654 ret <4 x float> %vecinit6.i655}656 657define <8 x i8> @_e4(ptr %ptr) nounwind uwtable readnone ssp {658; X86-LABEL: _e4:659; X86: ## %bb.0:660; X86-NEXT: vbroadcastss {{.*#+}} xmm0 = [52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52]661; X86-NEXT: retl662;663; X64-LABEL: _e4:664; X64: ## %bb.0:665; X64-NEXT: vbroadcastss {{.*#+}} xmm0 = [52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52]666; X64-NEXT: retq667 %vecinit0.i = insertelement <8 x i8> undef, i8 52, i32 0668 %vecinit1.i = insertelement <8 x i8> %vecinit0.i, i8 52, i32 1669 %vecinit2.i = insertelement <8 x i8> %vecinit1.i, i8 52, i32 2670 %vecinit3.i = insertelement <8 x i8> %vecinit2.i, i8 52, i32 3671 %vecinit4.i = insertelement <8 x i8> %vecinit3.i, i8 52, i32 4672 %vecinit5.i = insertelement <8 x i8> %vecinit4.i, i8 52, i32 5673 %vecinit6.i = insertelement <8 x i8> %vecinit5.i, i8 52, i32 6674 %vecinit7.i = insertelement <8 x i8> %vecinit6.i, i8 52, i32 7675 ret <8 x i8> %vecinit7.i676}677 678define void @crash() nounwind alwaysinline {679; X86-LABEL: crash:680; X86: ## %bb.0: ## %WGLoopsEntry681; X86-NEXT: xorl %eax, %eax682; X86-NEXT: testb %al, %al683; X86-NEXT: je LBB33_1684; X86-NEXT: ## %bb.2: ## %ret685; X86-NEXT: retl686; X86-NEXT: .p2align 4687; X86-NEXT: LBB33_1: ## %footer329VF688; X86-NEXT: ## =>This Inner Loop Header: Depth=1689; X86-NEXT: jmp LBB33_1690;691; X64-LABEL: crash:692; X64: ## %bb.0: ## %WGLoopsEntry693; X64-NEXT: xorl %eax, %eax694; X64-NEXT: testb %al, %al695; X64-NEXT: je LBB33_1696; X64-NEXT: ## %bb.2: ## %ret697; X64-NEXT: retq698; X64-NEXT: .p2align 4699; X64-NEXT: LBB33_1: ## %footer329VF700; X64-NEXT: ## =>This Inner Loop Header: Depth=1701; X64-NEXT: jmp LBB33_1702WGLoopsEntry:703 br i1 undef, label %ret, label %footer329VF704 705footer329VF:706 %A.0.inVF = fmul float undef, 6.553600e+04707 %B.0.in407VF = fmul <8 x float> undef, <float 6.553600e+04, float 6.553600e+04, float 6.553600e+04, float 6.553600e+04, float 6.553600e+04, float 6.553600e+04, float 6.553600e+04, float 6.553600e+04>708 %A.0VF = fptosi float %A.0.inVF to i32709 %B.0408VF = fptosi <8 x float> %B.0.in407VF to <8 x i32>710 %0 = and <8 x i32> %B.0408VF, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>711 %1 = and i32 %A.0VF, 65535712 %temp1098VF = insertelement <8 x i32> undef, i32 %1, i32 0713 %vector1099VF = shufflevector <8 x i32> %temp1098VF, <8 x i32> undef, <8 x i32> zeroinitializer714 br i1 undef, label %preload1201VF, label %footer349VF715 716preload1201VF:717 br label %footer349VF718 719footer349VF:720 %2 = mul nsw <8 x i32> undef, %0721 %3 = mul nsw <8 x i32> undef, %vector1099VF722 br label %footer329VF723 724ret:725 ret void726}727 728define <8 x i32> @_inreg0(i32 %scalar) nounwind uwtable readnone ssp {729; X86-LABEL: _inreg0:730; X86: ## %bb.0:731; X86-NEXT: vbroadcastss {{[0-9]+}}(%esp), %ymm0732; X86-NEXT: retl733;734; X64-AVX2-LABEL: _inreg0:735; X64-AVX2: ## %bb.0:736; X64-AVX2-NEXT: vmovd %edi, %xmm0737; X64-AVX2-NEXT: vpbroadcastd %xmm0, %ymm0738; X64-AVX2-NEXT: retq739;740; X64-AVX512VL-LABEL: _inreg0:741; X64-AVX512VL: ## %bb.0:742; X64-AVX512VL-NEXT: vpbroadcastd %edi, %ymm0743; X64-AVX512VL-NEXT: retq744 %in = insertelement <8 x i32> undef, i32 %scalar, i32 0745 %wide = shufflevector <8 x i32> %in, <8 x i32> undef, <8 x i32> zeroinitializer746 ret <8 x i32> %wide747}748 749define <8 x float> @_inreg1(float %scalar) nounwind uwtable readnone ssp {750; X86-LABEL: _inreg1:751; X86: ## %bb.0:752; X86-NEXT: vbroadcastss {{[0-9]+}}(%esp), %ymm0753; X86-NEXT: retl754;755; X64-LABEL: _inreg1:756; X64: ## %bb.0:757; X64-NEXT: vbroadcastss %xmm0, %ymm0758; X64-NEXT: retq759 %in = insertelement <8 x float> undef, float %scalar, i32 0760 %wide = shufflevector <8 x float> %in, <8 x float> undef, <8 x i32> zeroinitializer761 ret <8 x float> %wide762}763 764define <4 x float> @_inreg2(float %scalar) nounwind uwtable readnone ssp {765; X86-LABEL: _inreg2:766; X86: ## %bb.0:767; X86-NEXT: vbroadcastss {{[0-9]+}}(%esp), %xmm0768; X86-NEXT: retl769;770; X64-LABEL: _inreg2:771; X64: ## %bb.0:772; X64-NEXT: vbroadcastss %xmm0, %xmm0773; X64-NEXT: retq774 %in = insertelement <4 x float> undef, float %scalar, i32 0775 %wide = shufflevector <4 x float> %in, <4 x float> undef, <4 x i32> zeroinitializer776 ret <4 x float> %wide777}778 779define <4 x double> @_inreg3(double %scalar) nounwind uwtable readnone ssp {780; X86-LABEL: _inreg3:781; X86: ## %bb.0:782; X86-NEXT: vbroadcastsd {{[0-9]+}}(%esp), %ymm0783; X86-NEXT: retl784;785; X64-LABEL: _inreg3:786; X64: ## %bb.0:787; X64-NEXT: vbroadcastsd %xmm0, %ymm0788; X64-NEXT: retq789 %in = insertelement <4 x double> undef, double %scalar, i32 0790 %wide = shufflevector <4 x double> %in, <4 x double> undef, <4 x i32> zeroinitializer791 ret <4 x double> %wide792}793 794define <8 x float> @_inreg8xfloat(<8 x float> %a) {795; X86-LABEL: _inreg8xfloat:796; X86: ## %bb.0:797; X86-NEXT: vbroadcastss %xmm0, %ymm0798; X86-NEXT: retl799;800; X64-LABEL: _inreg8xfloat:801; X64: ## %bb.0:802; X64-NEXT: vbroadcastss %xmm0, %ymm0803; X64-NEXT: retq804 %b = shufflevector <8 x float> %a, <8 x float> undef, <8 x i32> zeroinitializer805 ret <8 x float> %b806}807 808define <4 x float> @_inreg4xfloat(<4 x float> %a) {809; X86-LABEL: _inreg4xfloat:810; X86: ## %bb.0:811; X86-NEXT: vbroadcastss %xmm0, %xmm0812; X86-NEXT: retl813;814; X64-LABEL: _inreg4xfloat:815; X64: ## %bb.0:816; X64-NEXT: vbroadcastss %xmm0, %xmm0817; X64-NEXT: retq818 %b = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> zeroinitializer819 ret <4 x float> %b820}821 822define <16 x i16> @_inreg16xi16(<16 x i16> %a) {823; X86-LABEL: _inreg16xi16:824; X86: ## %bb.0:825; X86-NEXT: vpbroadcastw %xmm0, %ymm0826; X86-NEXT: retl827;828; X64-LABEL: _inreg16xi16:829; X64: ## %bb.0:830; X64-NEXT: vpbroadcastw %xmm0, %ymm0831; X64-NEXT: retq832 %b = shufflevector <16 x i16> %a, <16 x i16> undef, <16 x i32> zeroinitializer833 ret <16 x i16> %b834}835 836define <8 x i16> @_inreg8xi16(<8 x i16> %a) {837; X86-LABEL: _inreg8xi16:838; X86: ## %bb.0:839; X86-NEXT: vpbroadcastw %xmm0, %xmm0840; X86-NEXT: retl841;842; X64-LABEL: _inreg8xi16:843; X64: ## %bb.0:844; X64-NEXT: vpbroadcastw %xmm0, %xmm0845; X64-NEXT: retq846 %b = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> zeroinitializer847 ret <8 x i16> %b848}849 850define <4 x i64> @_inreg4xi64(<4 x i64> %a) {851; X86-LABEL: _inreg4xi64:852; X86: ## %bb.0:853; X86-NEXT: vbroadcastsd %xmm0, %ymm0854; X86-NEXT: retl855;856; X64-LABEL: _inreg4xi64:857; X64: ## %bb.0:858; X64-NEXT: vbroadcastsd %xmm0, %ymm0859; X64-NEXT: retq860 %b = shufflevector <4 x i64> %a, <4 x i64> undef, <4 x i32> zeroinitializer861 ret <4 x i64> %b862}863 864define <2 x i64> @_inreg2xi64(<2 x i64> %a) {865; X86-LABEL: _inreg2xi64:866; X86: ## %bb.0:867; X86-NEXT: vmovddup {{.*#+}} xmm0 = xmm0[0,0]868; X86-NEXT: retl869;870; X64-LABEL: _inreg2xi64:871; X64: ## %bb.0:872; X64-NEXT: vmovddup {{.*#+}} xmm0 = xmm0[0,0]873; X64-NEXT: retq874 %b = shufflevector <2 x i64> %a, <2 x i64> undef, <2 x i32> zeroinitializer875 ret <2 x i64> %b876}877 878define <4 x double> @_inreg4xdouble(<4 x double> %a) {879; X86-LABEL: _inreg4xdouble:880; X86: ## %bb.0:881; X86-NEXT: vbroadcastsd %xmm0, %ymm0882; X86-NEXT: retl883;884; X64-LABEL: _inreg4xdouble:885; X64: ## %bb.0:886; X64-NEXT: vbroadcastsd %xmm0, %ymm0887; X64-NEXT: retq888 %b = shufflevector <4 x double> %a, <4 x double> undef, <4 x i32> zeroinitializer889 ret <4 x double> %b890}891 892define <2 x double> @_inreg2xdouble(<2 x double> %a) {893; X86-LABEL: _inreg2xdouble:894; X86: ## %bb.0:895; X86-NEXT: vmovddup {{.*#+}} xmm0 = xmm0[0,0]896; X86-NEXT: retl897;898; X64-LABEL: _inreg2xdouble:899; X64: ## %bb.0:900; X64-NEXT: vmovddup {{.*#+}} xmm0 = xmm0[0,0]901; X64-NEXT: retq902 %b = shufflevector <2 x double> %a, <2 x double> undef, <2 x i32> zeroinitializer903 ret <2 x double> %b904}905 906define <8 x i32> @_inreg8xi32(<8 x i32> %a) {907; X86-LABEL: _inreg8xi32:908; X86: ## %bb.0:909; X86-NEXT: vbroadcastss %xmm0, %ymm0910; X86-NEXT: retl911;912; X64-LABEL: _inreg8xi32:913; X64: ## %bb.0:914; X64-NEXT: vbroadcastss %xmm0, %ymm0915; X64-NEXT: retq916 %b = shufflevector <8 x i32> %a, <8 x i32> undef, <8 x i32> zeroinitializer917 ret <8 x i32> %b918}919 920define <4 x i32> @_inreg4xi32(<4 x i32> %a) {921; X86-LABEL: _inreg4xi32:922; X86: ## %bb.0:923; X86-NEXT: vbroadcastss %xmm0, %xmm0924; X86-NEXT: retl925;926; X64-LABEL: _inreg4xi32:927; X64: ## %bb.0:928; X64-NEXT: vbroadcastss %xmm0, %xmm0929; X64-NEXT: retq930 %b = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> zeroinitializer931 ret <4 x i32> %b932}933 934define <32 x i8> @_inreg32xi8(<32 x i8> %a) {935; X86-LABEL: _inreg32xi8:936; X86: ## %bb.0:937; X86-NEXT: vpbroadcastb %xmm0, %ymm0938; X86-NEXT: retl939;940; X64-LABEL: _inreg32xi8:941; X64: ## %bb.0:942; X64-NEXT: vpbroadcastb %xmm0, %ymm0943; X64-NEXT: retq944 %b = shufflevector <32 x i8> %a, <32 x i8> undef, <32 x i32> zeroinitializer945 ret <32 x i8> %b946}947 948define <16 x i8> @_inreg16xi8(<16 x i8> %a) {949; X86-LABEL: _inreg16xi8:950; X86: ## %bb.0:951; X86-NEXT: vpbroadcastb %xmm0, %xmm0952; X86-NEXT: retl953;954; X64-LABEL: _inreg16xi8:955; X64: ## %bb.0:956; X64-NEXT: vpbroadcastb %xmm0, %xmm0957; X64-NEXT: retq958 %b = shufflevector <16 x i8> %a, <16 x i8> undef, <16 x i32> zeroinitializer959 ret <16 x i8> %b960}961 962; These tests check that a vbroadcast instruction is used when we have a splat963; formed from a concat_vectors (via the shufflevector) of two BUILD_VECTORs964; (via the insertelements).965 966define <8 x float> @splat_concat1(float %f) {967; X86-LABEL: splat_concat1:968; X86: ## %bb.0:969; X86-NEXT: vbroadcastss {{[0-9]+}}(%esp), %ymm0970; X86-NEXT: retl971;972; X64-LABEL: splat_concat1:973; X64: ## %bb.0:974; X64-NEXT: vbroadcastss %xmm0, %ymm0975; X64-NEXT: retq976 %1 = insertelement <4 x float> undef, float %f, i32 0977 %2 = insertelement <4 x float> %1, float %f, i32 1978 %3 = insertelement <4 x float> %2, float %f, i32 2979 %4 = insertelement <4 x float> %3, float %f, i32 3980 %5 = shufflevector <4 x float> %4, <4 x float> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>981 ret <8 x float> %5982}983 984define <8 x float> @splat_concat2(float %f) {985; X86-LABEL: splat_concat2:986; X86: ## %bb.0:987; X86-NEXT: vbroadcastss {{[0-9]+}}(%esp), %ymm0988; X86-NEXT: retl989;990; X64-LABEL: splat_concat2:991; X64: ## %bb.0:992; X64-NEXT: vbroadcastss %xmm0, %ymm0993; X64-NEXT: retq994 %1 = insertelement <4 x float> undef, float %f, i32 0995 %2 = insertelement <4 x float> %1, float %f, i32 1996 %3 = insertelement <4 x float> %2, float %f, i32 2997 %4 = insertelement <4 x float> %3, float %f, i32 3998 %5 = insertelement <4 x float> undef, float %f, i32 0999 %6 = insertelement <4 x float> %5, float %f, i32 11000 %7 = insertelement <4 x float> %6, float %f, i32 21001 %8 = insertelement <4 x float> %7, float %f, i32 31002 %9 = shufflevector <4 x float> %4, <4 x float> %8, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1003 ret <8 x float> %91004}1005 1006define <4 x double> @splat_concat3(double %d) {1007; X86-LABEL: splat_concat3:1008; X86: ## %bb.0:1009; X86-NEXT: vbroadcastsd {{[0-9]+}}(%esp), %ymm01010; X86-NEXT: retl1011;1012; X64-LABEL: splat_concat3:1013; X64: ## %bb.0:1014; X64-NEXT: vbroadcastsd %xmm0, %ymm01015; X64-NEXT: retq1016 %1 = insertelement <2 x double> undef, double %d, i32 01017 %2 = insertelement <2 x double> %1, double %d, i32 11018 %3 = shufflevector <2 x double> %2, <2 x double> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1>1019 ret <4 x double> %31020}1021 1022define <4 x double> @splat_concat4(double %d) {1023; X86-LABEL: splat_concat4:1024; X86: ## %bb.0:1025; X86-NEXT: vbroadcastsd {{[0-9]+}}(%esp), %ymm01026; X86-NEXT: retl1027;1028; X64-LABEL: splat_concat4:1029; X64: ## %bb.0:1030; X64-NEXT: vbroadcastsd %xmm0, %ymm01031; X64-NEXT: retq1032 %1 = insertelement <2 x double> undef, double %d, i32 01033 %2 = insertelement <2 x double> %1, double %d, i32 11034 %3 = insertelement <2 x double> undef, double %d, i32 01035 %4 = insertelement <2 x double> %3, double %d, i32 11036 %5 = shufflevector <2 x double> %2, <2 x double> %4, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1037 ret <4 x double> %51038}1039 1040define void @broadcast_v16i32(ptr %a, ptr %b) {1041; X86-AVX2-LABEL: broadcast_v16i32:1042; X86-AVX2: ## %bb.0:1043; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax1044; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx1045; X86-AVX2-NEXT: vbroadcastss (%ecx), %ymm01046; X86-AVX2-NEXT: vmovups %ymm0, 32(%eax)1047; X86-AVX2-NEXT: vmovups %ymm0, (%eax)1048; X86-AVX2-NEXT: vzeroupper1049; X86-AVX2-NEXT: retl1050;1051; X64-AVX2-LABEL: broadcast_v16i32:1052; X64-AVX2: ## %bb.0:1053; X64-AVX2-NEXT: vbroadcastss (%rdi), %ymm01054; X64-AVX2-NEXT: vmovups %ymm0, 32(%rsi)1055; X64-AVX2-NEXT: vmovups %ymm0, (%rsi)1056; X64-AVX2-NEXT: vzeroupper1057; X64-AVX2-NEXT: retq1058;1059; X86-AVX512VL-LABEL: broadcast_v16i32:1060; X86-AVX512VL: ## %bb.0:1061; X86-AVX512VL-NEXT: movl {{[0-9]+}}(%esp), %eax1062; X86-AVX512VL-NEXT: movl {{[0-9]+}}(%esp), %ecx1063; X86-AVX512VL-NEXT: vbroadcastss (%ecx), %zmm01064; X86-AVX512VL-NEXT: vmovups %zmm0, (%eax)1065; X86-AVX512VL-NEXT: vzeroupper1066; X86-AVX512VL-NEXT: retl1067;1068; X64-AVX512VL-LABEL: broadcast_v16i32:1069; X64-AVX512VL: ## %bb.0:1070; X64-AVX512VL-NEXT: vbroadcastss (%rdi), %zmm01071; X64-AVX512VL-NEXT: vmovups %zmm0, (%rsi)1072; X64-AVX512VL-NEXT: vzeroupper1073; X64-AVX512VL-NEXT: retq1074 %1 = load i32, ptr %a, align 41075 %2 = insertelement <8 x i32> undef, i32 %1, i32 01076 %3 = shufflevector <8 x i32> %2, <8 x i32> undef, <8 x i32> zeroinitializer1077 %4 = shufflevector <8 x i32> undef, <8 x i32> %3, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>1078 store <16 x i32> %4, ptr %b, align 41079 ret void1080}1081 1082; Test cases for <rdar://problem/16074331>.1083; Instruction selection for broacast instruction fails if1084; the load cannot be folded into the broadcast.1085; This happens if the load has initial one use but other uses are1086; created later, or if selection DAG cannot prove that folding the1087; load will not create a cycle in the DAG.1088; Those test cases exerce the latter.1089 1090define void @isel_crash_16b(ptr %cV_R.addr) {1091; X86-LABEL: isel_crash_16b:1092; X86: ## %bb.0: ## %eintry1093; X86-NEXT: subl $60, %esp1094; X86-NEXT: .cfi_def_cfa_offset 641095; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1096; X86-NEXT: vxorps %xmm0, %xmm0, %xmm01097; X86-NEXT: vmovaps %xmm0, (%esp)1098; X86-NEXT: vpbroadcastb (%eax), %xmm11099; X86-NEXT: vmovaps %xmm0, {{[0-9]+}}(%esp)1100; X86-NEXT: vmovdqa %xmm1, {{[0-9]+}}(%esp)1101; X86-NEXT: addl $60, %esp1102; X86-NEXT: retl1103;1104; X64-LABEL: isel_crash_16b:1105; X64: ## %bb.0: ## %eintry1106; X64-NEXT: vxorps %xmm0, %xmm0, %xmm01107; X64-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)1108; X64-NEXT: vpbroadcastb (%rdi), %xmm11109; X64-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)1110; X64-NEXT: vmovdqa %xmm1, -{{[0-9]+}}(%rsp)1111; X64-NEXT: retq1112eintry:1113 %__a.addr.i = alloca <2 x i64>, align 161114 %__b.addr.i = alloca <2 x i64>, align 161115 %vCr = alloca <2 x i64>, align 161116 store <2 x i64> zeroinitializer, ptr %vCr, align 161117 %tmp = load <2 x i64>, ptr %vCr, align 161118 %tmp2 = load i8, ptr %cV_R.addr, align 41119 %splat.splatinsert = insertelement <16 x i8> undef, i8 %tmp2, i32 01120 %splat.splat = shufflevector <16 x i8> %splat.splatinsert, <16 x i8> undef, <16 x i32> zeroinitializer1121 %tmp3 = bitcast <16 x i8> %splat.splat to <2 x i64>1122 store <2 x i64> %tmp, ptr %__a.addr.i, align 161123 store <2 x i64> %tmp3, ptr %__b.addr.i, align 161124 ret void1125}1126 1127define void @isel_crash_32b(ptr %cV_R.addr) {1128; X86-LABEL: isel_crash_32b:1129; X86: ## %bb.0: ## %eintry1130; X86-NEXT: pushl %ebp1131; X86-NEXT: .cfi_def_cfa_offset 81132; X86-NEXT: .cfi_offset %ebp, -81133; X86-NEXT: movl %esp, %ebp1134; X86-NEXT: .cfi_def_cfa_register %ebp1135; X86-NEXT: andl $-32, %esp1136; X86-NEXT: subl $128, %esp1137; X86-NEXT: movl 8(%ebp), %eax1138; X86-NEXT: vxorps %xmm0, %xmm0, %xmm01139; X86-NEXT: vmovaps %ymm0, (%esp)1140; X86-NEXT: vpbroadcastb (%eax), %ymm11141; X86-NEXT: vmovaps %ymm0, {{[0-9]+}}(%esp)1142; X86-NEXT: vmovdqa %ymm1, {{[0-9]+}}(%esp)1143; X86-NEXT: movl %ebp, %esp1144; X86-NEXT: popl %ebp1145; X86-NEXT: vzeroupper1146; X86-NEXT: retl1147;1148; X64-LABEL: isel_crash_32b:1149; X64: ## %bb.0: ## %eintry1150; X64-NEXT: pushq %rbp1151; X64-NEXT: .cfi_def_cfa_offset 161152; X64-NEXT: .cfi_offset %rbp, -161153; X64-NEXT: movq %rsp, %rbp1154; X64-NEXT: .cfi_def_cfa_register %rbp1155; X64-NEXT: andq $-32, %rsp1156; X64-NEXT: subq $128, %rsp1157; X64-NEXT: vxorps %xmm0, %xmm0, %xmm01158; X64-NEXT: vmovaps %ymm0, (%rsp)1159; X64-NEXT: vpbroadcastb (%rdi), %ymm11160; X64-NEXT: vmovaps %ymm0, {{[0-9]+}}(%rsp)1161; X64-NEXT: vmovdqa %ymm1, {{[0-9]+}}(%rsp)1162; X64-NEXT: movq %rbp, %rsp1163; X64-NEXT: popq %rbp1164; X64-NEXT: vzeroupper1165; X64-NEXT: retq1166eintry:1167 %__a.addr.i = alloca <4 x i64>, align 321168 %__b.addr.i = alloca <4 x i64>, align 321169 %vCr = alloca <4 x i64>, align 321170 store <4 x i64> zeroinitializer, ptr %vCr, align 161171 %tmp = load <4 x i64>, ptr %vCr, align 161172 %tmp2 = load i8, ptr %cV_R.addr, align 41173 %splat.splatinsert = insertelement <32 x i8> undef, i8 %tmp2, i32 01174 %splat.splat = shufflevector <32 x i8> %splat.splatinsert, <32 x i8> undef, <32 x i32> zeroinitializer1175 %tmp3 = bitcast <32 x i8> %splat.splat to <4 x i64>1176 store <4 x i64> %tmp, ptr %__a.addr.i, align 161177 store <4 x i64> %tmp3, ptr %__b.addr.i, align 161178 ret void1179}1180 1181define void @isel_crash_8w(ptr %cV_R.addr) {1182; X86-LABEL: isel_crash_8w:1183; X86: ## %bb.0: ## %entry1184; X86-NEXT: subl $60, %esp1185; X86-NEXT: .cfi_def_cfa_offset 641186; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1187; X86-NEXT: vxorps %xmm0, %xmm0, %xmm01188; X86-NEXT: vmovaps %xmm0, (%esp)1189; X86-NEXT: vpbroadcastw (%eax), %xmm11190; X86-NEXT: vmovaps %xmm0, {{[0-9]+}}(%esp)1191; X86-NEXT: vmovdqa %xmm1, {{[0-9]+}}(%esp)1192; X86-NEXT: addl $60, %esp1193; X86-NEXT: retl1194;1195; X64-LABEL: isel_crash_8w:1196; X64: ## %bb.0: ## %entry1197; X64-NEXT: vxorps %xmm0, %xmm0, %xmm01198; X64-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)1199; X64-NEXT: vpbroadcastw (%rdi), %xmm11200; X64-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)1201; X64-NEXT: vmovdqa %xmm1, -{{[0-9]+}}(%rsp)1202; X64-NEXT: retq1203entry:1204 %__a.addr.i = alloca <2 x i64>, align 161205 %__b.addr.i = alloca <2 x i64>, align 161206 %vCr = alloca <2 x i64>, align 161207 store <2 x i64> zeroinitializer, ptr %vCr, align 161208 %tmp = load <2 x i64>, ptr %vCr, align 161209 %tmp2 = load i16, ptr %cV_R.addr, align 41210 %splat.splatinsert = insertelement <8 x i16> undef, i16 %tmp2, i32 01211 %splat.splat = shufflevector <8 x i16> %splat.splatinsert, <8 x i16> undef, <8 x i32> zeroinitializer1212 %tmp3 = bitcast <8 x i16> %splat.splat to <2 x i64>1213 store <2 x i64> %tmp, ptr %__a.addr.i, align 161214 store <2 x i64> %tmp3, ptr %__b.addr.i, align 161215 ret void1216}1217 1218define void @isel_crash_16w(ptr %cV_R.addr) {1219; X86-LABEL: isel_crash_16w:1220; X86: ## %bb.0: ## %eintry1221; X86-NEXT: pushl %ebp1222; X86-NEXT: .cfi_def_cfa_offset 81223; X86-NEXT: .cfi_offset %ebp, -81224; X86-NEXT: movl %esp, %ebp1225; X86-NEXT: .cfi_def_cfa_register %ebp1226; X86-NEXT: andl $-32, %esp1227; X86-NEXT: subl $128, %esp1228; X86-NEXT: movl 8(%ebp), %eax1229; X86-NEXT: vxorps %xmm0, %xmm0, %xmm01230; X86-NEXT: vmovaps %ymm0, (%esp)1231; X86-NEXT: vpbroadcastw (%eax), %ymm11232; X86-NEXT: vmovaps %ymm0, {{[0-9]+}}(%esp)1233; X86-NEXT: vmovdqa %ymm1, {{[0-9]+}}(%esp)1234; X86-NEXT: movl %ebp, %esp1235; X86-NEXT: popl %ebp1236; X86-NEXT: vzeroupper1237; X86-NEXT: retl1238;1239; X64-LABEL: isel_crash_16w:1240; X64: ## %bb.0: ## %eintry1241; X64-NEXT: pushq %rbp1242; X64-NEXT: .cfi_def_cfa_offset 161243; X64-NEXT: .cfi_offset %rbp, -161244; X64-NEXT: movq %rsp, %rbp1245; X64-NEXT: .cfi_def_cfa_register %rbp1246; X64-NEXT: andq $-32, %rsp1247; X64-NEXT: subq $128, %rsp1248; X64-NEXT: vxorps %xmm0, %xmm0, %xmm01249; X64-NEXT: vmovaps %ymm0, (%rsp)1250; X64-NEXT: vpbroadcastw (%rdi), %ymm11251; X64-NEXT: vmovaps %ymm0, {{[0-9]+}}(%rsp)1252; X64-NEXT: vmovdqa %ymm1, {{[0-9]+}}(%rsp)1253; X64-NEXT: movq %rbp, %rsp1254; X64-NEXT: popq %rbp1255; X64-NEXT: vzeroupper1256; X64-NEXT: retq1257eintry:1258 %__a.addr.i = alloca <4 x i64>, align 321259 %__b.addr.i = alloca <4 x i64>, align 321260 %vCr = alloca <4 x i64>, align 321261 store <4 x i64> zeroinitializer, ptr %vCr, align 161262 %tmp = load <4 x i64>, ptr %vCr, align 161263 %tmp2 = load i16, ptr %cV_R.addr, align 41264 %splat.splatinsert = insertelement <16 x i16> undef, i16 %tmp2, i32 01265 %splat.splat = shufflevector <16 x i16> %splat.splatinsert, <16 x i16> undef, <16 x i32> zeroinitializer1266 %tmp3 = bitcast <16 x i16> %splat.splat to <4 x i64>1267 store <4 x i64> %tmp, ptr %__a.addr.i, align 161268 store <4 x i64> %tmp3, ptr %__b.addr.i, align 161269 ret void1270}1271 1272define void @isel_crash_4d(ptr %cV_R.addr) {1273; X86-LABEL: isel_crash_4d:1274; X86: ## %bb.0: ## %entry1275; X86-NEXT: subl $60, %esp1276; X86-NEXT: .cfi_def_cfa_offset 641277; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1278; X86-NEXT: vxorps %xmm0, %xmm0, %xmm01279; X86-NEXT: vmovaps %xmm0, (%esp)1280; X86-NEXT: vbroadcastss (%eax), %xmm11281; X86-NEXT: vmovaps %xmm0, {{[0-9]+}}(%esp)1282; X86-NEXT: vmovaps %xmm1, {{[0-9]+}}(%esp)1283; X86-NEXT: addl $60, %esp1284; X86-NEXT: retl1285;1286; X64-LABEL: isel_crash_4d:1287; X64: ## %bb.0: ## %entry1288; X64-NEXT: vxorps %xmm0, %xmm0, %xmm01289; X64-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)1290; X64-NEXT: vbroadcastss (%rdi), %xmm11291; X64-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)1292; X64-NEXT: vmovaps %xmm1, -{{[0-9]+}}(%rsp)1293; X64-NEXT: retq1294entry:1295 %__a.addr.i = alloca <2 x i64>, align 161296 %__b.addr.i = alloca <2 x i64>, align 161297 %vCr = alloca <2 x i64>, align 161298 store <2 x i64> zeroinitializer, ptr %vCr, align 161299 %tmp = load <2 x i64>, ptr %vCr, align 161300 %tmp2 = load i32, ptr %cV_R.addr, align 41301 %splat.splatinsert = insertelement <4 x i32> undef, i32 %tmp2, i32 01302 %splat.splat = shufflevector <4 x i32> %splat.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer1303 %tmp3 = bitcast <4 x i32> %splat.splat to <2 x i64>1304 store <2 x i64> %tmp, ptr %__a.addr.i, align 161305 store <2 x i64> %tmp3, ptr %__b.addr.i, align 161306 ret void1307}1308 1309define void @isel_crash_8d(ptr %cV_R.addr) {1310; X86-LABEL: isel_crash_8d:1311; X86: ## %bb.0: ## %eintry1312; X86-NEXT: pushl %ebp1313; X86-NEXT: .cfi_def_cfa_offset 81314; X86-NEXT: .cfi_offset %ebp, -81315; X86-NEXT: movl %esp, %ebp1316; X86-NEXT: .cfi_def_cfa_register %ebp1317; X86-NEXT: andl $-32, %esp1318; X86-NEXT: subl $128, %esp1319; X86-NEXT: movl 8(%ebp), %eax1320; X86-NEXT: vxorps %xmm0, %xmm0, %xmm01321; X86-NEXT: vmovaps %ymm0, (%esp)1322; X86-NEXT: vbroadcastss (%eax), %ymm11323; X86-NEXT: vmovaps %ymm0, {{[0-9]+}}(%esp)1324; X86-NEXT: vmovaps %ymm1, {{[0-9]+}}(%esp)1325; X86-NEXT: movl %ebp, %esp1326; X86-NEXT: popl %ebp1327; X86-NEXT: vzeroupper1328; X86-NEXT: retl1329;1330; X64-LABEL: isel_crash_8d:1331; X64: ## %bb.0: ## %eintry1332; X64-NEXT: pushq %rbp1333; X64-NEXT: .cfi_def_cfa_offset 161334; X64-NEXT: .cfi_offset %rbp, -161335; X64-NEXT: movq %rsp, %rbp1336; X64-NEXT: .cfi_def_cfa_register %rbp1337; X64-NEXT: andq $-32, %rsp1338; X64-NEXT: subq $128, %rsp1339; X64-NEXT: vxorps %xmm0, %xmm0, %xmm01340; X64-NEXT: vmovaps %ymm0, (%rsp)1341; X64-NEXT: vbroadcastss (%rdi), %ymm11342; X64-NEXT: vmovaps %ymm0, {{[0-9]+}}(%rsp)1343; X64-NEXT: vmovaps %ymm1, {{[0-9]+}}(%rsp)1344; X64-NEXT: movq %rbp, %rsp1345; X64-NEXT: popq %rbp1346; X64-NEXT: vzeroupper1347; X64-NEXT: retq1348eintry:1349 %__a.addr.i = alloca <4 x i64>, align 321350 %__b.addr.i = alloca <4 x i64>, align 321351 %vCr = alloca <4 x i64>, align 321352 store <4 x i64> zeroinitializer, ptr %vCr, align 161353 %tmp = load <4 x i64>, ptr %vCr, align 161354 %tmp2 = load i32, ptr %cV_R.addr, align 41355 %splat.splatinsert = insertelement <8 x i32> undef, i32 %tmp2, i32 01356 %splat.splat = shufflevector <8 x i32> %splat.splatinsert, <8 x i32> undef, <8 x i32> zeroinitializer1357 %tmp3 = bitcast <8 x i32> %splat.splat to <4 x i64>1358 store <4 x i64> %tmp, ptr %__a.addr.i, align 161359 store <4 x i64> %tmp3, ptr %__b.addr.i, align 161360 ret void1361}1362 1363define void @isel_crash_2q(ptr %cV_R.addr) {1364; X86-LABEL: isel_crash_2q:1365; X86: ## %bb.0: ## %entry1366; X86-NEXT: subl $60, %esp1367; X86-NEXT: .cfi_def_cfa_offset 641368; X86-NEXT: movl {{[0-9]+}}(%esp), %eax1369; X86-NEXT: vxorps %xmm0, %xmm0, %xmm01370; X86-NEXT: vmovaps %xmm0, (%esp)1371; X86-NEXT: vmovddup {{.*#+}} xmm1 = mem[0,0]1372; X86-NEXT: vmovaps %xmm0, {{[0-9]+}}(%esp)1373; X86-NEXT: vmovaps %xmm1, {{[0-9]+}}(%esp)1374; X86-NEXT: addl $60, %esp1375; X86-NEXT: retl1376;1377; X64-LABEL: isel_crash_2q:1378; X64: ## %bb.0: ## %entry1379; X64-NEXT: vxorps %xmm0, %xmm0, %xmm01380; X64-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)1381; X64-NEXT: vmovddup {{.*#+}} xmm1 = mem[0,0]1382; X64-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)1383; X64-NEXT: vmovaps %xmm1, -{{[0-9]+}}(%rsp)1384; X64-NEXT: retq1385entry:1386 %__a.addr.i = alloca <2 x i64>, align 161387 %__b.addr.i = alloca <2 x i64>, align 161388 %vCr = alloca <2 x i64>, align 161389 store <2 x i64> zeroinitializer, ptr %vCr, align 161390 %tmp = load <2 x i64>, ptr %vCr, align 161391 %tmp2 = load i64, ptr %cV_R.addr, align 41392 %splat.splatinsert = insertelement <2 x i64> undef, i64 %tmp2, i32 01393 %splat.splat = shufflevector <2 x i64> %splat.splatinsert, <2 x i64> undef, <2 x i32> zeroinitializer1394 store <2 x i64> %tmp, ptr %__a.addr.i, align 161395 store <2 x i64> %splat.splat, ptr %__b.addr.i, align 161396 ret void1397}1398 1399define void @isel_crash_4q(ptr %cV_R.addr) {1400; X86-LABEL: isel_crash_4q:1401; X86: ## %bb.0: ## %eintry1402; X86-NEXT: pushl %ebp1403; X86-NEXT: .cfi_def_cfa_offset 81404; X86-NEXT: .cfi_offset %ebp, -81405; X86-NEXT: movl %esp, %ebp1406; X86-NEXT: .cfi_def_cfa_register %ebp1407; X86-NEXT: andl $-32, %esp1408; X86-NEXT: subl $128, %esp1409; X86-NEXT: movl 8(%ebp), %eax1410; X86-NEXT: vxorps %xmm0, %xmm0, %xmm01411; X86-NEXT: vmovaps %ymm0, (%esp)1412; X86-NEXT: vbroadcastsd (%eax), %ymm11413; X86-NEXT: vmovaps %ymm0, {{[0-9]+}}(%esp)1414; X86-NEXT: vmovaps %ymm1, {{[0-9]+}}(%esp)1415; X86-NEXT: movl %ebp, %esp1416; X86-NEXT: popl %ebp1417; X86-NEXT: vzeroupper1418; X86-NEXT: retl1419;1420; X64-LABEL: isel_crash_4q:1421; X64: ## %bb.0: ## %eintry1422; X64-NEXT: pushq %rbp1423; X64-NEXT: .cfi_def_cfa_offset 161424; X64-NEXT: .cfi_offset %rbp, -161425; X64-NEXT: movq %rsp, %rbp1426; X64-NEXT: .cfi_def_cfa_register %rbp1427; X64-NEXT: andq $-32, %rsp1428; X64-NEXT: subq $128, %rsp1429; X64-NEXT: vxorps %xmm0, %xmm0, %xmm01430; X64-NEXT: vmovaps %ymm0, (%rsp)1431; X64-NEXT: vbroadcastsd (%rdi), %ymm11432; X64-NEXT: vmovaps %ymm0, {{[0-9]+}}(%rsp)1433; X64-NEXT: vmovaps %ymm1, {{[0-9]+}}(%rsp)1434; X64-NEXT: movq %rbp, %rsp1435; X64-NEXT: popq %rbp1436; X64-NEXT: vzeroupper1437; X64-NEXT: retq1438eintry:1439 %__a.addr.i = alloca <4 x i64>, align 321440 %__b.addr.i = alloca <4 x i64>, align 321441 %vCr = alloca <4 x i64>, align 321442 store <4 x i64> zeroinitializer, ptr %vCr, align 161443 %tmp = load <4 x i64>, ptr %vCr, align 161444 %tmp2 = load i64, ptr %cV_R.addr, align 41445 %splat.splatinsert = insertelement <4 x i64> undef, i64 %tmp2, i32 01446 %splat.splat = shufflevector <4 x i64> %splat.splatinsert, <4 x i64> undef, <4 x i32> zeroinitializer1447 store <4 x i64> %tmp, ptr %__a.addr.i, align 161448 store <4 x i64> %splat.splat, ptr %__b.addr.i, align 161449 ret void1450}1451 1452define <8 x i16> @broadcast_x86_mmx(<1 x i64> %tmp) nounwind {1453; X86-LABEL: broadcast_x86_mmx:1454; X86: ## %bb.0: ## %bb1455; X86-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]1456; X86-NEXT: retl1457;1458; X64-AVX2-LABEL: broadcast_x86_mmx:1459; X64-AVX2: ## %bb.0: ## %bb1460; X64-AVX2-NEXT: vmovq %rdi, %xmm01461; X64-AVX2-NEXT: vpbroadcastq %xmm0, %xmm01462; X64-AVX2-NEXT: retq1463;1464; X64-AVX512VL-LABEL: broadcast_x86_mmx:1465; X64-AVX512VL: ## %bb.0: ## %bb1466; X64-AVX512VL-NEXT: vpbroadcastq %rdi, %xmm01467; X64-AVX512VL-NEXT: retq1468bb:1469 %tmp1 = bitcast <1 x i64> %tmp to i641470 %tmp2 = insertelement <2 x i64> undef, i64 %tmp1, i32 01471 %tmp3 = bitcast <2 x i64> %tmp2 to <8 x i16>1472 %tmp4 = shufflevector <8 x i16> %tmp3, <8 x i16> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>1473 ret <8 x i16> %tmp41474}1475