409 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE23; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=SSSE3-SLOW4; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ssse3,fast-hops | FileCheck %s --check-prefix=SSSE3-FAST5; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX1-SLOW6; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx,fast-hops | FileCheck %s --check-prefix=AVX1-FAST7; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX28 9; PR37890 - subvector reduction followed by shuffle reduction10 11define i32 @PR37890_v4i32(<4 x i32> %a) {12; SSE2-LABEL: PR37890_v4i32:13; SSE2: # %bb.0:14; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]15; SSE2-NEXT: paddd %xmm0, %xmm116; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]17; SSE2-NEXT: paddd %xmm1, %xmm018; SSE2-NEXT: movd %xmm0, %eax19; SSE2-NEXT: retq20;21; SSSE3-SLOW-LABEL: PR37890_v4i32:22; SSSE3-SLOW: # %bb.0:23; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]24; SSSE3-SLOW-NEXT: paddd %xmm0, %xmm125; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]26; SSSE3-SLOW-NEXT: paddd %xmm1, %xmm027; SSSE3-SLOW-NEXT: movd %xmm0, %eax28; SSSE3-SLOW-NEXT: retq29;30; SSSE3-FAST-LABEL: PR37890_v4i32:31; SSSE3-FAST: # %bb.0:32; SSSE3-FAST-NEXT: phaddd %xmm0, %xmm033; SSSE3-FAST-NEXT: phaddd %xmm0, %xmm034; SSSE3-FAST-NEXT: movd %xmm0, %eax35; SSSE3-FAST-NEXT: retq36;37; AVX1-SLOW-LABEL: PR37890_v4i32:38; AVX1-SLOW: # %bb.0:39; AVX1-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]40; AVX1-SLOW-NEXT: vpaddd %xmm1, %xmm0, %xmm041; AVX1-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]42; AVX1-SLOW-NEXT: vpaddd %xmm1, %xmm0, %xmm043; AVX1-SLOW-NEXT: vmovd %xmm0, %eax44; AVX1-SLOW-NEXT: retq45;46; AVX1-FAST-LABEL: PR37890_v4i32:47; AVX1-FAST: # %bb.0:48; AVX1-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm049; AVX1-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm050; AVX1-FAST-NEXT: vmovd %xmm0, %eax51; AVX1-FAST-NEXT: retq52;53; AVX2-LABEL: PR37890_v4i32:54; AVX2: # %bb.0:55; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]56; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm057; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]58; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm059; AVX2-NEXT: vmovd %xmm0, %eax60; AVX2-NEXT: retq61 %hi0 = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 2, i32 3>62 %lo0 = shufflevector <4 x i32> %a, <4 x i32> undef, <2 x i32> <i32 0, i32 1>63 %sum0 = add <2 x i32> %lo0, %hi064 %hi1 = shufflevector <2 x i32> %sum0, <2 x i32> undef, <2 x i32> <i32 1, i32 undef>65 %sum1 = add <2 x i32> %sum0, %hi166 %e = extractelement <2 x i32> %sum1, i32 067 ret i32 %e68}69 70define i16 @PR37890_v8i16(<8 x i16> %a) {71; SSE2-LABEL: PR37890_v8i16:72; SSE2: # %bb.0:73; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]74; SSE2-NEXT: paddw %xmm0, %xmm175; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]76; SSE2-NEXT: paddw %xmm1, %xmm077; SSE2-NEXT: movdqa %xmm0, %xmm178; SSE2-NEXT: psrld $16, %xmm179; SSE2-NEXT: paddw %xmm0, %xmm180; SSE2-NEXT: movd %xmm1, %eax81; SSE2-NEXT: # kill: def $ax killed $ax killed $eax82; SSE2-NEXT: retq83;84; SSSE3-SLOW-LABEL: PR37890_v8i16:85; SSSE3-SLOW: # %bb.0:86; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]87; SSSE3-SLOW-NEXT: paddw %xmm0, %xmm188; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]89; SSSE3-SLOW-NEXT: paddw %xmm1, %xmm090; SSSE3-SLOW-NEXT: movdqa %xmm0, %xmm191; SSSE3-SLOW-NEXT: psrld $16, %xmm192; SSSE3-SLOW-NEXT: paddw %xmm0, %xmm193; SSSE3-SLOW-NEXT: movd %xmm1, %eax94; SSSE3-SLOW-NEXT: # kill: def $ax killed $ax killed $eax95; SSSE3-SLOW-NEXT: retq96;97; SSSE3-FAST-LABEL: PR37890_v8i16:98; SSSE3-FAST: # %bb.0:99; SSSE3-FAST-NEXT: phaddw %xmm0, %xmm0100; SSSE3-FAST-NEXT: phaddw %xmm0, %xmm0101; SSSE3-FAST-NEXT: phaddw %xmm0, %xmm0102; SSSE3-FAST-NEXT: movd %xmm0, %eax103; SSSE3-FAST-NEXT: # kill: def $ax killed $ax killed $eax104; SSSE3-FAST-NEXT: retq105;106; AVX1-SLOW-LABEL: PR37890_v8i16:107; AVX1-SLOW: # %bb.0:108; AVX1-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]109; AVX1-SLOW-NEXT: vpaddw %xmm1, %xmm0, %xmm0110; AVX1-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]111; AVX1-SLOW-NEXT: vpaddw %xmm1, %xmm0, %xmm0112; AVX1-SLOW-NEXT: vpsrld $16, %xmm0, %xmm1113; AVX1-SLOW-NEXT: vpaddw %xmm1, %xmm0, %xmm0114; AVX1-SLOW-NEXT: vmovd %xmm0, %eax115; AVX1-SLOW-NEXT: # kill: def $ax killed $ax killed $eax116; AVX1-SLOW-NEXT: retq117;118; AVX1-FAST-LABEL: PR37890_v8i16:119; AVX1-FAST: # %bb.0:120; AVX1-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm0121; AVX1-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm0122; AVX1-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm0123; AVX1-FAST-NEXT: vmovd %xmm0, %eax124; AVX1-FAST-NEXT: # kill: def $ax killed $ax killed $eax125; AVX1-FAST-NEXT: retq126;127; AVX2-LABEL: PR37890_v8i16:128; AVX2: # %bb.0:129; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]130; AVX2-NEXT: vpaddw %xmm1, %xmm0, %xmm0131; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]132; AVX2-NEXT: vpaddw %xmm1, %xmm0, %xmm0133; AVX2-NEXT: vpsrld $16, %xmm0, %xmm1134; AVX2-NEXT: vpaddw %xmm1, %xmm0, %xmm0135; AVX2-NEXT: vmovd %xmm0, %eax136; AVX2-NEXT: # kill: def $ax killed $ax killed $eax137; AVX2-NEXT: retq138 %hi0 = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>139 %lo0 = shufflevector <8 x i16> %a, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>140 %sum0 = add <4 x i16> %lo0, %hi0141 %hi1 = shufflevector <4 x i16> %sum0, <4 x i16> undef, <2 x i32> <i32 2, i32 3>142 %lo1 = shufflevector <4 x i16> %sum0, <4 x i16> undef, <2 x i32> <i32 0, i32 1>143 %sum1 = add <2 x i16> %lo1, %hi1144 %hi2 = shufflevector <2 x i16> %sum1, <2 x i16> undef, <2 x i32> <i32 1, i32 undef>145 %sum2 = add <2 x i16> %sum1, %hi2146 %e = extractelement <2 x i16> %sum2, i32 0147 ret i16 %e148}149 150define i32 @PR37890_v8i32(<8 x i32> %a) {151; SSE2-LABEL: PR37890_v8i32:152; SSE2: # %bb.0:153; SSE2-NEXT: paddd %xmm1, %xmm0154; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]155; SSE2-NEXT: paddd %xmm0, %xmm1156; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]157; SSE2-NEXT: paddd %xmm1, %xmm0158; SSE2-NEXT: movd %xmm0, %eax159; SSE2-NEXT: retq160;161; SSSE3-SLOW-LABEL: PR37890_v8i32:162; SSSE3-SLOW: # %bb.0:163; SSSE3-SLOW-NEXT: paddd %xmm1, %xmm0164; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]165; SSSE3-SLOW-NEXT: paddd %xmm0, %xmm1166; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]167; SSSE3-SLOW-NEXT: paddd %xmm1, %xmm0168; SSSE3-SLOW-NEXT: movd %xmm0, %eax169; SSSE3-SLOW-NEXT: retq170;171; SSSE3-FAST-LABEL: PR37890_v8i32:172; SSSE3-FAST: # %bb.0:173; SSSE3-FAST-NEXT: paddd %xmm1, %xmm0174; SSSE3-FAST-NEXT: phaddd %xmm0, %xmm0175; SSSE3-FAST-NEXT: phaddd %xmm0, %xmm0176; SSSE3-FAST-NEXT: movd %xmm0, %eax177; SSSE3-FAST-NEXT: retq178;179; AVX1-SLOW-LABEL: PR37890_v8i32:180; AVX1-SLOW: # %bb.0:181; AVX1-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm1182; AVX1-SLOW-NEXT: vpaddd %xmm1, %xmm0, %xmm0183; AVX1-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]184; AVX1-SLOW-NEXT: vpaddd %xmm1, %xmm0, %xmm0185; AVX1-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]186; AVX1-SLOW-NEXT: vpaddd %xmm1, %xmm0, %xmm0187; AVX1-SLOW-NEXT: vmovd %xmm0, %eax188; AVX1-SLOW-NEXT: vzeroupper189; AVX1-SLOW-NEXT: retq190;191; AVX1-FAST-LABEL: PR37890_v8i32:192; AVX1-FAST: # %bb.0:193; AVX1-FAST-NEXT: vextractf128 $1, %ymm0, %xmm1194; AVX1-FAST-NEXT: vphaddd %xmm0, %xmm1, %xmm0195; AVX1-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0196; AVX1-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0197; AVX1-FAST-NEXT: vmovd %xmm0, %eax198; AVX1-FAST-NEXT: vzeroupper199; AVX1-FAST-NEXT: retq200;201; AVX2-LABEL: PR37890_v8i32:202; AVX2: # %bb.0:203; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1204; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0205; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]206; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0207; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]208; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0209; AVX2-NEXT: vmovd %xmm0, %eax210; AVX2-NEXT: vzeroupper211; AVX2-NEXT: retq212 %hi0 = shufflevector <8 x i32> %a, <8 x i32> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>213 %lo0 = shufflevector <8 x i32> %a, <8 x i32> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>214 %sum0 = add <4 x i32> %lo0, %hi0215 %hi1 = shufflevector <4 x i32> %sum0, <4 x i32> undef, <2 x i32> <i32 2, i32 3>216 %lo1 = shufflevector <4 x i32> %sum0, <4 x i32> undef, <2 x i32> <i32 0, i32 1>217 %sum1 = add <2 x i32> %lo1, %hi1218 %hi2 = shufflevector <2 x i32> %sum1, <2 x i32> undef, <2 x i32> <i32 1, i32 undef>219 %sum2 = add <2 x i32> %sum1, %hi2220 %e = extractelement <2 x i32> %sum2, i32 0221 ret i32 %e222}223 224define i16 @PR37890_v16i16(<16 x i16> %a) {225; SSE2-LABEL: PR37890_v16i16:226; SSE2: # %bb.0:227; SSE2-NEXT: paddw %xmm1, %xmm0228; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]229; SSE2-NEXT: paddw %xmm0, %xmm1230; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]231; SSE2-NEXT: paddw %xmm1, %xmm0232; SSE2-NEXT: movdqa %xmm0, %xmm1233; SSE2-NEXT: psrld $16, %xmm1234; SSE2-NEXT: paddw %xmm0, %xmm1235; SSE2-NEXT: movd %xmm1, %eax236; SSE2-NEXT: # kill: def $ax killed $ax killed $eax237; SSE2-NEXT: retq238;239; SSSE3-SLOW-LABEL: PR37890_v16i16:240; SSSE3-SLOW: # %bb.0:241; SSSE3-SLOW-NEXT: paddw %xmm1, %xmm0242; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]243; SSSE3-SLOW-NEXT: paddw %xmm0, %xmm1244; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]245; SSSE3-SLOW-NEXT: paddw %xmm1, %xmm0246; SSSE3-SLOW-NEXT: movdqa %xmm0, %xmm1247; SSSE3-SLOW-NEXT: psrld $16, %xmm1248; SSSE3-SLOW-NEXT: paddw %xmm0, %xmm1249; SSSE3-SLOW-NEXT: movd %xmm1, %eax250; SSSE3-SLOW-NEXT: # kill: def $ax killed $ax killed $eax251; SSSE3-SLOW-NEXT: retq252;253; SSSE3-FAST-LABEL: PR37890_v16i16:254; SSSE3-FAST: # %bb.0:255; SSSE3-FAST-NEXT: paddw %xmm1, %xmm0256; SSSE3-FAST-NEXT: phaddw %xmm0, %xmm0257; SSSE3-FAST-NEXT: phaddw %xmm0, %xmm0258; SSSE3-FAST-NEXT: phaddw %xmm0, %xmm0259; SSSE3-FAST-NEXT: movd %xmm0, %eax260; SSSE3-FAST-NEXT: # kill: def $ax killed $ax killed $eax261; SSSE3-FAST-NEXT: retq262;263; AVX1-SLOW-LABEL: PR37890_v16i16:264; AVX1-SLOW: # %bb.0:265; AVX1-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm1266; AVX1-SLOW-NEXT: vpaddw %xmm1, %xmm0, %xmm0267; AVX1-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]268; AVX1-SLOW-NEXT: vpaddw %xmm1, %xmm0, %xmm0269; AVX1-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]270; AVX1-SLOW-NEXT: vpaddw %xmm1, %xmm0, %xmm0271; AVX1-SLOW-NEXT: vpsrld $16, %xmm0, %xmm1272; AVX1-SLOW-NEXT: vpaddw %xmm1, %xmm0, %xmm0273; AVX1-SLOW-NEXT: vmovd %xmm0, %eax274; AVX1-SLOW-NEXT: # kill: def $ax killed $ax killed $eax275; AVX1-SLOW-NEXT: vzeroupper276; AVX1-SLOW-NEXT: retq277;278; AVX1-FAST-LABEL: PR37890_v16i16:279; AVX1-FAST: # %bb.0:280; AVX1-FAST-NEXT: vextractf128 $1, %ymm0, %xmm1281; AVX1-FAST-NEXT: vphaddw %xmm0, %xmm1, %xmm0282; AVX1-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm0283; AVX1-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm0284; AVX1-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm0285; AVX1-FAST-NEXT: vmovd %xmm0, %eax286; AVX1-FAST-NEXT: # kill: def $ax killed $ax killed $eax287; AVX1-FAST-NEXT: vzeroupper288; AVX1-FAST-NEXT: retq289;290; AVX2-LABEL: PR37890_v16i16:291; AVX2: # %bb.0:292; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1293; AVX2-NEXT: vpaddw %xmm1, %xmm0, %xmm0294; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]295; AVX2-NEXT: vpaddw %xmm1, %xmm0, %xmm0296; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]297; AVX2-NEXT: vpaddw %xmm1, %xmm0, %xmm0298; AVX2-NEXT: vpsrld $16, %xmm0, %xmm1299; AVX2-NEXT: vpaddw %xmm1, %xmm0, %xmm0300; AVX2-NEXT: vmovd %xmm0, %eax301; AVX2-NEXT: # kill: def $ax killed $ax killed $eax302; AVX2-NEXT: vzeroupper303; AVX2-NEXT: retq304 %hi0 = shufflevector <16 x i16> %a, <16 x i16> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>305 %lo0 = shufflevector <16 x i16> %a, <16 x i16> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>306 %sum0 = add <8 x i16> %lo0, %hi0307 %hi1 = shufflevector <8 x i16> %sum0, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>308 %lo1 = shufflevector <8 x i16> %sum0, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>309 %sum1 = add <4 x i16> %lo1, %hi1310 %hi2 = shufflevector <4 x i16> %sum1, <4 x i16> undef, <2 x i32> <i32 2, i32 3>311 %lo2 = shufflevector <4 x i16> %sum1, <4 x i16> undef, <2 x i32> <i32 0, i32 1>312 %sum2 = add <2 x i16> %lo2, %hi2313 %hi3 = shufflevector <2 x i16> %sum2, <2 x i16> undef, <2 x i32> <i32 1, i32 undef>314 %sum3 = add <2 x i16> %sum2, %hi3315 %e = extractelement <2 x i16> %sum3, i32 0316 ret i16 %e317}318 319define i32 @PR37890_v16i32(<16 x i32> %a) {320; SSE2-LABEL: PR37890_v16i32:321; SSE2: # %bb.0:322; SSE2-NEXT: paddd %xmm3, %xmm1323; SSE2-NEXT: paddd %xmm2, %xmm0324; SSE2-NEXT: paddd %xmm1, %xmm0325; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]326; SSE2-NEXT: paddd %xmm0, %xmm1327; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]328; SSE2-NEXT: paddd %xmm1, %xmm0329; SSE2-NEXT: movd %xmm0, %eax330; SSE2-NEXT: retq331;332; SSSE3-SLOW-LABEL: PR37890_v16i32:333; SSSE3-SLOW: # %bb.0:334; SSSE3-SLOW-NEXT: paddd %xmm3, %xmm1335; SSSE3-SLOW-NEXT: paddd %xmm2, %xmm0336; SSSE3-SLOW-NEXT: paddd %xmm1, %xmm0337; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]338; SSSE3-SLOW-NEXT: paddd %xmm0, %xmm1339; SSSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]340; SSSE3-SLOW-NEXT: paddd %xmm1, %xmm0341; SSSE3-SLOW-NEXT: movd %xmm0, %eax342; SSSE3-SLOW-NEXT: retq343;344; SSSE3-FAST-LABEL: PR37890_v16i32:345; SSSE3-FAST: # %bb.0:346; SSSE3-FAST-NEXT: paddd %xmm3, %xmm1347; SSSE3-FAST-NEXT: paddd %xmm2, %xmm0348; SSSE3-FAST-NEXT: paddd %xmm1, %xmm0349; SSSE3-FAST-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]350; SSSE3-FAST-NEXT: paddd %xmm0, %xmm1351; SSSE3-FAST-NEXT: phaddd %xmm1, %xmm1352; SSSE3-FAST-NEXT: movd %xmm1, %eax353; SSSE3-FAST-NEXT: retq354;355; AVX1-SLOW-LABEL: PR37890_v16i32:356; AVX1-SLOW: # %bb.0:357; AVX1-SLOW-NEXT: vextractf128 $1, %ymm1, %xmm2358; AVX1-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm3359; AVX1-SLOW-NEXT: vpaddd %xmm2, %xmm3, %xmm2360; AVX1-SLOW-NEXT: vpaddd %xmm1, %xmm0, %xmm0361; AVX1-SLOW-NEXT: vpaddd %xmm2, %xmm0, %xmm0362; AVX1-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]363; AVX1-SLOW-NEXT: vpaddd %xmm1, %xmm0, %xmm0364; AVX1-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]365; AVX1-SLOW-NEXT: vpaddd %xmm1, %xmm0, %xmm0366; AVX1-SLOW-NEXT: vmovd %xmm0, %eax367; AVX1-SLOW-NEXT: vzeroupper368; AVX1-SLOW-NEXT: retq369;370; AVX1-FAST-LABEL: PR37890_v16i32:371; AVX1-FAST: # %bb.0:372; AVX1-FAST-NEXT: vpaddd %xmm1, %xmm0, %xmm2373; AVX1-FAST-NEXT: vextractf128 $1, %ymm1, %xmm1374; AVX1-FAST-NEXT: vextractf128 $1, %ymm0, %xmm0375; AVX1-FAST-NEXT: vpaddd %xmm1, %xmm0, %xmm0376; AVX1-FAST-NEXT: vphaddd %xmm2, %xmm0, %xmm0377; AVX1-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0378; AVX1-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0379; AVX1-FAST-NEXT: vmovd %xmm0, %eax380; AVX1-FAST-NEXT: vzeroupper381; AVX1-FAST-NEXT: retq382;383; AVX2-LABEL: PR37890_v16i32:384; AVX2: # %bb.0:385; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0386; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1387; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0388; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]389; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0390; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]391; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0392; AVX2-NEXT: vmovd %xmm0, %eax393; AVX2-NEXT: vzeroupper394; AVX2-NEXT: retq395 %hi0 = shufflevector <16 x i32> %a, <16 x i32> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>396 %lo0 = shufflevector <16 x i32> %a, <16 x i32> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>397 %sum0 = add <8 x i32> %lo0, %hi0398 %hi1 = shufflevector <8 x i32> %sum0, <8 x i32> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>399 %lo1 = shufflevector <8 x i32> %sum0, <8 x i32> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>400 %sum1 = add <4 x i32> %lo1, %hi1401 %hi2 = shufflevector <4 x i32> %sum1, <4 x i32> undef, <2 x i32> <i32 2, i32 3>402 %lo2 = shufflevector <4 x i32> %sum1, <4 x i32> undef, <2 x i32> <i32 0, i32 1>403 %sum2 = add <2 x i32> %lo2, %hi2404 %hi3 = shufflevector <2 x i32> %sum2, <2 x i32> undef, <2 x i32> <i32 1, i32 undef>405 %sum3 = add <2 x i32> %sum2, %hi3406 %e = extractelement <2 x i32> %sum3, i32 0407 ret i32 %e408}409