brintos

brintos / llvm-project-archived public Read only

0
0
Text · 51.5 KiB · c50af69 Raw
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