348 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 float @PR37890_v4f32(<4 x float> %a) {12; SSE2-LABEL: PR37890_v4f32:13; SSE2: # %bb.0:14; SSE2-NEXT: movaps %xmm0, %xmm115; SSE2-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]16; SSE2-NEXT: addps %xmm1, %xmm017; SSE2-NEXT: movaps %xmm0, %xmm118; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1],xmm0[1,1]19; SSE2-NEXT: addss %xmm1, %xmm020; SSE2-NEXT: retq21;22; SSSE3-SLOW-LABEL: PR37890_v4f32:23; SSSE3-SLOW: # %bb.0:24; SSSE3-SLOW-NEXT: movaps %xmm0, %xmm125; SSSE3-SLOW-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]26; SSSE3-SLOW-NEXT: addps %xmm1, %xmm027; SSSE3-SLOW-NEXT: movshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]28; SSSE3-SLOW-NEXT: addss %xmm1, %xmm029; SSSE3-SLOW-NEXT: retq30;31; SSSE3-FAST-LABEL: PR37890_v4f32:32; SSSE3-FAST: # %bb.0:33; SSSE3-FAST-NEXT: haddps %xmm0, %xmm034; SSSE3-FAST-NEXT: haddps %xmm0, %xmm035; SSSE3-FAST-NEXT: retq36;37; AVX1-SLOW-LABEL: PR37890_v4f32:38; AVX1-SLOW: # %bb.0:39; AVX1-SLOW-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]40; AVX1-SLOW-NEXT: vaddps %xmm1, %xmm0, %xmm041; AVX1-SLOW-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]42; AVX1-SLOW-NEXT: vaddss %xmm1, %xmm0, %xmm043; AVX1-SLOW-NEXT: retq44;45; AVX1-FAST-LABEL: PR37890_v4f32:46; AVX1-FAST: # %bb.0:47; AVX1-FAST-NEXT: vhaddps %xmm0, %xmm0, %xmm048; AVX1-FAST-NEXT: vhaddps %xmm0, %xmm0, %xmm049; AVX1-FAST-NEXT: retq50;51; AVX2-LABEL: PR37890_v4f32:52; AVX2: # %bb.0:53; AVX2-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]54; AVX2-NEXT: vaddps %xmm1, %xmm0, %xmm055; AVX2-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]56; AVX2-NEXT: vaddss %xmm1, %xmm0, %xmm057; AVX2-NEXT: retq58 %hi0 = shufflevector <4 x float> %a, <4 x float> undef, <2 x i32> <i32 2, i32 3>59 %lo0 = shufflevector <4 x float> %a, <4 x float> undef, <2 x i32> <i32 0, i32 1>60 %sum0 = fadd fast <2 x float> %lo0, %hi061 %hi1 = shufflevector <2 x float> %sum0, <2 x float> undef, <2 x i32> <i32 1, i32 undef>62 %sum1 = fadd fast <2 x float> %sum0, %hi163 %e = extractelement <2 x float> %sum1, i32 064 ret float %e65}66 67define double @PR37890_v4f64(<4 x double> %a) {68; SSE2-LABEL: PR37890_v4f64:69; SSE2: # %bb.0:70; SSE2-NEXT: addpd %xmm1, %xmm071; SSE2-NEXT: movapd %xmm0, %xmm172; SSE2-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]73; SSE2-NEXT: addsd %xmm1, %xmm074; SSE2-NEXT: retq75;76; SSSE3-SLOW-LABEL: PR37890_v4f64:77; SSSE3-SLOW: # %bb.0:78; SSSE3-SLOW-NEXT: addpd %xmm1, %xmm079; SSSE3-SLOW-NEXT: movapd %xmm0, %xmm180; SSSE3-SLOW-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]81; SSSE3-SLOW-NEXT: addsd %xmm1, %xmm082; SSSE3-SLOW-NEXT: retq83;84; SSSE3-FAST-LABEL: PR37890_v4f64:85; SSSE3-FAST: # %bb.0:86; SSSE3-FAST-NEXT: addpd %xmm1, %xmm087; SSSE3-FAST-NEXT: haddpd %xmm0, %xmm088; SSSE3-FAST-NEXT: retq89;90; AVX1-SLOW-LABEL: PR37890_v4f64:91; AVX1-SLOW: # %bb.0:92; AVX1-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm193; AVX1-SLOW-NEXT: vaddpd %xmm1, %xmm0, %xmm094; AVX1-SLOW-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]95; AVX1-SLOW-NEXT: vaddsd %xmm1, %xmm0, %xmm096; AVX1-SLOW-NEXT: vzeroupper97; AVX1-SLOW-NEXT: retq98;99; AVX1-FAST-LABEL: PR37890_v4f64:100; AVX1-FAST: # %bb.0:101; AVX1-FAST-NEXT: vextractf128 $1, %ymm0, %xmm1102; AVX1-FAST-NEXT: vhaddpd %xmm0, %xmm1, %xmm0103; AVX1-FAST-NEXT: vhaddpd %xmm0, %xmm0, %xmm0104; AVX1-FAST-NEXT: vzeroupper105; AVX1-FAST-NEXT: retq106;107; AVX2-LABEL: PR37890_v4f64:108; AVX2: # %bb.0:109; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1110; AVX2-NEXT: vaddpd %xmm1, %xmm0, %xmm0111; AVX2-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]112; AVX2-NEXT: vaddsd %xmm1, %xmm0, %xmm0113; AVX2-NEXT: vzeroupper114; AVX2-NEXT: retq115 %hi0 = shufflevector <4 x double> %a, <4 x double> undef, <2 x i32> <i32 2, i32 3>116 %lo0 = shufflevector <4 x double> %a, <4 x double> undef, <2 x i32> <i32 0, i32 1>117 %sum0 = fadd fast <2 x double> %lo0, %hi0118 %hi1 = shufflevector <2 x double> %sum0, <2 x double> undef, <2 x i32> <i32 1, i32 undef>119 %sum1 = fadd fast <2 x double> %sum0, %hi1120 %e = extractelement <2 x double> %sum1, i32 0121 ret double %e122}123 124define float @PR37890_v8f32(<8 x float> %a) {125; SSE2-LABEL: PR37890_v8f32:126; SSE2: # %bb.0:127; SSE2-NEXT: addps %xmm1, %xmm0128; SSE2-NEXT: movaps %xmm0, %xmm1129; SSE2-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]130; SSE2-NEXT: addps %xmm1, %xmm0131; SSE2-NEXT: movaps %xmm0, %xmm1132; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1],xmm0[1,1]133; SSE2-NEXT: addss %xmm1, %xmm0134; SSE2-NEXT: retq135;136; SSSE3-SLOW-LABEL: PR37890_v8f32:137; SSSE3-SLOW: # %bb.0:138; SSSE3-SLOW-NEXT: addps %xmm1, %xmm0139; SSSE3-SLOW-NEXT: movaps %xmm0, %xmm1140; SSSE3-SLOW-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]141; SSSE3-SLOW-NEXT: addps %xmm1, %xmm0142; SSSE3-SLOW-NEXT: movshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]143; SSSE3-SLOW-NEXT: addss %xmm1, %xmm0144; SSSE3-SLOW-NEXT: retq145;146; SSSE3-FAST-LABEL: PR37890_v8f32:147; SSSE3-FAST: # %bb.0:148; SSSE3-FAST-NEXT: addps %xmm1, %xmm0149; SSSE3-FAST-NEXT: haddps %xmm0, %xmm0150; SSSE3-FAST-NEXT: haddps %xmm0, %xmm0151; SSSE3-FAST-NEXT: retq152;153; AVX1-SLOW-LABEL: PR37890_v8f32:154; AVX1-SLOW: # %bb.0:155; AVX1-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm1156; AVX1-SLOW-NEXT: vaddps %xmm1, %xmm0, %xmm0157; AVX1-SLOW-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]158; AVX1-SLOW-NEXT: vaddps %xmm1, %xmm0, %xmm0159; AVX1-SLOW-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]160; AVX1-SLOW-NEXT: vaddss %xmm1, %xmm0, %xmm0161; AVX1-SLOW-NEXT: vzeroupper162; AVX1-SLOW-NEXT: retq163;164; AVX1-FAST-LABEL: PR37890_v8f32:165; AVX1-FAST: # %bb.0:166; AVX1-FAST-NEXT: vextractf128 $1, %ymm0, %xmm1167; AVX1-FAST-NEXT: vhaddps %xmm0, %xmm1, %xmm0168; AVX1-FAST-NEXT: vhaddps %xmm0, %xmm0, %xmm0169; AVX1-FAST-NEXT: vhaddps %xmm0, %xmm0, %xmm0170; AVX1-FAST-NEXT: vzeroupper171; AVX1-FAST-NEXT: retq172;173; AVX2-LABEL: PR37890_v8f32:174; AVX2: # %bb.0:175; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1176; AVX2-NEXT: vaddps %xmm1, %xmm0, %xmm0177; AVX2-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]178; AVX2-NEXT: vaddps %xmm1, %xmm0, %xmm0179; AVX2-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]180; AVX2-NEXT: vaddss %xmm1, %xmm0, %xmm0181; AVX2-NEXT: vzeroupper182; AVX2-NEXT: retq183 %hi0 = shufflevector <8 x float> %a, <8 x float> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>184 %lo0 = shufflevector <8 x float> %a, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>185 %sum0 = fadd fast <4 x float> %lo0, %hi0186 %hi1 = shufflevector <4 x float> %sum0, <4 x float> undef, <2 x i32> <i32 2, i32 3>187 %lo1 = shufflevector <4 x float> %sum0, <4 x float> undef, <2 x i32> <i32 0, i32 1>188 %sum1 = fadd fast <2 x float> %lo1, %hi1189 %hi2 = shufflevector <2 x float> %sum1, <2 x float> undef, <2 x i32> <i32 1, i32 undef>190 %sum2 = fadd fast <2 x float> %sum1, %hi2191 %e = extractelement <2 x float> %sum2, i32 0192 ret float %e193}194 195define double @PR37890_v8f64(<8 x double> %a) {196; SSE2-LABEL: PR37890_v8f64:197; SSE2: # %bb.0:198; SSE2-NEXT: addpd %xmm3, %xmm1199; SSE2-NEXT: addpd %xmm2, %xmm0200; SSE2-NEXT: addpd %xmm1, %xmm0201; SSE2-NEXT: movapd %xmm0, %xmm1202; SSE2-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]203; SSE2-NEXT: addsd %xmm1, %xmm0204; SSE2-NEXT: retq205;206; SSSE3-SLOW-LABEL: PR37890_v8f64:207; SSSE3-SLOW: # %bb.0:208; SSSE3-SLOW-NEXT: addpd %xmm3, %xmm1209; SSSE3-SLOW-NEXT: addpd %xmm2, %xmm0210; SSSE3-SLOW-NEXT: addpd %xmm1, %xmm0211; SSSE3-SLOW-NEXT: movapd %xmm0, %xmm1212; SSSE3-SLOW-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]213; SSSE3-SLOW-NEXT: addsd %xmm1, %xmm0214; SSSE3-SLOW-NEXT: retq215;216; SSSE3-FAST-LABEL: PR37890_v8f64:217; SSSE3-FAST: # %bb.0:218; SSSE3-FAST-NEXT: addpd %xmm3, %xmm1219; SSSE3-FAST-NEXT: addpd %xmm2, %xmm0220; SSSE3-FAST-NEXT: addpd %xmm1, %xmm0221; SSSE3-FAST-NEXT: haddpd %xmm0, %xmm0222; SSSE3-FAST-NEXT: retq223;224; AVX1-SLOW-LABEL: PR37890_v8f64:225; AVX1-SLOW: # %bb.0:226; AVX1-SLOW-NEXT: vaddpd %ymm1, %ymm0, %ymm0227; AVX1-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm1228; AVX1-SLOW-NEXT: vaddpd %xmm1, %xmm0, %xmm0229; AVX1-SLOW-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]230; AVX1-SLOW-NEXT: vaddsd %xmm1, %xmm0, %xmm0231; AVX1-SLOW-NEXT: vzeroupper232; AVX1-SLOW-NEXT: retq233;234; AVX1-FAST-LABEL: PR37890_v8f64:235; AVX1-FAST: # %bb.0:236; AVX1-FAST-NEXT: vaddpd %ymm1, %ymm0, %ymm0237; AVX1-FAST-NEXT: vextractf128 $1, %ymm0, %xmm1238; AVX1-FAST-NEXT: vhaddpd %xmm0, %xmm1, %xmm0239; AVX1-FAST-NEXT: vhaddpd %xmm0, %xmm0, %xmm0240; AVX1-FAST-NEXT: vzeroupper241; AVX1-FAST-NEXT: retq242;243; AVX2-LABEL: PR37890_v8f64:244; AVX2: # %bb.0:245; AVX2-NEXT: vaddpd %ymm1, %ymm0, %ymm0246; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1247; AVX2-NEXT: vaddpd %xmm1, %xmm0, %xmm0248; AVX2-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]249; AVX2-NEXT: vaddsd %xmm1, %xmm0, %xmm0250; AVX2-NEXT: vzeroupper251; AVX2-NEXT: retq252 %hi0 = shufflevector <8 x double> %a, <8 x double> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>253 %lo0 = shufflevector <8 x double> %a, <8 x double> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>254 %sum0 = fadd fast <4 x double> %lo0, %hi0255 %hi1 = shufflevector <4 x double> %sum0, <4 x double> undef, <2 x i32> <i32 2, i32 3>256 %lo1 = shufflevector <4 x double> %sum0, <4 x double> undef, <2 x i32> <i32 0, i32 1>257 %sum1 = fadd fast <2 x double> %lo1, %hi1258 %hi2 = shufflevector <2 x double> %sum1, <2 x double> undef, <2 x i32> <i32 1, i32 undef>259 %sum2 = fadd fast <2 x double> %sum1, %hi2260 %e = extractelement <2 x double> %sum2, i32 0261 ret double %e262}263 264define float @PR37890_v16f32(<16 x float> %a) {265; SSE2-LABEL: PR37890_v16f32:266; SSE2: # %bb.0:267; SSE2-NEXT: addps %xmm3, %xmm1268; SSE2-NEXT: addps %xmm2, %xmm0269; SSE2-NEXT: addps %xmm1, %xmm0270; SSE2-NEXT: movaps %xmm0, %xmm1271; SSE2-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]272; SSE2-NEXT: addps %xmm1, %xmm0273; SSE2-NEXT: movaps %xmm0, %xmm1274; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1],xmm0[1,1]275; SSE2-NEXT: addss %xmm1, %xmm0276; SSE2-NEXT: retq277;278; SSSE3-SLOW-LABEL: PR37890_v16f32:279; SSSE3-SLOW: # %bb.0:280; SSSE3-SLOW-NEXT: addps %xmm3, %xmm1281; SSSE3-SLOW-NEXT: addps %xmm2, %xmm0282; SSSE3-SLOW-NEXT: addps %xmm1, %xmm0283; SSSE3-SLOW-NEXT: movaps %xmm0, %xmm1284; SSSE3-SLOW-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]285; SSSE3-SLOW-NEXT: addps %xmm1, %xmm0286; SSSE3-SLOW-NEXT: movshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]287; SSSE3-SLOW-NEXT: addss %xmm1, %xmm0288; SSSE3-SLOW-NEXT: retq289;290; SSSE3-FAST-LABEL: PR37890_v16f32:291; SSSE3-FAST: # %bb.0:292; SSSE3-FAST-NEXT: addps %xmm3, %xmm1293; SSSE3-FAST-NEXT: addps %xmm2, %xmm0294; SSSE3-FAST-NEXT: addps %xmm1, %xmm0295; SSSE3-FAST-NEXT: movaps %xmm0, %xmm1296; SSSE3-FAST-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]297; SSSE3-FAST-NEXT: addps %xmm1, %xmm0298; SSSE3-FAST-NEXT: haddps %xmm0, %xmm0299; SSSE3-FAST-NEXT: retq300;301; AVX1-SLOW-LABEL: PR37890_v16f32:302; AVX1-SLOW: # %bb.0:303; AVX1-SLOW-NEXT: vaddps %ymm1, %ymm0, %ymm0304; AVX1-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm1305; AVX1-SLOW-NEXT: vaddps %xmm1, %xmm0, %xmm0306; AVX1-SLOW-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]307; AVX1-SLOW-NEXT: vaddps %xmm1, %xmm0, %xmm0308; AVX1-SLOW-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]309; AVX1-SLOW-NEXT: vaddss %xmm1, %xmm0, %xmm0310; AVX1-SLOW-NEXT: vzeroupper311; AVX1-SLOW-NEXT: retq312;313; AVX1-FAST-LABEL: PR37890_v16f32:314; AVX1-FAST: # %bb.0:315; AVX1-FAST-NEXT: vaddps %ymm1, %ymm0, %ymm0316; AVX1-FAST-NEXT: vextractf128 $1, %ymm0, %xmm1317; AVX1-FAST-NEXT: vhaddps %xmm0, %xmm1, %xmm0318; AVX1-FAST-NEXT: vhaddps %xmm0, %xmm0, %xmm0319; AVX1-FAST-NEXT: vhaddps %xmm0, %xmm0, %xmm0320; AVX1-FAST-NEXT: vzeroupper321; AVX1-FAST-NEXT: retq322;323; AVX2-LABEL: PR37890_v16f32:324; AVX2: # %bb.0:325; AVX2-NEXT: vaddps %ymm1, %ymm0, %ymm0326; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1327; AVX2-NEXT: vaddps %xmm1, %xmm0, %xmm0328; AVX2-NEXT: vshufpd {{.*#+}} xmm1 = xmm0[1,0]329; AVX2-NEXT: vaddps %xmm1, %xmm0, %xmm0330; AVX2-NEXT: vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]331; AVX2-NEXT: vaddss %xmm1, %xmm0, %xmm0332; AVX2-NEXT: vzeroupper333; AVX2-NEXT: retq334 %hi0 = shufflevector <16 x float> %a, <16 x float> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>335 %lo0 = shufflevector <16 x float> %a, <16 x float> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>336 %sum0 = fadd fast <8 x float> %lo0, %hi0337 %hi1 = shufflevector <8 x float> %sum0, <8 x float> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>338 %lo1 = shufflevector <8 x float> %sum0, <8 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>339 %sum1 = fadd fast <4 x float> %lo1, %hi1340 %hi2 = shufflevector <4 x float> %sum1, <4 x float> undef, <2 x i32> <i32 2, i32 3>341 %lo2 = shufflevector <4 x float> %sum1, <4 x float> undef, <2 x i32> <i32 0, i32 1>342 %sum2 = fadd fast <2 x float> %lo2, %hi2343 %hi3 = shufflevector <2 x float> %sum2, <2 x float> undef, <2 x i32> <i32 1, i32 undef>344 %sum3 = fadd fast <2 x float> %sum2, %hi3345 %e = extractelement <2 x float> %sum3, i32 0346 ret float %e347}348