brintos

brintos / llvm-project-archived public Read only

0
0
Text · 15.5 KiB · 76a95e2 Raw
427 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=CHECK --check-prefix=AVX3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=CHECK --check-prefix=AVX24 5; Check constant loads of every 128-bit and 256-bit vector type6; for size optimization using splat ops available with AVX and AVX2.7 8; There is no AVX broadcast from double to 128-bit vector because movddup has been around since SSE3 (grrr).9define <2 x double> @splat_v2f64(<2 x double> %x) #0 {10; CHECK-LABEL: splat_v2f64:11; CHECK:       # %bb.0:12; CHECK-NEXT:    vmovddup {{.*#+}} xmm1 = [1.0E+0,1.0E+0]13; CHECK-NEXT:    # xmm1 = mem[0,0]14; CHECK-NEXT:    vaddpd %xmm1, %xmm0, %xmm015; CHECK-NEXT:    retq16  %add = fadd <2 x double> %x, <double 1.0, double 1.0>17  ret <2 x double> %add18}19 20define <2 x double> @splat_v2f64_pgso(<2 x double> %x) !prof !14 {21; CHECK-LABEL: splat_v2f64_pgso:22; CHECK:       # %bb.0:23; CHECK-NEXT:    vmovddup {{.*#+}} xmm1 = [1.0E+0,1.0E+0]24; CHECK-NEXT:    # xmm1 = mem[0,0]25; CHECK-NEXT:    vaddpd %xmm1, %xmm0, %xmm026; CHECK-NEXT:    retq27  %add = fadd <2 x double> %x, <double 1.0, double 1.0>28  ret <2 x double> %add29}30 31define <4 x double> @splat_v4f64(<4 x double> %x) #1 {32; CHECK-LABEL: splat_v4f64:33; CHECK:       # %bb.0:34; CHECK-NEXT:    vbroadcastsd {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]35; CHECK-NEXT:    vaddpd %ymm1, %ymm0, %ymm036; CHECK-NEXT:    retq37  %add = fadd <4 x double> %x, <double 1.0, double 1.0, double 1.0, double 1.0>38  ret <4 x double> %add39}40 41define <4 x double> @splat_v4f64_pgso(<4 x double> %x) !prof !14 {42; CHECK-LABEL: splat_v4f64_pgso:43; CHECK:       # %bb.0:44; CHECK-NEXT:    vbroadcastsd {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]45; CHECK-NEXT:    vaddpd %ymm1, %ymm0, %ymm046; CHECK-NEXT:    retq47  %add = fadd <4 x double> %x, <double 1.0, double 1.0, double 1.0, double 1.0>48  ret <4 x double> %add49}50 51define <4 x float> @splat_v4f32(<4 x float> %x) #0 {52; CHECK-LABEL: splat_v4f32:53; CHECK:       # %bb.0:54; CHECK-NEXT:    vbroadcastss {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]55; CHECK-NEXT:    vaddps %xmm1, %xmm0, %xmm056; CHECK-NEXT:    retq57  %add = fadd <4 x float> %x, <float 1.0, float 1.0, float 1.0, float 1.0>58  ret <4 x float> %add59}60 61define <4 x float> @splat_v4f32_pgso(<4 x float> %x) !prof !14 {62; CHECK-LABEL: splat_v4f32_pgso:63; CHECK:       # %bb.0:64; CHECK-NEXT:    vbroadcastss {{.*#+}} xmm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0]65; CHECK-NEXT:    vaddps %xmm1, %xmm0, %xmm066; CHECK-NEXT:    retq67  %add = fadd <4 x float> %x, <float 1.0, float 1.0, float 1.0, float 1.0>68  ret <4 x float> %add69}70 71define <8 x float> @splat_v8f32(<8 x float> %x) #1 {72; CHECK-LABEL: splat_v8f32:73; CHECK:       # %bb.0:74; CHECK-NEXT:    vbroadcastss {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]75; CHECK-NEXT:    vaddps %ymm1, %ymm0, %ymm076; CHECK-NEXT:    retq77  %add = fadd <8 x float> %x, <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>78  ret <8 x float> %add79}80 81define <8 x float> @splat_v8f32_pgso(<8 x float> %x) !prof !14 {82; CHECK-LABEL: splat_v8f32_pgso:83; CHECK:       # %bb.0:84; CHECK-NEXT:    vbroadcastss {{.*#+}} ymm1 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0,1.0E+0]85; CHECK-NEXT:    vaddps %ymm1, %ymm0, %ymm086; CHECK-NEXT:    retq87  %add = fadd <8 x float> %x, <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>88  ret <8 x float> %add89}90 91; AVX can't do integer splats, so fake it: use vmovddup to splat 64-bit value.92; We also generate vmovddup for AVX2 because it's one byte smaller than vpbroadcastq.93define <2 x i64> @splat_v2i64(<2 x i64> %x) #1 {94; AVX-LABEL: splat_v2i64:95; AVX:       # %bb.0:96; AVX-NEXT:    vmovddup {{.*#+}} xmm1 = [2,2]97; AVX-NEXT:    # xmm1 = mem[0,0]98; AVX-NEXT:    vpaddq %xmm1, %xmm0, %xmm099; AVX-NEXT:    retq100;101; AVX2-LABEL: splat_v2i64:102; AVX2:       # %bb.0:103; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [2,2]104; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0105; AVX2-NEXT:    retq106  %add = add <2 x i64> %x, <i64 2, i64 2>107  ret <2 x i64> %add108}109 110define <2 x i64> @splat_v2i64_pgso(<2 x i64> %x) !prof !14 {111; AVX-LABEL: splat_v2i64_pgso:112; AVX:       # %bb.0:113; AVX-NEXT:    vmovddup {{.*#+}} xmm1 = [2,2]114; AVX-NEXT:    # xmm1 = mem[0,0]115; AVX-NEXT:    vpaddq %xmm1, %xmm0, %xmm0116; AVX-NEXT:    retq117;118; AVX2-LABEL: splat_v2i64_pgso:119; AVX2:       # %bb.0:120; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [2,2]121; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0122; AVX2-NEXT:    retq123  %add = add <2 x i64> %x, <i64 2, i64 2>124  ret <2 x i64> %add125}126 127; AVX can't do 256-bit integer ops, so we split this into two 128-bit vectors,128; and then we fake it: use vmovddup to splat 64-bit value.129define <4 x i64> @splat_v4i64(<4 x i64> %x) #0 {130; AVX-LABEL: splat_v4i64:131; AVX:       # %bb.0:132; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1133; AVX-NEXT:    vmovddup {{.*#+}} xmm2 = [2,2]134; AVX-NEXT:    # xmm2 = mem[0,0]135; AVX-NEXT:    vpaddq %xmm2, %xmm1, %xmm1136; AVX-NEXT:    vpaddq %xmm2, %xmm0, %xmm0137; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0138; AVX-NEXT:    retq139;140; AVX2-LABEL: splat_v4i64:141; AVX2:       # %bb.0:142; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [2,2,2,2]143; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0144; AVX2-NEXT:    retq145  %add = add <4 x i64> %x, <i64 2, i64 2, i64 2, i64 2>146  ret <4 x i64> %add147}148 149define <4 x i64> @splat_v4i64_pgso(<4 x i64> %x) !prof !14 {150; AVX-LABEL: splat_v4i64_pgso:151; AVX:       # %bb.0:152; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1153; AVX-NEXT:    vmovddup {{.*#+}} xmm2 = [2,2]154; AVX-NEXT:    # xmm2 = mem[0,0]155; AVX-NEXT:    vpaddq %xmm2, %xmm1, %xmm1156; AVX-NEXT:    vpaddq %xmm2, %xmm0, %xmm0157; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0158; AVX-NEXT:    retq159;160; AVX2-LABEL: splat_v4i64_pgso:161; AVX2:       # %bb.0:162; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [2,2,2,2]163; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0164; AVX2-NEXT:    retq165  %add = add <4 x i64> %x, <i64 2, i64 2, i64 2, i64 2>166  ret <4 x i64> %add167}168 169; AVX can't do integer splats, so fake it: use vbroadcastss to splat 32-bit value.170define <4 x i32> @splat_v4i32(<4 x i32> %x) #1 {171; AVX-LABEL: splat_v4i32:172; AVX:       # %bb.0:173; AVX-NEXT:    vbroadcastss {{.*#+}} xmm1 = [2,2,2,2]174; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0175; AVX-NEXT:    retq176;177; AVX2-LABEL: splat_v4i32:178; AVX2:       # %bb.0:179; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [2,2,2,2]180; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0181; AVX2-NEXT:    retq182  %add = add <4 x i32> %x, <i32 2, i32 2, i32 2, i32 2>183  ret <4 x i32> %add184}185 186define <4 x i32> @splat_v4i32_pgso(<4 x i32> %x) !prof !14 {187; AVX-LABEL: splat_v4i32_pgso:188; AVX:       # %bb.0:189; AVX-NEXT:    vbroadcastss {{.*#+}} xmm1 = [2,2,2,2]190; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0191; AVX-NEXT:    retq192;193; AVX2-LABEL: splat_v4i32_pgso:194; AVX2:       # %bb.0:195; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [2,2,2,2]196; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0197; AVX2-NEXT:    retq198  %add = add <4 x i32> %x, <i32 2, i32 2, i32 2, i32 2>199  ret <4 x i32> %add200}201 202; AVX can't do integer splats, so fake it: use vbroadcastss to splat 32-bit value.203define <8 x i32> @splat_v8i32(<8 x i32> %x) #0 {204; AVX-LABEL: splat_v8i32:205; AVX:       # %bb.0:206; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1207; AVX-NEXT:    vbroadcastss {{.*#+}} xmm2 = [2,2,2,2]208; AVX-NEXT:    vpaddd %xmm2, %xmm1, %xmm1209; AVX-NEXT:    vpaddd %xmm2, %xmm0, %xmm0210; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0211; AVX-NEXT:    retq212;213; AVX2-LABEL: splat_v8i32:214; AVX2:       # %bb.0:215; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [2,2,2,2,2,2,2,2]216; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0217; AVX2-NEXT:    retq218  %add = add <8 x i32> %x, <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>219  ret <8 x i32> %add220}221 222define <8 x i32> @splat_v8i32_pgso(<8 x i32> %x) !prof !14 {223; AVX-LABEL: splat_v8i32_pgso:224; AVX:       # %bb.0:225; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1226; AVX-NEXT:    vbroadcastss {{.*#+}} xmm2 = [2,2,2,2]227; AVX-NEXT:    vpaddd %xmm2, %xmm1, %xmm1228; AVX-NEXT:    vpaddd %xmm2, %xmm0, %xmm0229; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0230; AVX-NEXT:    retq231;232; AVX2-LABEL: splat_v8i32_pgso:233; AVX2:       # %bb.0:234; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [2,2,2,2,2,2,2,2]235; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0236; AVX2-NEXT:    retq237  %add = add <8 x i32> %x, <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>238  ret <8 x i32> %add239}240 241; AVX can't do integer splats, and there's no broadcast fakery for 16-bit. Could use pshuflw, etc?242define <8 x i16> @splat_v8i16(<8 x i16> %x) #1 {243; AVX-LABEL: splat_v8i16:244; AVX:       # %bb.0:245; AVX-NEXT:    vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0246; AVX-NEXT:    retq247;248; AVX2-LABEL: splat_v8i16:249; AVX2:       # %bb.0:250; AVX2-NEXT:    vpbroadcastw {{.*#+}} xmm1 = [2,2,2,2,2,2,2,2]251; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0252; AVX2-NEXT:    retq253  %add = add <8 x i16> %x, <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>254  ret <8 x i16> %add255}256 257define <8 x i16> @splat_v8i16_pgso(<8 x i16> %x) !prof !14 {258; AVX-LABEL: splat_v8i16_pgso:259; AVX:       # %bb.0:260; AVX-NEXT:    vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0261; AVX-NEXT:    retq262;263; AVX2-LABEL: splat_v8i16_pgso:264; AVX2:       # %bb.0:265; AVX2-NEXT:    vpbroadcastw {{.*#+}} xmm1 = [2,2,2,2,2,2,2,2]266; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0267; AVX2-NEXT:    retq268  %add = add <8 x i16> %x, <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>269  ret <8 x i16> %add270}271 272; AVX can't do integer splats, and there's no broadcast fakery for 16-bit. Could use pshuflw, etc?273define <16 x i16> @splat_v16i16(<16 x i16> %x) #0 {274; AVX-LABEL: splat_v16i16:275; AVX:       # %bb.0:276; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1277; AVX-NEXT:    vbroadcastss {{.*#+}} xmm2 = [2,2,2,2,2,2,2,2]278; AVX-NEXT:    vpaddw %xmm2, %xmm1, %xmm1279; AVX-NEXT:    vpaddw %xmm2, %xmm0, %xmm0280; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0281; AVX-NEXT:    retq282;283; AVX2-LABEL: splat_v16i16:284; AVX2:       # %bb.0:285; AVX2-NEXT:    vpbroadcastw {{.*#+}} ymm1 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]286; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0287; AVX2-NEXT:    retq288  %add = add <16 x i16> %x, <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>289  ret <16 x i16> %add290}291 292define <16 x i16> @splat_v16i16_pgso(<16 x i16> %x) !prof !14 {293; AVX-LABEL: splat_v16i16_pgso:294; AVX:       # %bb.0:295; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1296; AVX-NEXT:    vbroadcastss {{.*#+}} xmm2 = [2,2,2,2,2,2,2,2]297; AVX-NEXT:    vpaddw %xmm2, %xmm1, %xmm1298; AVX-NEXT:    vpaddw %xmm2, %xmm0, %xmm0299; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0300; AVX-NEXT:    retq301;302; AVX2-LABEL: splat_v16i16_pgso:303; AVX2:       # %bb.0:304; AVX2-NEXT:    vpbroadcastw {{.*#+}} ymm1 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]305; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0306; AVX2-NEXT:    retq307  %add = add <16 x i16> %x, <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>308  ret <16 x i16> %add309}310 311; AVX can't do integer splats, and there's no broadcast fakery for 8-bit. Could use pshufb, etc?312define <16 x i8> @splat_v16i8(<16 x i8> %x) #1 {313; AVX-LABEL: splat_v16i8:314; AVX:       # %bb.0:315; AVX-NEXT:    vpaddb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0316; AVX-NEXT:    retq317;318; AVX2-LABEL: splat_v16i8:319; AVX2:       # %bb.0:320; AVX2-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]321; AVX2-NEXT:    vpaddb %xmm1, %xmm0, %xmm0322; AVX2-NEXT:    retq323  %add = add <16 x i8> %x, <i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2>324  ret <16 x i8> %add325}326 327define <16 x i8> @splat_v16i8_pgso(<16 x i8> %x) !prof !14 {328; AVX-LABEL: splat_v16i8_pgso:329; AVX:       # %bb.0:330; AVX-NEXT:    vpaddb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0331; AVX-NEXT:    retq332;333; AVX2-LABEL: splat_v16i8_pgso:334; AVX2:       # %bb.0:335; AVX2-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]336; AVX2-NEXT:    vpaddb %xmm1, %xmm0, %xmm0337; AVX2-NEXT:    retq338  %add = add <16 x i8> %x, <i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2>339  ret <16 x i8> %add340}341 342; AVX can't do integer splats, and there's no broadcast fakery for 8-bit. Could use pshufb, etc?343define <32 x i8> @splat_v32i8(<32 x i8> %x) #0 {344; AVX-LABEL: splat_v32i8:345; AVX:       # %bb.0:346; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1347; AVX-NEXT:    vbroadcastss {{.*#+}} xmm2 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]348; AVX-NEXT:    vpaddb %xmm2, %xmm1, %xmm1349; AVX-NEXT:    vpaddb %xmm2, %xmm0, %xmm0350; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0351; AVX-NEXT:    retq352;353; AVX2-LABEL: splat_v32i8:354; AVX2:       # %bb.0:355; AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]356; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0357; AVX2-NEXT:    retq358  %add = add <32 x i8> %x, <i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2>359  ret <32 x i8> %add360}361 362define <32 x i8> @splat_v32i8_pgso(<32 x i8> %x) !prof !14 {363; AVX-LABEL: splat_v32i8_pgso:364; AVX:       # %bb.0:365; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1366; AVX-NEXT:    vbroadcastss {{.*#+}} xmm2 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]367; AVX-NEXT:    vpaddb %xmm2, %xmm1, %xmm1368; AVX-NEXT:    vpaddb %xmm2, %xmm0, %xmm0369; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0370; AVX-NEXT:    retq371;372; AVX2-LABEL: splat_v32i8_pgso:373; AVX2:       # %bb.0:374; AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]375; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0376; AVX2-NEXT:    retq377  %add = add <32 x i8> %x, <i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2>378  ret <32 x i8> %add379}380 381; PR23259: Verify that ISel doesn't crash with a 'fatal error in backend'382; due to a missing AVX pattern to select a v2i64 X86ISD::BROADCAST of a383; loadi64 with multiple uses.384 385@A = common dso_local global <3 x i64> zeroinitializer, align 32386 387define <8 x i64> @pr23259() #1 {388; AVX-LABEL: pr23259:389; AVX:       # %bb.0: # %entry390; AVX-NEXT:    vbroadcastsd {{.*#+}} ymm1 = [1,1,1,1]391; AVX-NEXT:    vblendps {{.*#+}} xmm0 = mem[0,1],xmm1[2,3]392; AVX-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3],mem[4,5,6,7]393; AVX-NEXT:    retq394;395; AVX2-LABEL: pr23259:396; AVX2:       # %bb.0: # %entry397; AVX2-NEXT:    vmovaps A+16(%rip), %xmm0398; AVX2-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1],mem[2,3,4,5,6,7]399; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm1 = [1,1,1,1]400; AVX2-NEXT:    retq401entry:402  %0 = load <4 x i64>, ptr @A, align 32403  %1 = shufflevector <4 x i64> %0, <4 x i64> undef, <3 x i32> <i32 undef, i32 undef, i32 2>404  %shuffle = shufflevector <3 x i64> <i64 1, i64 undef, i64 undef>, <3 x i64> %1, <8 x i32> <i32 5, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>405  ret <8 x i64> %shuffle406}407 408attributes #0 = { nounwind optsize }409attributes #1 = { nounwind minsize }410 411!llvm.module.flags = !{!0}412!0 = !{i32 1, !"ProfileSummary", !1}413!1 = !{!2, !3, !4, !5, !6, !7, !8, !9}414!2 = !{!"ProfileFormat", !"InstrProf"}415!3 = !{!"TotalCount", i64 10000}416!4 = !{!"MaxCount", i64 10}417!5 = !{!"MaxInternalCount", i64 1}418!6 = !{!"MaxFunctionCount", i64 1000}419!7 = !{!"NumCounts", i64 3}420!8 = !{!"NumFunctions", i64 3}421!9 = !{!"DetailedSummary", !10}422!10 = !{!11, !12, !13}423!11 = !{i32 10000, i64 100, i32 1}424!12 = !{i32 999000, i64 100, i32 1}425!13 = !{i32 999999, i64 1, i32 2}426!14 = !{!"function_entry_count", i64 0}427