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