1036 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-apple-darwin -mattr=+avx,+mmx | FileCheck %s --check-prefix=X863; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx,+mmx | FileCheck %s --check-prefix=X644 5define <4 x i64> @A(ptr %ptr) nounwind uwtable readnone ssp {6; X86-LABEL: A:7; X86: ## %bb.0: ## %entry8; X86-NEXT: movl {{[0-9]+}}(%esp), %eax9; X86-NEXT: vbroadcastsd (%eax), %ymm010; X86-NEXT: retl11;12; X64-LABEL: A:13; X64: ## %bb.0: ## %entry14; X64-NEXT: vbroadcastsd (%rdi), %ymm015; X64-NEXT: retq16entry:17 %q = load i64, ptr %ptr, align 818 %vecinit.i = insertelement <4 x i64> undef, i64 %q, i32 019 %vecinit2.i = insertelement <4 x i64> %vecinit.i, i64 %q, i32 120 %vecinit4.i = insertelement <4 x i64> %vecinit2.i, i64 %q, i32 221 %vecinit6.i = insertelement <4 x i64> %vecinit4.i, i64 %q, i32 322 ret <4 x i64> %vecinit6.i23}24 25define <4 x i64> @A2(ptr %ptr, ptr %ptr2) nounwind uwtable readnone ssp {26; X86-LABEL: A2:27; X86: ## %bb.0: ## %entry28; X86-NEXT: pushl %esi29; X86-NEXT: .cfi_def_cfa_offset 830; X86-NEXT: .cfi_offset %esi, -831; X86-NEXT: movl {{[0-9]+}}(%esp), %eax32; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx33; X86-NEXT: movl (%ecx), %edx34; X86-NEXT: movl 4(%ecx), %esi35; X86-NEXT: vbroadcastsd (%ecx), %ymm036; X86-NEXT: movl %edx, (%eax)37; X86-NEXT: movl %esi, 4(%eax)38; X86-NEXT: popl %esi39; X86-NEXT: retl40;41; X64-LABEL: A2:42; X64: ## %bb.0: ## %entry43; X64-NEXT: movq (%rdi), %rax44; X64-NEXT: movq %rax, (%rsi)45; X64-NEXT: vmovq %rax, %xmm046; X64-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]47; X64-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm048; X64-NEXT: retq49entry:50 %q = load i64, ptr %ptr, align 851 store i64 %q, ptr %ptr2, align 8 ; to create a chain to prevent broadcast52 %vecinit.i = insertelement <4 x i64> undef, i64 %q, i32 053 %vecinit2.i = insertelement <4 x i64> %vecinit.i, i64 %q, i32 154 %vecinit4.i = insertelement <4 x i64> %vecinit2.i, i64 %q, i32 255 %vecinit6.i = insertelement <4 x i64> %vecinit4.i, i64 %q, i32 356 ret <4 x i64> %vecinit6.i57}58 59define <8 x i32> @B(ptr %ptr) nounwind uwtable readnone ssp {60; X86-LABEL: B:61; X86: ## %bb.0: ## %entry62; X86-NEXT: movl {{[0-9]+}}(%esp), %eax63; X86-NEXT: vbroadcastss (%eax), %ymm064; X86-NEXT: retl65;66; X64-LABEL: B:67; X64: ## %bb.0: ## %entry68; X64-NEXT: vbroadcastss (%rdi), %ymm069; X64-NEXT: retq70entry:71 %q = load i32, ptr %ptr, align 472 %vecinit.i = insertelement <8 x i32> undef, i32 %q, i32 073 %vecinit2.i = insertelement <8 x i32> %vecinit.i, i32 %q, i32 174 %vecinit4.i = insertelement <8 x i32> %vecinit2.i, i32 %q, i32 275 %vecinit6.i = insertelement <8 x i32> %vecinit4.i, i32 %q, i32 376 ret <8 x i32> %vecinit6.i77}78 79define <8 x i32> @B2(ptr %ptr) nounwind uwtable readnone ssp {80; X86-LABEL: B2:81; X86: ## %bb.0: ## %entry82; X86-NEXT: movl {{[0-9]+}}(%esp), %eax83; X86-NEXT: vbroadcastss (%eax), %ymm084; X86-NEXT: retl85;86; X64-LABEL: B2:87; X64: ## %bb.0: ## %entry88; X64-NEXT: vbroadcastss (%rdi), %ymm089; X64-NEXT: retq90entry:91 %q = load i32, ptr %ptr, align 492 %vecinit.i = insertelement <8 x i32> undef, i32 %q, i32 093 %vecinit2.i = insertelement <8 x i32> %vecinit.i, i32 %q, i32 194 %vecinit4.i = insertelement <8 x i32> %vecinit2.i, i32 %q, i32 295 %vecinit6.i = insertelement <8 x i32> %vecinit4.i, i32 %q, i32 396 %vecinit8.i = insertelement <8 x i32> %vecinit6.i, i32 %q, i32 497 %vecinit10.i = insertelement <8 x i32> %vecinit8.i, i32 %q, i32 598 %vecinit12.i = insertelement <8 x i32> %vecinit10.i, i32 %q, i32 699 %vecinit14.i = insertelement <8 x i32> %vecinit12.i, i32 %q, i32 7100 ret <8 x i32> %vecinit14.i101}102 103define <8 x i32> @B3(ptr %ptr, ptr %ptr2) nounwind uwtable readnone ssp {104; X86-LABEL: B3:105; X86: ## %bb.0: ## %entry106; X86-NEXT: movl {{[0-9]+}}(%esp), %eax107; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx108; X86-NEXT: movl (%ecx), %ecx109; X86-NEXT: movl %ecx, (%eax)110; X86-NEXT: vmovd %ecx, %xmm0111; X86-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]112; X86-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0113; X86-NEXT: retl114;115; X64-LABEL: B3:116; X64: ## %bb.0: ## %entry117; X64-NEXT: movl (%rdi), %eax118; X64-NEXT: movl %eax, (%rsi)119; X64-NEXT: vmovd %eax, %xmm0120; X64-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]121; X64-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0122; X64-NEXT: retq123entry:124 %q = load i32, ptr %ptr, align 4125 store i32 %q, ptr %ptr2, align 4 ; to create a chain to prevent broadcast126 %vecinit.i = insertelement <8 x i32> undef, i32 %q, i32 0127 %vecinit2.i = insertelement <8 x i32> %vecinit.i, i32 %q, i32 1128 %vecinit4.i = insertelement <8 x i32> %vecinit2.i, i32 %q, i32 2129 %vecinit6.i = insertelement <8 x i32> %vecinit4.i, i32 %q, i32 3130 %vecinit8.i = insertelement <8 x i32> %vecinit6.i, i32 %q, i32 4131 %vecinit10.i = insertelement <8 x i32> %vecinit8.i, i32 %q, i32 5132 %vecinit12.i = insertelement <8 x i32> %vecinit10.i, i32 %q, i32 6133 %vecinit14.i = insertelement <8 x i32> %vecinit12.i, i32 %q, i32 7134 ret <8 x i32> %vecinit14.i135}136 137define <4 x double> @C(ptr %ptr) nounwind uwtable readnone ssp {138; X86-LABEL: C:139; X86: ## %bb.0: ## %entry140; X86-NEXT: movl {{[0-9]+}}(%esp), %eax141; X86-NEXT: vbroadcastsd (%eax), %ymm0142; X86-NEXT: retl143;144; X64-LABEL: C:145; X64: ## %bb.0: ## %entry146; X64-NEXT: vbroadcastsd (%rdi), %ymm0147; X64-NEXT: retq148entry:149 %q = load double, ptr %ptr, align 8150 %vecinit.i = insertelement <4 x double> undef, double %q, i32 0151 %vecinit2.i = insertelement <4 x double> %vecinit.i, double %q, i32 1152 %vecinit4.i = insertelement <4 x double> %vecinit2.i, double %q, i32 2153 %vecinit6.i = insertelement <4 x double> %vecinit4.i, double %q, i32 3154 ret <4 x double> %vecinit6.i155}156 157define <4 x double> @C2(ptr %ptr, ptr %ptr2) nounwind uwtable readnone ssp {158; X86-LABEL: C2:159; X86: ## %bb.0: ## %entry160; X86-NEXT: movl {{[0-9]+}}(%esp), %eax161; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx162; X86-NEXT: vbroadcastsd (%ecx), %ymm0163; X86-NEXT: vmovlps %xmm0, (%eax)164; X86-NEXT: retl165;166; X64-LABEL: C2:167; X64: ## %bb.0: ## %entry168; X64-NEXT: vbroadcastsd (%rdi), %ymm0169; X64-NEXT: vmovlps %xmm0, (%rsi)170; X64-NEXT: retq171entry:172 %q = load double, ptr %ptr, align 8173 store double %q, ptr %ptr2, align 8 ; to create a chain to prevent broadcast174 %vecinit.i = insertelement <4 x double> undef, double %q, i32 0175 %vecinit2.i = insertelement <4 x double> %vecinit.i, double %q, i32 1176 %vecinit4.i = insertelement <4 x double> %vecinit2.i, double %q, i32 2177 %vecinit6.i = insertelement <4 x double> %vecinit4.i, double %q, i32 3178 ret <4 x double> %vecinit6.i179}180 181define <8 x float> @D(ptr %ptr) nounwind uwtable readnone ssp {182; X86-LABEL: D:183; X86: ## %bb.0: ## %entry184; X86-NEXT: movl {{[0-9]+}}(%esp), %eax185; X86-NEXT: vbroadcastss (%eax), %ymm0186; X86-NEXT: retl187;188; X64-LABEL: D:189; X64: ## %bb.0: ## %entry190; X64-NEXT: vbroadcastss (%rdi), %ymm0191; X64-NEXT: retq192entry:193 %q = load float, ptr %ptr, align 4194 %vecinit.i = insertelement <8 x float> undef, float %q, i32 0195 %vecinit2.i = insertelement <8 x float> %vecinit.i, float %q, i32 1196 %vecinit4.i = insertelement <8 x float> %vecinit2.i, float %q, i32 2197 %vecinit6.i = insertelement <8 x float> %vecinit4.i, float %q, i32 3198 ret <8 x float> %vecinit6.i199}200 201define <8 x float> @D2(ptr %ptr) nounwind uwtable readnone ssp {202; X86-LABEL: D2:203; X86: ## %bb.0: ## %entry204; X86-NEXT: movl {{[0-9]+}}(%esp), %eax205; X86-NEXT: vbroadcastss (%eax), %ymm0206; X86-NEXT: retl207;208; X64-LABEL: D2:209; X64: ## %bb.0: ## %entry210; X64-NEXT: vbroadcastss (%rdi), %ymm0211; X64-NEXT: retq212entry:213 %q = load float, ptr %ptr, align 4214 %vecinit.i = insertelement <8 x float> undef, float %q, i32 0215 %vecinit2.i = insertelement <8 x float> %vecinit.i, float %q, i32 1216 %vecinit4.i = insertelement <8 x float> %vecinit2.i, float %q, i32 2217 %vecinit6.i = insertelement <8 x float> %vecinit4.i, float %q, i32 3218 %vecinit8.i = insertelement <8 x float> %vecinit6.i, float %q, i32 4219 %vecinit10.i = insertelement <8 x float> %vecinit8.i, float %q, i32 5220 %vecinit12.i = insertelement <8 x float> %vecinit10.i, float %q, i32 6221 %vecinit14.i = insertelement <8 x float> %vecinit12.i, float %q, i32 7222 ret <8 x float> %vecinit14.i223}224 225define <8 x float> @D3(ptr %ptr, ptr %ptr2) nounwind uwtable readnone ssp {226; X86-LABEL: D3:227; X86: ## %bb.0: ## %entry228; X86-NEXT: movl {{[0-9]+}}(%esp), %eax229; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx230; X86-NEXT: vbroadcastss (%ecx), %ymm0231; X86-NEXT: vmovss %xmm0, (%eax)232; X86-NEXT: retl233;234; X64-LABEL: D3:235; X64: ## %bb.0: ## %entry236; X64-NEXT: vbroadcastss (%rdi), %ymm0237; X64-NEXT: vmovss %xmm0, (%rsi)238; X64-NEXT: retq239entry:240 %q = load float, ptr %ptr, align 4241 store float %q, ptr %ptr2, align 4 ; to create a chain to prevent broadcast242 %vecinit.i = insertelement <8 x float> undef, float %q, i32 0243 %vecinit2.i = insertelement <8 x float> %vecinit.i, float %q, i32 1244 %vecinit4.i = insertelement <8 x float> %vecinit2.i, float %q, i32 2245 %vecinit6.i = insertelement <8 x float> %vecinit4.i, float %q, i32 3246 %vecinit8.i = insertelement <8 x float> %vecinit6.i, float %q, i32 4247 %vecinit10.i = insertelement <8 x float> %vecinit8.i, float %q, i32 5248 %vecinit12.i = insertelement <8 x float> %vecinit10.i, float %q, i32 6249 %vecinit14.i = insertelement <8 x float> %vecinit12.i, float %q, i32 7250 ret <8 x float> %vecinit14.i251}252 253;;;; 128-bit versions254 255define <4 x float> @e(ptr %ptr) nounwind uwtable readnone ssp {256; X86-LABEL: e:257; X86: ## %bb.0: ## %entry258; X86-NEXT: movl {{[0-9]+}}(%esp), %eax259; X86-NEXT: vbroadcastss (%eax), %xmm0260; X86-NEXT: retl261;262; X64-LABEL: e:263; X64: ## %bb.0: ## %entry264; X64-NEXT: vbroadcastss (%rdi), %xmm0265; X64-NEXT: retq266entry:267 %q = load float, ptr %ptr, align 4268 %vecinit.i = insertelement <4 x float> undef, float %q, i32 0269 %vecinit2.i = insertelement <4 x float> %vecinit.i, float %q, i32 1270 %vecinit4.i = insertelement <4 x float> %vecinit2.i, float %q, i32 2271 %vecinit6.i = insertelement <4 x float> %vecinit4.i, float %q, i32 3272 ret <4 x float> %vecinit6.i273}274 275define <4 x float> @e2(ptr %ptr, ptr %ptr2) nounwind uwtable readnone ssp {276; X86-LABEL: e2:277; X86: ## %bb.0: ## %entry278; X86-NEXT: movl {{[0-9]+}}(%esp), %eax279; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx280; X86-NEXT: vbroadcastss (%ecx), %xmm0281; X86-NEXT: vmovss %xmm0, (%eax)282; X86-NEXT: retl283;284; X64-LABEL: e2:285; X64: ## %bb.0: ## %entry286; X64-NEXT: vbroadcastss (%rdi), %xmm0287; X64-NEXT: vmovss %xmm0, (%rsi)288; X64-NEXT: retq289entry:290 %q = load float, ptr %ptr, align 4291 store float %q, ptr %ptr2, align 4 ; to create a chain to prevent broadcast292 %vecinit.i = insertelement <4 x float> undef, float %q, i32 0293 %vecinit2.i = insertelement <4 x float> %vecinit.i, float %q, i32 1294 %vecinit4.i = insertelement <4 x float> %vecinit2.i, float %q, i32 2295 %vecinit6.i = insertelement <4 x float> %vecinit4.i, float %q, i32 3296 ret <4 x float> %vecinit6.i297}298 299; Don't broadcast constants on pre-AVX2 hardware.300define <4 x float> @_e2(ptr %ptr) nounwind uwtable readnone ssp {301; X86-LABEL: _e2:302; X86: ## %bb.0: ## %entry303; X86-NEXT: vbroadcastss {{.*#+}} xmm0 = [-7.8125E-3,-7.8125E-3,-7.8125E-3,-7.8125E-3]304; X86-NEXT: retl305;306; X64-LABEL: _e2:307; X64: ## %bb.0: ## %entry308; X64-NEXT: vbroadcastss {{.*#+}} xmm0 = [-7.8125E-3,-7.8125E-3,-7.8125E-3,-7.8125E-3]309; X64-NEXT: retq310entry:311 %vecinit.i = insertelement <4 x float> undef, float 0xbf80000000000000, i32 0312 %vecinit2.i = insertelement <4 x float> %vecinit.i, float 0xbf80000000000000, i32 1313 %vecinit4.i = insertelement <4 x float> %vecinit2.i, float 0xbf80000000000000, i32 2314 %vecinit6.i = insertelement <4 x float> %vecinit4.i, float 0xbf80000000000000, i32 3315 ret <4 x float> %vecinit6.i316}317 318 319define <4 x i32> @F(ptr %ptr) nounwind uwtable readnone ssp {320; X86-LABEL: F:321; X86: ## %bb.0: ## %entry322; X86-NEXT: movl {{[0-9]+}}(%esp), %eax323; X86-NEXT: vbroadcastss (%eax), %xmm0324; X86-NEXT: retl325;326; X64-LABEL: F:327; X64: ## %bb.0: ## %entry328; X64-NEXT: vbroadcastss (%rdi), %xmm0329; X64-NEXT: retq330entry:331 %q = load i32, ptr %ptr, align 4332 %vecinit.i = insertelement <4 x i32> undef, i32 %q, i32 0333 %vecinit2.i = insertelement <4 x i32> %vecinit.i, i32 %q, i32 1334 %vecinit4.i = insertelement <4 x i32> %vecinit2.i, i32 %q, i32 2335 %vecinit6.i = insertelement <4 x i32> %vecinit4.i, i32 %q, i32 3336 ret <4 x i32> %vecinit6.i337}338 339define <4 x i32> @F2(ptr %ptr, ptr %ptr2) nounwind uwtable readnone ssp {340; X86-LABEL: F2:341; X86: ## %bb.0: ## %entry342; X86-NEXT: movl {{[0-9]+}}(%esp), %eax343; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx344; X86-NEXT: movl (%ecx), %ecx345; X86-NEXT: movl %ecx, (%eax)346; X86-NEXT: vmovd %ecx, %xmm0347; X86-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]348; X86-NEXT: retl349;350; X64-LABEL: F2:351; X64: ## %bb.0: ## %entry352; X64-NEXT: movl (%rdi), %eax353; X64-NEXT: movl %eax, (%rsi)354; X64-NEXT: vmovd %eax, %xmm0355; X64-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]356; X64-NEXT: retq357entry:358 %q = load i32, ptr %ptr, align 4359 store i32 %q, ptr %ptr2, align 4 ; to create a chain to prevent broadcast360 %vecinit.i = insertelement <4 x i32> undef, i32 %q, i32 0361 %vecinit2.i = insertelement <4 x i32> %vecinit.i, i32 %q, i32 1362 %vecinit4.i = insertelement <4 x i32> %vecinit2.i, i32 %q, i32 2363 %vecinit6.i = insertelement <4 x i32> %vecinit4.i, i32 %q, i32 3364 ret <4 x i32> %vecinit6.i365}366 367; FIXME: Pointer adjusted broadcasts368 369define <4 x i32> @load_splat_4i32_4i32_1111(ptr %ptr) nounwind uwtable readnone ssp {370; X86-LABEL: load_splat_4i32_4i32_1111:371; X86: ## %bb.0: ## %entry372; X86-NEXT: movl {{[0-9]+}}(%esp), %eax373; X86-NEXT: vpermilps {{.*#+}} xmm0 = mem[1,1,1,1]374; X86-NEXT: retl375;376; X64-LABEL: load_splat_4i32_4i32_1111:377; X64: ## %bb.0: ## %entry378; X64-NEXT: vpermilps {{.*#+}} xmm0 = mem[1,1,1,1]379; X64-NEXT: retq380entry:381 %ld = load <4 x i32>, ptr %ptr382 %ret = shufflevector <4 x i32> %ld, <4 x i32> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>383 ret <4 x i32> %ret384}385 386define <8 x i32> @load_splat_8i32_4i32_33333333(ptr %ptr) nounwind uwtable readnone ssp {387; X86-LABEL: load_splat_8i32_4i32_33333333:388; X86: ## %bb.0: ## %entry389; X86-NEXT: movl {{[0-9]+}}(%esp), %eax390; X86-NEXT: vbroadcastss 12(%eax), %ymm0391; X86-NEXT: retl392;393; X64-LABEL: load_splat_8i32_4i32_33333333:394; X64: ## %bb.0: ## %entry395; X64-NEXT: vbroadcastss 12(%rdi), %ymm0396; X64-NEXT: retq397entry:398 %ld = load <4 x i32>, ptr %ptr399 %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>400 ret <8 x i32> %ret401}402 403define <8 x i32> @load_splat_8i32_8i32_55555555(ptr %ptr) nounwind uwtable readnone ssp {404; X86-LABEL: load_splat_8i32_8i32_55555555:405; X86: ## %bb.0: ## %entry406; X86-NEXT: movl {{[0-9]+}}(%esp), %eax407; X86-NEXT: vbroadcastss 20(%eax), %ymm0408; X86-NEXT: retl409;410; X64-LABEL: load_splat_8i32_8i32_55555555:411; X64: ## %bb.0: ## %entry412; X64-NEXT: vbroadcastss 20(%rdi), %ymm0413; X64-NEXT: retq414entry:415 %ld = load <8 x i32>, ptr %ptr416 %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>417 ret <8 x i32> %ret418}419 420define <4 x float> @load_splat_4f32_4f32_1111(ptr %ptr) nounwind uwtable readnone ssp {421; X86-LABEL: load_splat_4f32_4f32_1111:422; X86: ## %bb.0: ## %entry423; X86-NEXT: movl {{[0-9]+}}(%esp), %eax424; X86-NEXT: vbroadcastss 4(%eax), %xmm0425; X86-NEXT: retl426;427; X64-LABEL: load_splat_4f32_4f32_1111:428; X64: ## %bb.0: ## %entry429; X64-NEXT: vbroadcastss 4(%rdi), %xmm0430; X64-NEXT: retq431entry:432 %ld = load <4 x float>, ptr %ptr433 %ret = shufflevector <4 x float> %ld, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>434 ret <4 x float> %ret435}436 437define <8 x float> @load_splat_8f32_4f32_33333333(ptr %ptr) nounwind uwtable readnone ssp {438; X86-LABEL: load_splat_8f32_4f32_33333333:439; X86: ## %bb.0: ## %entry440; X86-NEXT: movl {{[0-9]+}}(%esp), %eax441; X86-NEXT: vbroadcastss 12(%eax), %ymm0442; X86-NEXT: retl443;444; X64-LABEL: load_splat_8f32_4f32_33333333:445; X64: ## %bb.0: ## %entry446; X64-NEXT: vbroadcastss 12(%rdi), %ymm0447; X64-NEXT: retq448entry:449 %ld = load <4 x float>, ptr %ptr450 %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>451 ret <8 x float> %ret452}453 454define <8 x float> @load_splat_8f32_8f32_55555555(ptr %ptr) nounwind uwtable readnone ssp {455; X86-LABEL: load_splat_8f32_8f32_55555555:456; X86: ## %bb.0: ## %entry457; X86-NEXT: movl {{[0-9]+}}(%esp), %eax458; X86-NEXT: vbroadcastss 20(%eax), %ymm0459; X86-NEXT: retl460;461; X64-LABEL: load_splat_8f32_8f32_55555555:462; X64: ## %bb.0: ## %entry463; X64-NEXT: vbroadcastss 20(%rdi), %ymm0464; X64-NEXT: retq465entry:466 %ld = load <8 x float>, ptr %ptr467 %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>468 ret <8 x float> %ret469}470 471define <2 x i64> @load_splat_2i64_2i64_1111(ptr %ptr) nounwind uwtable readnone ssp {472; X86-LABEL: load_splat_2i64_2i64_1111:473; X86: ## %bb.0: ## %entry474; X86-NEXT: movl {{[0-9]+}}(%esp), %eax475; X86-NEXT: vpermilps {{.*#+}} xmm0 = mem[2,3,2,3]476; X86-NEXT: retl477;478; X64-LABEL: load_splat_2i64_2i64_1111:479; X64: ## %bb.0: ## %entry480; X64-NEXT: vpermilps {{.*#+}} xmm0 = mem[2,3,2,3]481; X64-NEXT: retq482entry:483 %ld = load <2 x i64>, ptr %ptr484 %ret = shufflevector <2 x i64> %ld, <2 x i64> undef, <2 x i32> <i32 1, i32 1>485 ret <2 x i64> %ret486}487 488define <4 x i64> @load_splat_4i64_2i64_1111(ptr %ptr) nounwind uwtable readnone ssp {489; X86-LABEL: load_splat_4i64_2i64_1111:490; X86: ## %bb.0: ## %entry491; X86-NEXT: movl {{[0-9]+}}(%esp), %eax492; X86-NEXT: vbroadcastsd 8(%eax), %ymm0493; X86-NEXT: retl494;495; X64-LABEL: load_splat_4i64_2i64_1111:496; X64: ## %bb.0: ## %entry497; X64-NEXT: vbroadcastsd 8(%rdi), %ymm0498; X64-NEXT: retq499entry:500 %ld = load <2 x i64>, ptr %ptr501 %ret = shufflevector <2 x i64> %ld, <2 x i64> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>502 ret <4 x i64> %ret503}504 505define <4 x i64> @load_splat_4i64_4i64_2222(ptr %ptr) nounwind uwtable readnone ssp {506; X86-LABEL: load_splat_4i64_4i64_2222:507; X86: ## %bb.0: ## %entry508; X86-NEXT: movl {{[0-9]+}}(%esp), %eax509; X86-NEXT: vbroadcastsd 16(%eax), %ymm0510; X86-NEXT: retl511;512; X64-LABEL: load_splat_4i64_4i64_2222:513; X64: ## %bb.0: ## %entry514; X64-NEXT: vbroadcastsd 16(%rdi), %ymm0515; X64-NEXT: retq516entry:517 %ld = load <4 x i64>, ptr %ptr518 %ret = shufflevector <4 x i64> %ld, <4 x i64> undef, <4 x i32> <i32 2, i32 2, i32 2, i32 2>519 ret <4 x i64> %ret520}521 522define <2 x double> @load_splat_2f64_2f64_1111(ptr %ptr) nounwind uwtable readnone ssp {523; X86-LABEL: load_splat_2f64_2f64_1111:524; X86: ## %bb.0: ## %entry525; X86-NEXT: movl {{[0-9]+}}(%esp), %eax526; X86-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]527; X86-NEXT: retl528;529; X64-LABEL: load_splat_2f64_2f64_1111:530; X64: ## %bb.0: ## %entry531; X64-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]532; X64-NEXT: retq533entry:534 %ld = load <2 x double>, ptr %ptr535 %ret = shufflevector <2 x double> %ld, <2 x double> undef, <2 x i32> <i32 1, i32 1>536 ret <2 x double> %ret537}538 539define <4 x double> @load_splat_4f64_2f64_1111(ptr %ptr) nounwind uwtable readnone ssp {540; X86-LABEL: load_splat_4f64_2f64_1111:541; X86: ## %bb.0: ## %entry542; X86-NEXT: movl {{[0-9]+}}(%esp), %eax543; X86-NEXT: vbroadcastsd 8(%eax), %ymm0544; X86-NEXT: retl545;546; X64-LABEL: load_splat_4f64_2f64_1111:547; X64: ## %bb.0: ## %entry548; X64-NEXT: vbroadcastsd 8(%rdi), %ymm0549; X64-NEXT: retq550entry:551 %ld = load <2 x double>, ptr %ptr552 %ret = shufflevector <2 x double> %ld, <2 x double> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>553 ret <4 x double> %ret554}555 556define <4 x double> @load_splat_4f64_4f64_2222(ptr %ptr) nounwind uwtable readnone ssp {557; X86-LABEL: load_splat_4f64_4f64_2222:558; X86: ## %bb.0: ## %entry559; X86-NEXT: movl {{[0-9]+}}(%esp), %eax560; X86-NEXT: vbroadcastsd 16(%eax), %ymm0561; X86-NEXT: retl562;563; X64-LABEL: load_splat_4f64_4f64_2222:564; X64: ## %bb.0: ## %entry565; X64-NEXT: vbroadcastsd 16(%rdi), %ymm0566; X64-NEXT: retq567entry:568 %ld = load <4 x double>, ptr %ptr569 %ret = shufflevector <4 x double> %ld, <4 x double> undef, <4 x i32> <i32 2, i32 2, i32 2, i32 2>570 ret <4 x double> %ret571}572 573; Unsupported vbroadcasts574 575define <2 x i64> @G(ptr %ptr) nounwind uwtable readnone ssp {576; X86-LABEL: G:577; X86: ## %bb.0: ## %entry578; X86-NEXT: movl {{[0-9]+}}(%esp), %eax579; X86-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]580; X86-NEXT: retl581;582; X64-LABEL: G:583; X64: ## %bb.0: ## %entry584; X64-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]585; X64-NEXT: retq586entry:587 %q = load i64, ptr %ptr, align 8588 %vecinit.i = insertelement <2 x i64> undef, i64 %q, i32 0589 %vecinit2.i = insertelement <2 x i64> %vecinit.i, i64 %q, i32 1590 ret <2 x i64> %vecinit2.i591}592 593define <2 x i64> @G2(ptr %ptr, ptr %ptr2) nounwind uwtable readnone ssp {594; X86-LABEL: G2:595; X86: ## %bb.0: ## %entry596; X86-NEXT: pushl %esi597; X86-NEXT: .cfi_def_cfa_offset 8598; X86-NEXT: .cfi_offset %esi, -8599; X86-NEXT: movl {{[0-9]+}}(%esp), %eax600; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx601; X86-NEXT: movl (%ecx), %edx602; X86-NEXT: movl 4(%ecx), %esi603; X86-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]604; X86-NEXT: movl %edx, (%eax)605; X86-NEXT: movl %esi, 4(%eax)606; X86-NEXT: popl %esi607; X86-NEXT: retl608;609; X64-LABEL: G2:610; X64: ## %bb.0: ## %entry611; X64-NEXT: movq (%rdi), %rax612; X64-NEXT: movq %rax, (%rsi)613; X64-NEXT: vmovq %rax, %xmm0614; X64-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]615; X64-NEXT: retq616entry:617 %q = load i64, ptr %ptr, align 8618 store i64 %q, ptr %ptr2, align 8 ; to create a chain to prevent broadcast619 %vecinit.i = insertelement <2 x i64> undef, i64 %q, i32 0620 %vecinit2.i = insertelement <2 x i64> %vecinit.i, i64 %q, i32 1621 ret <2 x i64> %vecinit2.i622}623 624define <4 x i32> @H(<4 x i32> %a) {625; X86-LABEL: H:626; X86: ## %bb.0: ## %entry627; X86-NEXT: vshufps {{.*#+}} xmm0 = xmm0[1,1,1,1]628; X86-NEXT: retl629;630; X64-LABEL: H:631; X64: ## %bb.0: ## %entry632; X64-NEXT: vshufps {{.*#+}} xmm0 = xmm0[1,1,1,1]633; X64-NEXT: retq634entry:635 %x = shufflevector <4 x i32> %a, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>636 ret <4 x i32> %x637}638 639define <2 x double> @I(ptr %ptr) nounwind uwtable readnone ssp {640; X86-LABEL: I:641; X86: ## %bb.0: ## %entry642; X86-NEXT: movl {{[0-9]+}}(%esp), %eax643; X86-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]644; X86-NEXT: retl645;646; X64-LABEL: I:647; X64: ## %bb.0: ## %entry648; X64-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]649; X64-NEXT: retq650entry:651 %q = load double, ptr %ptr, align 4652 %vecinit.i = insertelement <2 x double> undef, double %q, i32 0653 %vecinit2.i = insertelement <2 x double> %vecinit.i, double %q, i32 1654 ret <2 x double> %vecinit2.i655}656 657define <2 x double> @I2(ptr %ptr, ptr %ptr2) nounwind uwtable readnone ssp {658; X86-LABEL: I2:659; X86: ## %bb.0: ## %entry660; X86-NEXT: movl {{[0-9]+}}(%esp), %eax661; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx662; X86-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]663; X86-NEXT: vmovlps %xmm0, (%eax)664; X86-NEXT: retl665;666; X64-LABEL: I2:667; X64: ## %bb.0: ## %entry668; X64-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]669; X64-NEXT: vmovlps %xmm0, (%rsi)670; X64-NEXT: retq671entry:672 %q = load double, ptr %ptr, align 4673 store double %q, ptr %ptr2, align 4 ; to create a chain to prevent broadcast674 %vecinit.i = insertelement <2 x double> undef, double %q, i32 0675 %vecinit2.i = insertelement <2 x double> %vecinit.i, double %q, i32 1676 ret <2 x double> %vecinit2.i677}678 679define <4 x float> @_RR(ptr %ptr, ptr %k) nounwind uwtable readnone ssp {680; X86-LABEL: _RR:681; X86: ## %bb.0: ## %entry682; X86-NEXT: movl {{[0-9]+}}(%esp), %eax683; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx684; X86-NEXT: vbroadcastss (%ecx), %xmm0685; X86-NEXT: movl (%eax), %eax686; X86-NEXT: movl %eax, (%eax)687; X86-NEXT: retl688;689; X64-LABEL: _RR:690; X64: ## %bb.0: ## %entry691; X64-NEXT: vbroadcastss (%rdi), %xmm0692; X64-NEXT: movl (%rsi), %eax693; X64-NEXT: movl %eax, (%rax)694; X64-NEXT: retq695entry:696 %q = load float, ptr %ptr, align 4697 %vecinit.i = insertelement <4 x float> undef, float %q, i32 0698 %vecinit2.i = insertelement <4 x float> %vecinit.i, float %q, i32 1699 %vecinit4.i = insertelement <4 x float> %vecinit2.i, float %q, i32 2700 %vecinit6.i = insertelement <4 x float> %vecinit4.i, float %q, i32 3701 ; force a chain702 %j = load i32, ptr %k, align 4703 store i32 %j, ptr undef704 ret <4 x float> %vecinit6.i705}706 707define <4 x float> @_RR2(ptr %ptr, ptr %k) nounwind uwtable readnone ssp {708; X86-LABEL: _RR2:709; X86: ## %bb.0: ## %entry710; X86-NEXT: movl {{[0-9]+}}(%esp), %eax711; X86-NEXT: vbroadcastss (%eax), %xmm0712; X86-NEXT: retl713;714; X64-LABEL: _RR2:715; X64: ## %bb.0: ## %entry716; X64-NEXT: vbroadcastss (%rdi), %xmm0717; X64-NEXT: retq718entry:719 %q = load float, ptr %ptr, align 4720 %v = insertelement <4 x float> undef, float %q, i32 0721 %t = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> zeroinitializer722 ret <4 x float> %t723}724 725; These tests check that a vbroadcast instruction is used when we have a splat726; formed from a concat_vectors (via the shufflevector) of two BUILD_VECTORs727; (via the insertelements).728 729define <8 x float> @splat_concat1(ptr %p) {730; X86-LABEL: splat_concat1:731; X86: ## %bb.0:732; X86-NEXT: movl {{[0-9]+}}(%esp), %eax733; X86-NEXT: vbroadcastss (%eax), %ymm0734; X86-NEXT: retl735;736; X64-LABEL: splat_concat1:737; X64: ## %bb.0:738; X64-NEXT: vbroadcastss (%rdi), %ymm0739; X64-NEXT: retq740 %1 = load float, ptr %p, align 4741 %2 = insertelement <4 x float> undef, float %1, i32 0742 %3 = insertelement <4 x float> %2, float %1, i32 1743 %4 = insertelement <4 x float> %3, float %1, i32 2744 %5 = insertelement <4 x float> %4, float %1, i32 3745 %6 = shufflevector <4 x float> %5, <4 x float> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>746 ret <8 x float> %6747}748 749define <8 x float> @splat_concat2(ptr %p) {750; X86-LABEL: splat_concat2:751; X86: ## %bb.0:752; X86-NEXT: movl {{[0-9]+}}(%esp), %eax753; X86-NEXT: vbroadcastss (%eax), %ymm0754; X86-NEXT: retl755;756; X64-LABEL: splat_concat2:757; X64: ## %bb.0:758; X64-NEXT: vbroadcastss (%rdi), %ymm0759; X64-NEXT: retq760 %1 = load float, ptr %p, align 4761 %2 = insertelement <4 x float> undef, float %1, i32 0762 %3 = insertelement <4 x float> %2, float %1, i32 1763 %4 = insertelement <4 x float> %3, float %1, i32 2764 %5 = insertelement <4 x float> %4, float %1, i32 3765 %6 = insertelement <4 x float> undef, float %1, i32 0766 %7 = insertelement <4 x float> %6, float %1, i32 1767 %8 = insertelement <4 x float> %7, float %1, i32 2768 %9 = insertelement <4 x float> %8, float %1, i32 3769 %10 = shufflevector <4 x float> %5, <4 x float> %9, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>770 ret <8 x float> %10771}772 773define <4 x double> @splat_concat3(ptr %p) {774; X86-LABEL: splat_concat3:775; X86: ## %bb.0:776; X86-NEXT: movl {{[0-9]+}}(%esp), %eax777; X86-NEXT: vbroadcastsd (%eax), %ymm0778; X86-NEXT: retl779;780; X64-LABEL: splat_concat3:781; X64: ## %bb.0:782; X64-NEXT: vbroadcastsd (%rdi), %ymm0783; X64-NEXT: retq784 %1 = load double, ptr %p, align 8785 %2 = insertelement <2 x double> undef, double %1, i32 0786 %3 = insertelement <2 x double> %2, double %1, i32 1787 %4 = shufflevector <2 x double> %3, <2 x double> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1>788 ret <4 x double> %4789}790 791define <4 x double> @splat_concat4(ptr %p) {792; X86-LABEL: splat_concat4:793; X86: ## %bb.0:794; X86-NEXT: movl {{[0-9]+}}(%esp), %eax795; X86-NEXT: vbroadcastsd (%eax), %ymm0796; X86-NEXT: retl797;798; X64-LABEL: splat_concat4:799; X64: ## %bb.0:800; X64-NEXT: vbroadcastsd (%rdi), %ymm0801; X64-NEXT: retq802 %1 = load double, ptr %p, align 8803 %2 = insertelement <2 x double> undef, double %1, i32 0804 %3 = insertelement <2 x double> %2, double %1, i32 1805 %4 = insertelement <2 x double> undef, double %1, i32 0806 %5 = insertelement <2 x double> %2, double %1, i32 1807 %6 = shufflevector <2 x double> %3, <2 x double> %5, <4 x i32> <i32 0, i32 1, i32 2, i32 3>808 ret <4 x double> %6809}810 811; PR34041812define <4 x double> @broadcast_shuffle_1000(ptr %p) {813; X86-LABEL: broadcast_shuffle_1000:814; X86: ## %bb.0:815; X86-NEXT: movl {{[0-9]+}}(%esp), %eax816; X86-NEXT: vbroadcastsd (%eax), %ymm0817; X86-NEXT: retl818;819; X64-LABEL: broadcast_shuffle_1000:820; X64: ## %bb.0:821; X64-NEXT: vbroadcastsd (%rdi), %ymm0822; X64-NEXT: retq823 %1 = load double, ptr %p824 %2 = insertelement <2 x double> undef, double %1, i32 0825 %3 = shufflevector <2 x double> %2, <2 x double> undef, <4 x i32> <i32 1, i32 0, i32 0, i32 0>826 ret <4 x double> %3827}828 829define <4 x double> @broadcast_shuffle1032(ptr %p) {830; X86-LABEL: broadcast_shuffle1032:831; X86: ## %bb.0:832; X86-NEXT: movl {{[0-9]+}}(%esp), %eax833; X86-NEXT: vbroadcastsd (%eax), %ymm0834; X86-NEXT: retl835;836; X64-LABEL: broadcast_shuffle1032:837; X64: ## %bb.0:838; X64-NEXT: vbroadcastsd (%rdi), %ymm0839; X64-NEXT: retq840 %1 = load double, ptr %p841 %2 = insertelement <2 x double> undef, double %1, i32 1842 %3 = insertelement <2 x double> undef, double %1, i32 0843 %4 = shufflevector <2 x double> %2, <2 x double> %3, <4 x i32> <i32 1, i32 0, i32 3, i32 2>844 ret <4 x double> %4845}846 847define void @broadcast_v16i32(ptr %a, ptr %b) {848; X86-LABEL: broadcast_v16i32:849; X86: ## %bb.0:850; X86-NEXT: movl {{[0-9]+}}(%esp), %eax851; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx852; X86-NEXT: vbroadcastss (%ecx), %ymm0853; X86-NEXT: vmovups %ymm0, 32(%eax)854; X86-NEXT: vmovups %ymm0, (%eax)855; X86-NEXT: vzeroupper856; X86-NEXT: retl857;858; X64-LABEL: broadcast_v16i32:859; X64: ## %bb.0:860; X64-NEXT: vbroadcastss (%rdi), %ymm0861; X64-NEXT: vmovups %ymm0, 32(%rsi)862; X64-NEXT: vmovups %ymm0, (%rsi)863; X64-NEXT: vzeroupper864; X64-NEXT: retq865 %1 = load i32, ptr %a, align 4866 %2 = insertelement <8 x i32> undef, i32 %1, i32 0867 %3 = shufflevector <8 x i32> %2, <8 x i32> undef, <8 x i32> zeroinitializer868 %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>869 store <16 x i32> %4, ptr %b, align 4870 ret void871}872 873;874; Broadcast scale factor for xyz vector - slp will have vectorized xy.875;876define double @broadcast_scale_xyz(ptr nocapture readonly, ptr nocapture readonly) nounwind {877; X86-LABEL: broadcast_scale_xyz:878; X86: ## %bb.0:879; X86-NEXT: subl $12, %esp880; X86-NEXT: movl {{[0-9]+}}(%esp), %eax881; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx882; X86-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]883; X86-NEXT: vmulpd (%eax), %xmm0, %xmm1884; X86-NEXT: vmulsd 16(%eax), %xmm0, %xmm0885; X86-NEXT: vshufpd {{.*#+}} xmm2 = xmm1[1,0]886; X86-NEXT: vaddsd %xmm2, %xmm1, %xmm1887; X86-NEXT: vaddsd %xmm1, %xmm0, %xmm0888; X86-NEXT: vmovsd %xmm0, (%esp)889; X86-NEXT: fldl (%esp)890; X86-NEXT: addl $12, %esp891; X86-NEXT: retl892;893; X64-LABEL: broadcast_scale_xyz:894; X64: ## %bb.0:895; X64-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]896; X64-NEXT: vmulpd (%rsi), %xmm0, %xmm1897; X64-NEXT: vmulsd 16(%rsi), %xmm0, %xmm0898; X64-NEXT: vshufpd {{.*#+}} xmm2 = xmm1[1,0]899; X64-NEXT: vaddsd %xmm2, %xmm1, %xmm1900; X64-NEXT: vaddsd %xmm1, %xmm0, %xmm0901; X64-NEXT: retq902 %3 = load <2 x double>, ptr %1, align 8903 %4 = getelementptr inbounds double, ptr %1, i64 2904 %5 = load double, ptr %4, align 8905 %6 = load double, ptr %0, align 8906 %7 = insertelement <2 x double> undef, double %6, i32 0907 %8 = shufflevector <2 x double> %7, <2 x double> undef, <2 x i32> zeroinitializer908 %9 = fmul <2 x double> %3, %8909 %10 = fmul double %5, %6910 %11 = extractelement <2 x double> %9, i32 0911 %12 = extractelement <2 x double> %9, i32 1912 %13 = fadd double %11, %12913 %14 = fadd double %10, %13914 ret double %14915}916 917;918; Broadcast v2f32 non-uniform constant via vmovddup919;920define void @fmul_by_v2f32_broadcast() nounwind {921; X86-LABEL: fmul_by_v2f32_broadcast:922; X86: ## %bb.0:923; X86-NEXT: vmovddup {{.*#+}} xmm0 = [3.1E+1,0.0E+0,3.1E+1,0.0E+0]924; X86-NEXT: ## xmm0 = mem[0,0]925; X86-NEXT: ## implicit-def: $xmm1926; X86-NEXT: .p2align 4927; X86-NEXT: LBB42_1: ## =>This Inner Loop Header: Depth=1928; X86-NEXT: vmovsd {{.*#+}} xmm2 = mem[0],zero929; X86-NEXT: vmulps %xmm0, %xmm2, %xmm2930; X86-NEXT: vmovlps %xmm2, (%eax)931; X86-NEXT: vmulps %xmm0, %xmm1, %xmm1932; X86-NEXT: vmovlps %xmm1, (%eax)933; X86-NEXT: jmp LBB42_1934;935; X64-LABEL: fmul_by_v2f32_broadcast:936; X64: ## %bb.0:937; X64-NEXT: vmovddup {{.*#+}} xmm0 = [3.1E+1,0.0E+0,3.1E+1,0.0E+0]938; X64-NEXT: ## xmm0 = mem[0,0]939; X64-NEXT: ## implicit-def: $xmm1940; X64-NEXT: .p2align 4941; X64-NEXT: LBB42_1: ## =>This Inner Loop Header: Depth=1942; X64-NEXT: vmovsd {{.*#+}} xmm2 = mem[0],zero943; X64-NEXT: vmulps %xmm0, %xmm2, %xmm2944; X64-NEXT: vmovlps %xmm2, (%rax)945; X64-NEXT: vmulps %xmm0, %xmm1, %xmm1946; X64-NEXT: vmovlps %xmm1, (%rax)947; X64-NEXT: jmp LBB42_1948 br label %19491:950 %2 = phi <2 x float> [ undef, %0 ], [ %5, %1 ]951 %3 = load <2 x float>, ptr poison, align 8952 %4 = fmul <2 x float> %3, <float 3.100000e+01, float 0.000000e+00>953 store <2 x float> %4, ptr poison, align 8954 %5 = fmul <2 x float> %2, <float 3.100000e+01, float 0.000000e+00>955 store <2 x float> %5, ptr poison, align 8956 br label %1957}958 959;960; When VBROADCAST replaces an existing load, ensure it still respects lifetime dependencies.961;962define float @broadcast_lifetime() nounwind {963; X86-LABEL: broadcast_lifetime:964; X86: ## %bb.0:965; X86-NEXT: pushl %esi966; X86-NEXT: subl $40, %esp967; X86-NEXT: leal {{[0-9]+}}(%esp), %esi968; X86-NEXT: movl %esi, (%esp)969; X86-NEXT: calll _gfunc970; X86-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero971; X86-NEXT: vmovss %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) ## 4-byte Spill972; X86-NEXT: movl %esi, (%esp)973; X86-NEXT: calll _gfunc974; X86-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero975; X86-NEXT: vsubss {{[-0-9]+}}(%e{{[sb]}}p), %xmm0, %xmm0 ## 4-byte Folded Reload976; X86-NEXT: vmovss %xmm0, {{[0-9]+}}(%esp)977; X86-NEXT: flds {{[0-9]+}}(%esp)978; X86-NEXT: addl $40, %esp979; X86-NEXT: popl %esi980; X86-NEXT: retl981;982; X64-LABEL: broadcast_lifetime:983; X64: ## %bb.0:984; X64-NEXT: subq $40, %rsp985; X64-NEXT: leaq {{[0-9]+}}(%rsp), %rdi986; X64-NEXT: callq _gfunc987; X64-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero988; X64-NEXT: vmovss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 4-byte Spill989; X64-NEXT: leaq {{[0-9]+}}(%rsp), %rdi990; X64-NEXT: callq _gfunc991; X64-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero992; X64-NEXT: vsubss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 ## 4-byte Folded Reload993; X64-NEXT: addq $40, %rsp994; X64-NEXT: retq995 %1 = alloca <4 x float>, align 16996 %2 = alloca <4 x float>, align 16997 998 call void @llvm.lifetime.start.p0(i64 16, ptr %1)999 call void @gfunc(ptr %1)1000 %3 = load <4 x float>, ptr %1, align 161001 call void @llvm.lifetime.end.p0(i64 16, ptr %1)1002 1003 call void @llvm.lifetime.start.p0(i64 16, ptr %2)1004 call void @gfunc(ptr %2)1005 %4 = load <4 x float>, ptr %2, align 161006 call void @llvm.lifetime.end.p0(i64 16, ptr %2)1007 1008 %5 = extractelement <4 x float> %3, i32 11009 %6 = extractelement <4 x float> %4, i32 11010 %7 = fsub float %6, %51011 ret float %71012}1013 1014define <8 x i16> @broadcast_x86_mmx(<1 x i64> %tmp) nounwind {1015; X86-LABEL: broadcast_x86_mmx:1016; X86: ## %bb.0: ## %bb1017; X86-NEXT: vmovddup {{.*#+}} xmm0 = mem[0,0]1018; X86-NEXT: retl1019;1020; X64-LABEL: broadcast_x86_mmx:1021; X64: ## %bb.0: ## %bb1022; X64-NEXT: vmovq %rdi, %xmm01023; X64-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]1024; X64-NEXT: retq1025bb:1026 %tmp1 = bitcast <1 x i64> %tmp to i641027 %tmp2 = insertelement <2 x i64> undef, i64 %tmp1, i32 01028 %tmp3 = bitcast <2 x i64> %tmp2 to <8 x i16>1029 %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>1030 ret <8 x i16> %tmp41031}1032 1033declare void @gfunc(ptr)1034declare void @llvm.lifetime.start.p0(i64, ptr)1035declare void @llvm.lifetime.end.p0(i64, ptr)1036