brintos

brintos / llvm-project-archived public Read only

0
0
Text · 13.6 KiB · 15cbd01 Raw
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