brintos

brintos / llvm-project-archived public Read only

0
0
Text · 65.5 KiB · 7364b15 Raw
1219 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx  | FileCheck %s --check-prefixes=AVX,AVX14; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX25; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW7 8@a = dso_local global [1024 x i8] zeroinitializer, align 169@b = dso_local global [1024 x i8] zeroinitializer, align 1610 11define dso_local i32 @sad_16i8() nounwind {12; SSE2-LABEL: sad_16i8:13; SSE2:       # %bb.0: # %entry14; SSE2-NEXT:    pxor %xmm0, %xmm015; SSE2-NEXT:    movq $-1024, %rax # imm = 0xFC0016; SSE2-NEXT:    pxor %xmm1, %xmm117; SSE2-NEXT:    .p2align 418; SSE2-NEXT:  .LBB0_1: # %vector.body19; SSE2-NEXT:    # =>This Inner Loop Header: Depth=120; SSE2-NEXT:    movdqu a+1024(%rax), %xmm221; SSE2-NEXT:    movdqu b+1024(%rax), %xmm322; SSE2-NEXT:    psadbw %xmm2, %xmm323; SSE2-NEXT:    paddd %xmm3, %xmm124; SSE2-NEXT:    addq $16, %rax25; SSE2-NEXT:    jne .LBB0_126; SSE2-NEXT:  # %bb.2: # %middle.block27; SSE2-NEXT:    paddd %xmm0, %xmm128; SSE2-NEXT:    paddd %xmm0, %xmm029; SSE2-NEXT:    paddd %xmm1, %xmm030; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]31; SSE2-NEXT:    paddd %xmm0, %xmm132; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]33; SSE2-NEXT:    paddd %xmm1, %xmm034; SSE2-NEXT:    movd %xmm0, %eax35; SSE2-NEXT:    retq36;37; AVX1-LABEL: sad_16i8:38; AVX1:       # %bb.0: # %entry39; AVX1-NEXT:    vpxor %xmm0, %xmm0, %xmm040; AVX1-NEXT:    movq $-1024, %rax # imm = 0xFC0041; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm142; AVX1-NEXT:    .p2align 443; AVX1-NEXT:  .LBB0_1: # %vector.body44; AVX1-NEXT:    # =>This Inner Loop Header: Depth=145; AVX1-NEXT:    vmovdqu a+1024(%rax), %xmm246; AVX1-NEXT:    vpsadbw b+1024(%rax), %xmm2, %xmm247; AVX1-NEXT:    vpaddd %xmm1, %xmm2, %xmm248; AVX1-NEXT:    vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7]49; AVX1-NEXT:    addq $16, %rax50; AVX1-NEXT:    jne .LBB0_151; AVX1-NEXT:  # %bb.2: # %middle.block52; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm253; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm354; AVX1-NEXT:    vpaddd %xmm3, %xmm2, %xmm255; AVX1-NEXT:    vpaddd %xmm0, %xmm1, %xmm056; AVX1-NEXT:    vpaddd %xmm2, %xmm0, %xmm057; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]58; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm059; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]60; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm061; AVX1-NEXT:    vmovd %xmm0, %eax62; AVX1-NEXT:    vzeroupper63; AVX1-NEXT:    retq64;65; AVX2-LABEL: sad_16i8:66; AVX2:       # %bb.0: # %entry67; AVX2-NEXT:    vpxor %xmm0, %xmm0, %xmm068; AVX2-NEXT:    movq $-1024, %rax # imm = 0xFC0069; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm170; AVX2-NEXT:    .p2align 471; AVX2-NEXT:  .LBB0_1: # %vector.body72; AVX2-NEXT:    # =>This Inner Loop Header: Depth=173; AVX2-NEXT:    vmovdqu a+1024(%rax), %xmm274; AVX2-NEXT:    vpsadbw b+1024(%rax), %xmm2, %xmm275; AVX2-NEXT:    vpaddd %ymm1, %ymm2, %ymm176; AVX2-NEXT:    addq $16, %rax77; AVX2-NEXT:    jne .LBB0_178; AVX2-NEXT:  # %bb.2: # %middle.block79; AVX2-NEXT:    vpaddd %ymm0, %ymm1, %ymm080; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm181; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm082; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]83; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm084; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]85; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm086; AVX2-NEXT:    vmovd %xmm0, %eax87; AVX2-NEXT:    vzeroupper88; AVX2-NEXT:    retq89;90; AVX512-LABEL: sad_16i8:91; AVX512:       # %bb.0: # %entry92; AVX512-NEXT:    vpxor %xmm0, %xmm0, %xmm093; AVX512-NEXT:    movq $-1024, %rax # imm = 0xFC0094; AVX512-NEXT:    .p2align 495; AVX512-NEXT:  .LBB0_1: # %vector.body96; AVX512-NEXT:    # =>This Inner Loop Header: Depth=197; AVX512-NEXT:    vmovdqu a+1024(%rax), %xmm198; AVX512-NEXT:    vpsadbw b+1024(%rax), %xmm1, %xmm199; AVX512-NEXT:    vpaddd %zmm0, %zmm1, %zmm0100; AVX512-NEXT:    addq $16, %rax101; AVX512-NEXT:    jne .LBB0_1102; AVX512-NEXT:  # %bb.2: # %middle.block103; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1104; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0105; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1106; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0107; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]108; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0109; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]110; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0111; AVX512-NEXT:    vmovd %xmm0, %eax112; AVX512-NEXT:    vzeroupper113; AVX512-NEXT:    retq114entry:115  br label %vector.body116 117vector.body:118  %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]119  %vec.phi = phi <16 x i32> [ zeroinitializer, %entry ], [ %10, %vector.body ]120  %0 = getelementptr inbounds [1024 x i8], ptr @a, i64 0, i64 %index121  %1 = bitcast ptr %0 to ptr122  %wide.load = load <16 x i8>, ptr %1, align 4123  %2 = zext <16 x i8> %wide.load to <16 x i32>124  %3 = getelementptr inbounds [1024 x i8], ptr @b, i64 0, i64 %index125  %4 = bitcast ptr %3 to ptr126  %wide.load1 = load <16 x i8>, ptr %4, align 4127  %5 = zext <16 x i8> %wide.load1 to <16 x i32>128  %6 = sub nsw <16 x i32> %2, %5129  %7 = icmp sgt <16 x i32> %6, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>130  %8 = sub nsw <16 x i32> zeroinitializer, %6131  %9 = select <16 x i1> %7, <16 x i32> %6, <16 x i32> %8132  %10 = add nsw <16 x i32> %9, %vec.phi133  %index.next = add i64 %index, 16134  %11 = icmp eq i64 %index.next, 1024135  br i1 %11, label %middle.block, label %vector.body136 137middle.block:138  %rdx.shuf = shufflevector <16 x i32> %10, <16 x i32> undef, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>139  %bin.rdx = add <16 x i32> %10, %rdx.shuf140  %rdx.shuf2 = shufflevector <16 x i32> %bin.rdx, <16 x i32> undef, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>141  %bin.rdx2 = add <16 x i32> %bin.rdx, %rdx.shuf2142  %rdx.shuf3 = shufflevector <16 x i32> %bin.rdx2, <16 x i32> undef, <16 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>143  %bin.rdx3 = add <16 x i32> %bin.rdx2, %rdx.shuf3144  %rdx.shuf4 = shufflevector <16 x i32> %bin.rdx3, <16 x i32> undef, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>145  %bin.rdx4 = add <16 x i32> %bin.rdx3, %rdx.shuf4146  %12 = extractelement <16 x i32> %bin.rdx4, i32 0147  ret i32 %12148}149 150define dso_local i32 @sad_32i8() nounwind {151; SSE2-LABEL: sad_32i8:152; SSE2:       # %bb.0: # %entry153; SSE2-NEXT:    pxor %xmm0, %xmm0154; SSE2-NEXT:    movq $-1024, %rax # imm = 0xFC00155; SSE2-NEXT:    pxor %xmm1, %xmm1156; SSE2-NEXT:    pxor %xmm2, %xmm2157; SSE2-NEXT:    .p2align 4158; SSE2-NEXT:  .LBB1_1: # %vector.body159; SSE2-NEXT:    # =>This Inner Loop Header: Depth=1160; SSE2-NEXT:    movdqa a+1024(%rax), %xmm3161; SSE2-NEXT:    psadbw b+1024(%rax), %xmm3162; SSE2-NEXT:    paddd %xmm3, %xmm1163; SSE2-NEXT:    movdqa a+1040(%rax), %xmm3164; SSE2-NEXT:    psadbw b+1040(%rax), %xmm3165; SSE2-NEXT:    paddd %xmm3, %xmm2166; SSE2-NEXT:    addq $32, %rax167; SSE2-NEXT:    jne .LBB1_1168; SSE2-NEXT:  # %bb.2: # %middle.block169; SSE2-NEXT:    paddd %xmm0, %xmm2170; SSE2-NEXT:    paddd %xmm0, %xmm1171; SSE2-NEXT:    paddd %xmm0, %xmm0172; SSE2-NEXT:    paddd %xmm0, %xmm1173; SSE2-NEXT:    paddd %xmm2, %xmm0174; SSE2-NEXT:    paddd %xmm1, %xmm0175; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]176; SSE2-NEXT:    paddd %xmm0, %xmm1177; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]178; SSE2-NEXT:    paddd %xmm1, %xmm0179; SSE2-NEXT:    movd %xmm0, %eax180; SSE2-NEXT:    retq181;182; AVX1-LABEL: sad_32i8:183; AVX1:       # %bb.0: # %entry184; AVX1-NEXT:    vpxor %xmm0, %xmm0, %xmm0185; AVX1-NEXT:    movq $-1024, %rax # imm = 0xFC00186; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1187; AVX1-NEXT:    .p2align 4188; AVX1-NEXT:  .LBB1_1: # %vector.body189; AVX1-NEXT:    # =>This Inner Loop Header: Depth=1190; AVX1-NEXT:    vmovdqa a+1024(%rax), %xmm2191; AVX1-NEXT:    vpsadbw b+1024(%rax), %xmm2, %xmm2192; AVX1-NEXT:    vmovdqa a+1040(%rax), %xmm3193; AVX1-NEXT:    vpsadbw b+1040(%rax), %xmm3, %xmm3194; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4195; AVX1-NEXT:    vpaddd %xmm4, %xmm3, %xmm3196; AVX1-NEXT:    vpaddd %xmm1, %xmm2, %xmm1197; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1198; AVX1-NEXT:    addq $32, %rax199; AVX1-NEXT:    jne .LBB1_1200; AVX1-NEXT:  # %bb.2: # %middle.block201; AVX1-NEXT:    vpaddd %xmm0, %xmm0, %xmm2202; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3203; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4204; AVX1-NEXT:    vpaddd %xmm4, %xmm4, %xmm5205; AVX1-NEXT:    vpaddd %xmm5, %xmm4, %xmm4206; AVX1-NEXT:    vpaddd %xmm4, %xmm3, %xmm3207; AVX1-NEXT:    vpaddd %xmm2, %xmm0, %xmm0208; AVX1-NEXT:    vpaddd %xmm0, %xmm1, %xmm0209; AVX1-NEXT:    vpaddd %xmm3, %xmm0, %xmm0210; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]211; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0212; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]213; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0214; AVX1-NEXT:    vmovd %xmm0, %eax215; AVX1-NEXT:    vzeroupper216; AVX1-NEXT:    retq217;218; AVX2-LABEL: sad_32i8:219; AVX2:       # %bb.0: # %entry220; AVX2-NEXT:    vpxor %xmm0, %xmm0, %xmm0221; AVX2-NEXT:    movq $-1024, %rax # imm = 0xFC00222; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1223; AVX2-NEXT:    .p2align 4224; AVX2-NEXT:  .LBB1_1: # %vector.body225; AVX2-NEXT:    # =>This Inner Loop Header: Depth=1226; AVX2-NEXT:    vmovdqa a+1024(%rax), %ymm2227; AVX2-NEXT:    vpsadbw b+1024(%rax), %ymm2, %ymm2228; AVX2-NEXT:    vpaddd %ymm1, %ymm2, %ymm1229; AVX2-NEXT:    addq $32, %rax230; AVX2-NEXT:    jne .LBB1_1231; AVX2-NEXT:  # %bb.2: # %middle.block232; AVX2-NEXT:    vpaddd %ymm0, %ymm1, %ymm1233; AVX2-NEXT:    vpaddd %ymm0, %ymm0, %ymm0234; AVX2-NEXT:    vpaddd %ymm0, %ymm1, %ymm0235; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1236; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0237; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]238; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0239; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]240; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0241; AVX2-NEXT:    vmovd %xmm0, %eax242; AVX2-NEXT:    vzeroupper243; AVX2-NEXT:    retq244;245; AVX512-LABEL: sad_32i8:246; AVX512:       # %bb.0: # %entry247; AVX512-NEXT:    vpxor %xmm0, %xmm0, %xmm0248; AVX512-NEXT:    movq $-1024, %rax # imm = 0xFC00249; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1250; AVX512-NEXT:    .p2align 4251; AVX512-NEXT:  .LBB1_1: # %vector.body252; AVX512-NEXT:    # =>This Inner Loop Header: Depth=1253; AVX512-NEXT:    vmovdqa a+1024(%rax), %ymm2254; AVX512-NEXT:    vpsadbw b+1024(%rax), %ymm2, %ymm2255; AVX512-NEXT:    vpaddd %zmm1, %zmm2, %zmm1256; AVX512-NEXT:    addq $32, %rax257; AVX512-NEXT:    jne .LBB1_1258; AVX512-NEXT:  # %bb.2: # %middle.block259; AVX512-NEXT:    vpaddd %zmm0, %zmm1, %zmm0260; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1261; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0262; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1263; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0264; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]265; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0266; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]267; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0268; AVX512-NEXT:    vmovd %xmm0, %eax269; AVX512-NEXT:    vzeroupper270; AVX512-NEXT:    retq271entry:272  br label %vector.body273 274vector.body:275  %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]276  %vec.phi = phi <32 x i32> [ zeroinitializer, %entry ], [ %10, %vector.body ]277  %0 = getelementptr inbounds [1024 x i8], ptr @a, i64 0, i64 %index278  %1 = bitcast ptr %0 to ptr279  %wide.load = load <32 x i8>, ptr %1, align 32280  %2 = zext <32 x i8> %wide.load to <32 x i32>281  %3 = getelementptr inbounds [1024 x i8], ptr @b, i64 0, i64 %index282  %4 = bitcast ptr %3 to ptr283  %wide.load1 = load <32 x i8>, ptr %4, align 32284  %5 = zext <32 x i8> %wide.load1 to <32 x i32>285  %6 = sub nsw <32 x i32> %2, %5286  %7 = icmp sgt <32 x i32> %6, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>287  %8 = sub nsw <32 x i32> zeroinitializer, %6288  %9 = select <32 x i1> %7, <32 x i32> %6, <32 x i32> %8289  %10 = add nsw <32 x i32> %9, %vec.phi290  %index.next = add i64 %index, 32291  %11 = icmp eq i64 %index.next, 1024292  br i1 %11, label %middle.block, label %vector.body293 294middle.block:295  %rdx.shuf = shufflevector <32 x i32> %10, <32 x i32> undef, <32 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>296  %bin.rdx = add <32 x i32> %10, %rdx.shuf297  %rdx.shuf2 = shufflevector <32 x i32> %bin.rdx, <32 x i32> undef, <32 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>298  %bin.rdx2 = add <32 x i32> %bin.rdx, %rdx.shuf2299  %rdx.shuf3 = shufflevector <32 x i32> %bin.rdx2, <32 x i32> undef, <32 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>300  %bin.rdx3 = add <32 x i32> %bin.rdx2, %rdx.shuf3301  %rdx.shuf4 = shufflevector <32 x i32> %bin.rdx3, <32 x i32> undef, <32 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>302  %bin.rdx4 = add <32 x i32> %bin.rdx3, %rdx.shuf4303  %rdx.shuf5 = shufflevector <32 x i32> %bin.rdx4, <32 x i32> undef, <32 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>304  %bin.rdx5 = add <32 x i32> %bin.rdx4, %rdx.shuf5305  %12 = extractelement <32 x i32> %bin.rdx5, i32 0306  ret i32 %12307}308 309define dso_local i32 @sad_avx64i8() nounwind {310; SSE2-LABEL: sad_avx64i8:311; SSE2:       # %bb.0: # %entry312; SSE2-NEXT:    pxor %xmm4, %xmm4313; SSE2-NEXT:    movq $-1024, %rax # imm = 0xFC00314; SSE2-NEXT:    pxor %xmm0, %xmm0315; SSE2-NEXT:    pxor %xmm3, %xmm3316; SSE2-NEXT:    pxor %xmm2, %xmm2317; SSE2-NEXT:    pxor %xmm1, %xmm1318; SSE2-NEXT:    .p2align 4319; SSE2-NEXT:  .LBB2_1: # %vector.body320; SSE2-NEXT:    # =>This Inner Loop Header: Depth=1321; SSE2-NEXT:    movdqa a+1024(%rax), %xmm5322; SSE2-NEXT:    psadbw b+1024(%rax), %xmm5323; SSE2-NEXT:    paddd %xmm5, %xmm0324; SSE2-NEXT:    movdqa a+1040(%rax), %xmm5325; SSE2-NEXT:    psadbw b+1040(%rax), %xmm5326; SSE2-NEXT:    paddd %xmm5, %xmm3327; SSE2-NEXT:    movdqa a+1056(%rax), %xmm5328; SSE2-NEXT:    psadbw b+1056(%rax), %xmm5329; SSE2-NEXT:    paddd %xmm5, %xmm2330; SSE2-NEXT:    movdqa a+1072(%rax), %xmm5331; SSE2-NEXT:    psadbw b+1072(%rax), %xmm5332; SSE2-NEXT:    paddd %xmm5, %xmm1333; SSE2-NEXT:    addq $64, %rax334; SSE2-NEXT:    jne .LBB2_1335; SSE2-NEXT:  # %bb.2: # %middle.block336; SSE2-NEXT:    paddd %xmm4, %xmm2337; SSE2-NEXT:    pxor %xmm5, %xmm5338; SSE2-NEXT:    paddd %xmm5, %xmm5339; SSE2-NEXT:    paddd %xmm4, %xmm0340; SSE2-NEXT:    paddd %xmm4, %xmm1341; SSE2-NEXT:    paddd %xmm4, %xmm3342; SSE2-NEXT:    paddd %xmm5, %xmm3343; SSE2-NEXT:    paddd %xmm5, %xmm1344; SSE2-NEXT:    paddd %xmm3, %xmm1345; SSE2-NEXT:    paddd %xmm5, %xmm0346; SSE2-NEXT:    paddd %xmm2, %xmm5347; SSE2-NEXT:    paddd %xmm0, %xmm5348; SSE2-NEXT:    paddd %xmm1, %xmm5349; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[2,3,2,3]350; SSE2-NEXT:    paddd %xmm5, %xmm0351; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]352; SSE2-NEXT:    paddd %xmm0, %xmm1353; SSE2-NEXT:    movd %xmm1, %eax354; SSE2-NEXT:    retq355;356; AVX1-LABEL: sad_avx64i8:357; AVX1:       # %bb.0: # %entry358; AVX1-NEXT:    vpxor %xmm0, %xmm0, %xmm0359; AVX1-NEXT:    movq $-1024, %rax # imm = 0xFC00360; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2361; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1362; AVX1-NEXT:    .p2align 4363; AVX1-NEXT:  .LBB2_1: # %vector.body364; AVX1-NEXT:    # =>This Inner Loop Header: Depth=1365; AVX1-NEXT:    vmovdqa a+1024(%rax), %xmm3366; AVX1-NEXT:    vpsadbw b+1024(%rax), %xmm3, %xmm3367; AVX1-NEXT:    vmovdqa a+1040(%rax), %xmm4368; AVX1-NEXT:    vpsadbw b+1040(%rax), %xmm4, %xmm4369; AVX1-NEXT:    vmovdqa a+1056(%rax), %xmm5370; AVX1-NEXT:    vpsadbw b+1056(%rax), %xmm5, %xmm5371; AVX1-NEXT:    vmovdqa a+1072(%rax), %xmm6372; AVX1-NEXT:    vpsadbw b+1072(%rax), %xmm6, %xmm6373; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7374; AVX1-NEXT:    vpaddd %xmm7, %xmm6, %xmm6375; AVX1-NEXT:    vpaddd %xmm1, %xmm5, %xmm1376; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm1377; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5378; AVX1-NEXT:    vpaddd %xmm5, %xmm4, %xmm4379; AVX1-NEXT:    vpaddd %xmm2, %xmm3, %xmm2380; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2381; AVX1-NEXT:    addq $64, %rax382; AVX1-NEXT:    jne .LBB2_1383; AVX1-NEXT:  # %bb.2: # %middle.block384; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3385; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4386; AVX1-NEXT:    vpaddd %xmm4, %xmm4, %xmm5387; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm6388; AVX1-NEXT:    vpaddd %xmm0, %xmm0, %xmm7389; AVX1-NEXT:    vpaddd %xmm0, %xmm0, %xmm8390; AVX1-NEXT:    vpaddd %xmm0, %xmm8, %xmm8391; AVX1-NEXT:    vpaddd %xmm2, %xmm8, %xmm2392; AVX1-NEXT:    vpaddd %xmm7, %xmm0, %xmm0393; AVX1-NEXT:    vpaddd %xmm0, %xmm1, %xmm0394; AVX1-NEXT:    vpaddd %xmm0, %xmm2, %xmm0395; AVX1-NEXT:    vpaddd %xmm5, %xmm4, %xmm1396; AVX1-NEXT:    vpaddd %xmm1, %xmm6, %xmm2397; AVX1-NEXT:    vpaddd %xmm1, %xmm3, %xmm1398; AVX1-NEXT:    vpaddd %xmm1, %xmm2, %xmm1399; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0400; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]401; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0402; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]403; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0404; AVX1-NEXT:    vmovd %xmm0, %eax405; AVX1-NEXT:    vzeroupper406; AVX1-NEXT:    retq407;408; AVX2-LABEL: sad_avx64i8:409; AVX2:       # %bb.0: # %entry410; AVX2-NEXT:    vpxor %xmm0, %xmm0, %xmm0411; AVX2-NEXT:    movq $-1024, %rax # imm = 0xFC00412; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1413; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2414; AVX2-NEXT:    .p2align 4415; AVX2-NEXT:  .LBB2_1: # %vector.body416; AVX2-NEXT:    # =>This Inner Loop Header: Depth=1417; AVX2-NEXT:    vmovdqa a+1024(%rax), %ymm3418; AVX2-NEXT:    vpsadbw b+1024(%rax), %ymm3, %ymm3419; AVX2-NEXT:    vpaddd %ymm1, %ymm3, %ymm1420; AVX2-NEXT:    vmovdqa a+1056(%rax), %ymm3421; AVX2-NEXT:    vpsadbw b+1056(%rax), %ymm3, %ymm3422; AVX2-NEXT:    vpaddd %ymm2, %ymm3, %ymm2423; AVX2-NEXT:    addq $64, %rax424; AVX2-NEXT:    jne .LBB2_1425; AVX2-NEXT:  # %bb.2: # %middle.block426; AVX2-NEXT:    vpaddd %ymm0, %ymm2, %ymm2427; AVX2-NEXT:    vpaddd %ymm0, %ymm0, %ymm3428; AVX2-NEXT:    vpaddd %ymm0, %ymm1, %ymm0429; AVX2-NEXT:    vpaddd %ymm3, %ymm0, %ymm0430; AVX2-NEXT:    vpaddd %ymm3, %ymm2, %ymm1431; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0432; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1433; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0434; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]435; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0436; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]437; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0438; AVX2-NEXT:    vmovd %xmm0, %eax439; AVX2-NEXT:    vzeroupper440; AVX2-NEXT:    retq441;442; AVX512F-LABEL: sad_avx64i8:443; AVX512F:       # %bb.0: # %entry444; AVX512F-NEXT:    vpxor %xmm0, %xmm0, %xmm0445; AVX512F-NEXT:    movq $-1024, %rax # imm = 0xFC00446; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1447; AVX512F-NEXT:    .p2align 4448; AVX512F-NEXT:  .LBB2_1: # %vector.body449; AVX512F-NEXT:    # =>This Inner Loop Header: Depth=1450; AVX512F-NEXT:    vmovdqa a+1024(%rax), %ymm2451; AVX512F-NEXT:    vpsadbw b+1024(%rax), %ymm2, %ymm2452; AVX512F-NEXT:    vmovdqa a+1056(%rax), %ymm3453; AVX512F-NEXT:    vpsadbw b+1056(%rax), %ymm3, %ymm3454; AVX512F-NEXT:    vinserti64x4 $1, %ymm3, %zmm2, %zmm2455; AVX512F-NEXT:    vpaddd %zmm1, %zmm2, %zmm1456; AVX512F-NEXT:    addq $64, %rax457; AVX512F-NEXT:    jne .LBB2_1458; AVX512F-NEXT:  # %bb.2: # %middle.block459; AVX512F-NEXT:    vpaddd %zmm0, %zmm1, %zmm1460; AVX512F-NEXT:    vpaddd %zmm0, %zmm0, %zmm0461; AVX512F-NEXT:    vpaddd %zmm0, %zmm1, %zmm0462; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1463; AVX512F-NEXT:    vpaddd %zmm1, %zmm0, %zmm0464; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1465; AVX512F-NEXT:    vpaddd %xmm1, %xmm0, %xmm0466; AVX512F-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]467; AVX512F-NEXT:    vpaddd %xmm1, %xmm0, %xmm0468; AVX512F-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]469; AVX512F-NEXT:    vpaddd %xmm1, %xmm0, %xmm0470; AVX512F-NEXT:    vmovd %xmm0, %eax471; AVX512F-NEXT:    vzeroupper472; AVX512F-NEXT:    retq473;474; AVX512BW-LABEL: sad_avx64i8:475; AVX512BW:       # %bb.0: # %entry476; AVX512BW-NEXT:    vpxor %xmm0, %xmm0, %xmm0477; AVX512BW-NEXT:    movq $-1024, %rax # imm = 0xFC00478; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1479; AVX512BW-NEXT:    .p2align 4480; AVX512BW-NEXT:  .LBB2_1: # %vector.body481; AVX512BW-NEXT:    # =>This Inner Loop Header: Depth=1482; AVX512BW-NEXT:    vmovdqa64 a+1024(%rax), %zmm2483; AVX512BW-NEXT:    vpsadbw b+1024(%rax), %zmm2, %zmm2484; AVX512BW-NEXT:    vpaddd %zmm1, %zmm2, %zmm1485; AVX512BW-NEXT:    addq $64, %rax486; AVX512BW-NEXT:    jne .LBB2_1487; AVX512BW-NEXT:  # %bb.2: # %middle.block488; AVX512BW-NEXT:    vpaddd %zmm0, %zmm1, %zmm1489; AVX512BW-NEXT:    vpaddd %zmm0, %zmm0, %zmm0490; AVX512BW-NEXT:    vpaddd %zmm0, %zmm1, %zmm0491; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1492; AVX512BW-NEXT:    vpaddd %zmm1, %zmm0, %zmm0493; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1494; AVX512BW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0495; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]496; AVX512BW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0497; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]498; AVX512BW-NEXT:    vpaddd %xmm1, %xmm0, %xmm0499; AVX512BW-NEXT:    vmovd %xmm0, %eax500; AVX512BW-NEXT:    vzeroupper501; AVX512BW-NEXT:    retq502entry:503  br label %vector.body504 505vector.body:506  %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]507  %vec.phi = phi <64 x i32> [ zeroinitializer, %entry ], [ %10, %vector.body ]508  %0 = getelementptr inbounds [1024 x i8], ptr @a, i64 0, i64 %index509  %1 = bitcast ptr %0 to ptr510  %wide.load = load <64 x i8>, ptr %1, align 64511  %2 = zext <64 x i8> %wide.load to <64 x i32>512  %3 = getelementptr inbounds [1024 x i8], ptr @b, i64 0, i64 %index513  %4 = bitcast ptr %3 to ptr514  %wide.load1 = load <64 x i8>, ptr %4, align 64515  %5 = zext <64 x i8> %wide.load1 to <64 x i32>516  %6 = sub nsw <64 x i32> %2, %5517  %7 = icmp sgt <64 x i32> %6, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>518  %8 = sub nsw <64 x i32> zeroinitializer, %6519  %9 = select <64 x i1> %7, <64 x i32> %6, <64 x i32> %8520  %10 = add nsw <64 x i32> %9, %vec.phi521  %index.next = add i64 %index, 64522  %11 = icmp eq i64 %index.next, 1024523  br i1 %11, label %middle.block, label %vector.body524 525middle.block:526  %rdx.shuf = shufflevector <64 x i32> %10, <64 x i32> undef, <64 x i32> <i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 48, i32 49, i32 50, i32 51, i32 52, i32 53, i32 54, i32 55, i32 56, i32 57, i32 58, i32 59, i32 60, i32 61, i32 62, i32 63, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>527  %bin.rdx = add <64 x i32> %10, %rdx.shuf528  %rdx.shuf2 = shufflevector <64 x i32> %bin.rdx, <64 x i32> undef, <64 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>529  %bin.rdx2 = add <64 x i32> %bin.rdx, %rdx.shuf2530  %rdx.shuf3 = shufflevector <64 x i32> %bin.rdx2, <64 x i32> undef, <64 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>531  %bin.rdx3 = add <64 x i32> %bin.rdx2, %rdx.shuf3532  %rdx.shuf4 = shufflevector <64 x i32> %bin.rdx3, <64 x i32> undef, <64 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>533  %bin.rdx4 = add <64 x i32> %bin.rdx3, %rdx.shuf4534  %rdx.shuf5 = shufflevector <64 x i32> %bin.rdx4, <64 x i32> undef, <64 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>535  %bin.rdx5 = add <64 x i32> %bin.rdx4, %rdx.shuf5536  %rdx.shuf6 = shufflevector <64 x i32> %bin.rdx5, <64 x i32> undef, <64 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>537  %bin.rdx6 = add <64 x i32> %bin.rdx5, %rdx.shuf6538  %12 = extractelement <64 x i32> %bin.rdx6, i32 0539  ret i32 %12540}541 542define dso_local i32 @sad_2i8() nounwind {543; SSE2-LABEL: sad_2i8:544; SSE2:       # %bb.0: # %entry545; SSE2-NEXT:    pxor %xmm0, %xmm0546; SSE2-NEXT:    movq $-1024, %rax # imm = 0xFC00547; SSE2-NEXT:    movd {{.*#+}} xmm1 = [65535,0,0,0]548; SSE2-NEXT:    .p2align 4549; SSE2-NEXT:  .LBB3_1: # %vector.body550; SSE2-NEXT:    # =>This Inner Loop Header: Depth=1551; SSE2-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero552; SSE2-NEXT:    movd {{.*#+}} xmm3 = mem[0],zero,zero,zero553; SSE2-NEXT:    pand %xmm1, %xmm2554; SSE2-NEXT:    pand %xmm1, %xmm3555; SSE2-NEXT:    psadbw %xmm2, %xmm3556; SSE2-NEXT:    paddd %xmm3, %xmm0557; SSE2-NEXT:    addq $2, %rax558; SSE2-NEXT:    jne .LBB3_1559; SSE2-NEXT:  # %bb.2: # %middle.block560; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]561; SSE2-NEXT:    paddd %xmm0, %xmm1562; SSE2-NEXT:    movd %xmm1, %eax563; SSE2-NEXT:    retq564;565; AVX-LABEL: sad_2i8:566; AVX:       # %bb.0: # %entry567; AVX-NEXT:    vpxor %xmm0, %xmm0, %xmm0568; AVX-NEXT:    movq $-1024, %rax # imm = 0xFC00569; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1570; AVX-NEXT:    .p2align 4571; AVX-NEXT:  .LBB3_1: # %vector.body572; AVX-NEXT:    # =>This Inner Loop Header: Depth=1573; AVX-NEXT:    vmovd {{.*#+}} xmm2 = mem[0],zero,zero,zero574; AVX-NEXT:    vmovd {{.*#+}} xmm3 = mem[0],zero,zero,zero575; AVX-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0],xmm0[1,2,3,4,5,6,7]576; AVX-NEXT:    vpblendw {{.*#+}} xmm3 = xmm3[0],xmm0[1,2,3,4,5,6,7]577; AVX-NEXT:    vpsadbw %xmm3, %xmm2, %xmm2578; AVX-NEXT:    vpaddd %xmm1, %xmm2, %xmm1579; AVX-NEXT:    addq $2, %rax580; AVX-NEXT:    jne .LBB3_1581; AVX-NEXT:  # %bb.2: # %middle.block582; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]583; AVX-NEXT:    vpaddd %xmm0, %xmm1, %xmm0584; AVX-NEXT:    vmovd %xmm0, %eax585; AVX-NEXT:    retq586entry:587  br label %vector.body588 589vector.body:590  %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]591  %vec.phi = phi <2 x i32> [ zeroinitializer, %entry ], [ %10, %vector.body ]592  %0 = getelementptr inbounds [1024 x i8], ptr @a, i64 0, i64 %index593  %1 = bitcast ptr %0 to ptr594  %wide.load = load <2 x i8>, ptr %1, align 4595  %2 = zext <2 x i8> %wide.load to <2 x i32>596  %3 = getelementptr inbounds [1024 x i8], ptr @b, i64 0, i64 %index597  %4 = bitcast ptr %3 to ptr598  %wide.load1 = load <2 x i8>, ptr %4, align 4599  %5 = zext <2 x i8> %wide.load1 to <2 x i32>600  %6 = sub nsw <2 x i32> %2, %5601  %7 = icmp sgt <2 x i32> %6, <i32 -1, i32 -1>602  %8 = sub nsw <2 x i32> zeroinitializer, %6603  %9 = select <2 x i1> %7, <2 x i32> %6, <2 x i32> %8604  %10 = add nsw <2 x i32> %9, %vec.phi605  %index.next = add i64 %index, 2606  %11 = icmp eq i64 %index.next, 1024607  br i1 %11, label %middle.block, label %vector.body608 609middle.block:610  %rdx.shuf = shufflevector <2 x i32> %10, <2 x i32> undef, <2 x i32> <i32 1, i32 undef>611  %bin.rdx = add <2 x i32> %10, %rdx.shuf612  %12 = extractelement <2 x i32> %bin.rdx, i32 0613  ret i32 %12614}615 616define dso_local i32 @sad_4i8() nounwind {617; SSE2-LABEL: sad_4i8:618; SSE2:       # %bb.0: # %entry619; SSE2-NEXT:    pxor %xmm0, %xmm0620; SSE2-NEXT:    movq $-1024, %rax # imm = 0xFC00621; SSE2-NEXT:    .p2align 4622; SSE2-NEXT:  .LBB4_1: # %vector.body623; SSE2-NEXT:    # =>This Inner Loop Header: Depth=1624; SSE2-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero625; SSE2-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero626; SSE2-NEXT:    psadbw %xmm1, %xmm2627; SSE2-NEXT:    paddd %xmm2, %xmm0628; SSE2-NEXT:    addq $4, %rax629; SSE2-NEXT:    jne .LBB4_1630; SSE2-NEXT:  # %bb.2: # %middle.block631; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]632; SSE2-NEXT:    paddd %xmm0, %xmm1633; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]634; SSE2-NEXT:    paddd %xmm1, %xmm0635; SSE2-NEXT:    movd %xmm0, %eax636; SSE2-NEXT:    retq637;638; AVX-LABEL: sad_4i8:639; AVX:       # %bb.0: # %entry640; AVX-NEXT:    vpxor %xmm0, %xmm0, %xmm0641; AVX-NEXT:    movq $-1024, %rax # imm = 0xFC00642; AVX-NEXT:    .p2align 4643; AVX-NEXT:  .LBB4_1: # %vector.body644; AVX-NEXT:    # =>This Inner Loop Header: Depth=1645; AVX-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero646; AVX-NEXT:    vmovd {{.*#+}} xmm2 = mem[0],zero,zero,zero647; AVX-NEXT:    vpsadbw %xmm2, %xmm1, %xmm1648; AVX-NEXT:    vpaddd %xmm0, %xmm1, %xmm0649; AVX-NEXT:    addq $4, %rax650; AVX-NEXT:    jne .LBB4_1651; AVX-NEXT:  # %bb.2: # %middle.block652; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]653; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0654; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]655; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0656; AVX-NEXT:    vmovd %xmm0, %eax657; AVX-NEXT:    retq658entry:659  br label %vector.body660 661vector.body:662  %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]663  %vec.phi = phi <4 x i32> [ zeroinitializer, %entry ], [ %10, %vector.body ]664  %0 = getelementptr inbounds [1024 x i8], ptr @a, i64 0, i64 %index665  %1 = bitcast ptr %0 to ptr666  %wide.load = load <4 x i8>, ptr %1, align 4667  %2 = zext <4 x i8> %wide.load to <4 x i32>668  %3 = getelementptr inbounds [1024 x i8], ptr @b, i64 0, i64 %index669  %4 = bitcast ptr %3 to ptr670  %wide.load1 = load <4 x i8>, ptr %4, align 4671  %5 = zext <4 x i8> %wide.load1 to <4 x i32>672  %6 = sub nsw <4 x i32> %2, %5673  %7 = icmp sgt <4 x i32> %6, <i32 -1, i32 -1, i32 -1, i32 -1>674  %8 = sub nsw <4 x i32> zeroinitializer, %6675  %9 = select <4 x i1> %7, <4 x i32> %6, <4 x i32> %8676  %10 = add nsw <4 x i32> %9, %vec.phi677  %index.next = add i64 %index, 4678  %11 = icmp eq i64 %index.next, 1024679  br i1 %11, label %middle.block, label %vector.body680 681middle.block:682  %h2 = shufflevector <4 x i32> %10, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>683  %sum2 = add <4 x i32> %10, %h2684  %h3 = shufflevector <4 x i32> %sum2, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>685  %sum3 = add <4 x i32> %sum2, %h3686  %sum = extractelement <4 x i32> %sum3, i32 0687  ret i32 %sum688}689 690 691define dso_local i32 @sad_nonloop_4i8(ptr nocapture readonly %p, i64, ptr nocapture readonly %q) local_unnamed_addr #0 {692; SSE2-LABEL: sad_nonloop_4i8:693; SSE2:       # %bb.0:694; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero695; SSE2-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero696; SSE2-NEXT:    psadbw %xmm0, %xmm1697; SSE2-NEXT:    movd %xmm1, %eax698; SSE2-NEXT:    retq699;700; AVX-LABEL: sad_nonloop_4i8:701; AVX:       # %bb.0:702; AVX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero703; AVX-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero704; AVX-NEXT:    vpsadbw %xmm0, %xmm1, %xmm0705; AVX-NEXT:    vmovd %xmm0, %eax706; AVX-NEXT:    retq707  %v1 = load <4 x i8>, ptr %p, align 1708  %z1 = zext <4 x i8> %v1 to <4 x i32>709  %v2 = load <4 x i8>, ptr %q, align 1710  %z2 = zext <4 x i8> %v2 to <4 x i32>711  %sub = sub nsw <4 x i32> %z1, %z2712  %isneg = icmp sgt <4 x i32> %sub, <i32 -1, i32 -1, i32 -1, i32 -1>713  %neg = sub nsw <4 x i32> zeroinitializer, %sub714  %abs = select <4 x i1> %isneg, <4 x i32> %sub, <4 x i32> %neg715  %h2 = shufflevector <4 x i32> %abs, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>716  %sum2 = add <4 x i32> %abs, %h2717  %h3 = shufflevector <4 x i32> %sum2, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>718  %sum3 = add <4 x i32> %sum2, %h3719  %sum = extractelement <4 x i32> %sum3, i32 0720  ret i32 %sum721}722 723define dso_local i32 @sad_nonloop_8i8(ptr nocapture readonly %p, i64, ptr nocapture readonly %q) local_unnamed_addr #0 {724; SSE2-LABEL: sad_nonloop_8i8:725; SSE2:       # %bb.0:726; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero727; SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero728; SSE2-NEXT:    psadbw %xmm0, %xmm1729; SSE2-NEXT:    movd %xmm1, %eax730; SSE2-NEXT:    retq731;732; AVX-LABEL: sad_nonloop_8i8:733; AVX:       # %bb.0:734; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero735; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero736; AVX-NEXT:    vpsadbw %xmm1, %xmm0, %xmm0737; AVX-NEXT:    vmovd %xmm0, %eax738; AVX-NEXT:    retq739  %v1 = load <8 x i8>, ptr %p, align 1740  %z1 = zext <8 x i8> %v1 to <8 x i32>741  %v2 = load <8 x i8>, ptr %q, align 1742  %z2 = zext <8 x i8> %v2 to <8 x i32>743  %sub = sub nsw <8 x i32> %z1, %z2744  %isneg = icmp sgt <8 x i32> %sub, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>745  %neg = sub nsw <8 x i32> zeroinitializer, %sub746  %abs = select <8 x i1> %isneg, <8 x i32> %sub, <8 x i32> %neg747  %h1 = shufflevector <8 x i32> %abs, <8 x i32> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>748  %sum1 = add <8 x i32> %abs, %h1749  %h2 = shufflevector <8 x i32> %sum1, <8 x i32> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>750  %sum2 = add <8 x i32> %sum1, %h2751  %h3 = shufflevector <8 x i32> %sum2, <8 x i32> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>752  %sum3 = add <8 x i32> %sum2, %h3753  %sum = extractelement <8 x i32> %sum3, i32 0754  ret i32 %sum755}756 757define dso_local i32 @sad_nonloop_16i8(ptr nocapture readonly %p, i64, ptr nocapture readonly %q) local_unnamed_addr #0 {758; SSE2-LABEL: sad_nonloop_16i8:759; SSE2:       # %bb.0:760; SSE2-NEXT:    movdqu (%rdi), %xmm0761; SSE2-NEXT:    movdqu (%rdx), %xmm1762; SSE2-NEXT:    psadbw %xmm0, %xmm1763; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]764; SSE2-NEXT:    paddq %xmm1, %xmm0765; SSE2-NEXT:    movd %xmm0, %eax766; SSE2-NEXT:    retq767;768; AVX-LABEL: sad_nonloop_16i8:769; AVX:       # %bb.0:770; AVX-NEXT:    vmovdqu (%rdi), %xmm0771; AVX-NEXT:    vpsadbw (%rdx), %xmm0, %xmm0772; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]773; AVX-NEXT:    vpaddq %xmm1, %xmm0, %xmm0774; AVX-NEXT:    vmovd %xmm0, %eax775; AVX-NEXT:    retq776  %v1 = load <16 x i8>, ptr %p, align 1777  %z1 = zext <16 x i8> %v1 to <16 x i32>778  %v2 = load <16 x i8>, ptr %q, align 1779  %z2 = zext <16 x i8> %v2 to <16 x i32>780  %sub = sub nsw <16 x i32> %z1, %z2781  %isneg = icmp sgt <16 x i32> %sub, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>782  %neg = sub nsw <16 x i32> zeroinitializer, %sub783  %abs = select <16 x i1> %isneg, <16 x i32> %sub, <16 x i32> %neg784  %h0 = shufflevector <16 x i32> %abs, <16 x i32> undef, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>785  %sum0 = add <16 x i32> %abs, %h0786  %h1 = shufflevector <16 x i32> %sum0, <16 x i32> undef, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>787  %sum1 = add <16 x i32> %sum0, %h1788  %h2 = shufflevector <16 x i32> %sum1, <16 x i32> undef, <16 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>789  %sum2 = add <16 x i32> %sum1, %h2790  %h3 = shufflevector <16 x i32> %sum2, <16 x i32> undef, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>791  %sum3 = add <16 x i32> %sum2, %h3792  %sum = extractelement <16 x i32> %sum3, i32 0793  ret i32 %sum794}795 796define dso_local i32 @sad_nonloop_32i8(ptr nocapture readonly %p, i64, ptr nocapture readonly %q) local_unnamed_addr #0 {797; SSE2-LABEL: sad_nonloop_32i8:798; SSE2:       # %bb.0:799; SSE2-NEXT:    movdqu (%rdx), %xmm0800; SSE2-NEXT:    movdqu 16(%rdx), %xmm1801; SSE2-NEXT:    movdqu (%rdi), %xmm2802; SSE2-NEXT:    psadbw %xmm0, %xmm2803; SSE2-NEXT:    movdqu 16(%rdi), %xmm0804; SSE2-NEXT:    psadbw %xmm1, %xmm0805; SSE2-NEXT:    paddq %xmm2, %xmm0806; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]807; SSE2-NEXT:    paddq %xmm0, %xmm1808; SSE2-NEXT:    movd %xmm1, %eax809; SSE2-NEXT:    retq810;811; AVX1-LABEL: sad_nonloop_32i8:812; AVX1:       # %bb.0:813; AVX1-NEXT:    vmovdqu (%rdi), %xmm0814; AVX1-NEXT:    vmovdqu 16(%rdi), %xmm1815; AVX1-NEXT:    vpsadbw 16(%rdx), %xmm1, %xmm1816; AVX1-NEXT:    vpsadbw (%rdx), %xmm0, %xmm0817; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0818; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]819; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0820; AVX1-NEXT:    vmovd %xmm0, %eax821; AVX1-NEXT:    retq822;823; AVX2-LABEL: sad_nonloop_32i8:824; AVX2:       # %bb.0:825; AVX2-NEXT:    vmovdqu (%rdi), %ymm0826; AVX2-NEXT:    vpsadbw (%rdx), %ymm0, %ymm0827; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1828; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0829; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]830; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0831; AVX2-NEXT:    vmovd %xmm0, %eax832; AVX2-NEXT:    vzeroupper833; AVX2-NEXT:    retq834;835; AVX512-LABEL: sad_nonloop_32i8:836; AVX512:       # %bb.0:837; AVX512-NEXT:    vmovdqu (%rdi), %ymm0838; AVX512-NEXT:    vpsadbw (%rdx), %ymm0, %ymm0839; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1840; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0841; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]842; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0843; AVX512-NEXT:    vmovd %xmm0, %eax844; AVX512-NEXT:    vzeroupper845; AVX512-NEXT:    retq846  %v1 = load <32 x i8>, ptr %p, align 1847  %z1 = zext <32 x i8> %v1 to <32 x i32>848  %v2 = load <32 x i8>, ptr %q, align 1849  %z2 = zext <32 x i8> %v2 to <32 x i32>850  %sub = sub nsw <32 x i32> %z1, %z2851  %isneg = icmp sgt <32 x i32> %sub, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>852  %neg = sub nsw <32 x i32> zeroinitializer, %sub853  %abs = select <32 x i1> %isneg, <32 x i32> %sub, <32 x i32> %neg854  %h32 = shufflevector <32 x i32> %abs, <32 x i32> undef, <32 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>855  %sum32 = add <32 x i32> %abs, %h32856  %h0 = shufflevector <32 x i32> %sum32, <32 x i32> undef, <32 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>857  %sum0 = add <32 x i32> %sum32, %h0858  %h1 = shufflevector <32 x i32> %sum0, <32 x i32> undef, <32 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>859  %sum1 = add <32 x i32> %sum0, %h1860  %h2 = shufflevector <32 x i32> %sum1, <32 x i32> undef, <32 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>861  %sum2 = add <32 x i32> %sum1, %h2862  %h3 = shufflevector <32 x i32> %sum2, <32 x i32> undef, <32 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>863  %sum3 = add <32 x i32> %sum2, %h3864  %sum = extractelement <32 x i32> %sum3, i32 0865  ret i32 %sum866}867 868define dso_local i32 @sad_nonloop_64i8(ptr nocapture readonly %p, i64, ptr nocapture readonly %q) local_unnamed_addr #0 {869; SSE2-LABEL: sad_nonloop_64i8:870; SSE2:       # %bb.0:871; SSE2-NEXT:    movdqu (%rdx), %xmm0872; SSE2-NEXT:    movdqu 16(%rdx), %xmm1873; SSE2-NEXT:    movdqu 32(%rdx), %xmm2874; SSE2-NEXT:    movdqu 48(%rdx), %xmm3875; SSE2-NEXT:    movdqu (%rdi), %xmm4876; SSE2-NEXT:    psadbw %xmm0, %xmm4877; SSE2-NEXT:    movdqu 16(%rdi), %xmm0878; SSE2-NEXT:    psadbw %xmm1, %xmm0879; SSE2-NEXT:    movdqu 32(%rdi), %xmm1880; SSE2-NEXT:    psadbw %xmm2, %xmm1881; SSE2-NEXT:    paddq %xmm4, %xmm1882; SSE2-NEXT:    movdqu 48(%rdi), %xmm2883; SSE2-NEXT:    psadbw %xmm3, %xmm2884; SSE2-NEXT:    paddq %xmm0, %xmm2885; SSE2-NEXT:    paddq %xmm1, %xmm2886; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]887; SSE2-NEXT:    paddq %xmm2, %xmm0888; SSE2-NEXT:    movd %xmm0, %eax889; SSE2-NEXT:    retq890;891; AVX1-LABEL: sad_nonloop_64i8:892; AVX1:       # %bb.0:893; AVX1-NEXT:    vmovdqu (%rdi), %xmm0894; AVX1-NEXT:    vmovdqu 16(%rdi), %xmm1895; AVX1-NEXT:    vmovdqu 32(%rdi), %xmm2896; AVX1-NEXT:    vmovdqu 48(%rdi), %xmm3897; AVX1-NEXT:    vpsadbw 48(%rdx), %xmm3, %xmm3898; AVX1-NEXT:    vpsadbw 16(%rdx), %xmm1, %xmm1899; AVX1-NEXT:    vpaddq %xmm3, %xmm1, %xmm1900; AVX1-NEXT:    vpsadbw 32(%rdx), %xmm2, %xmm2901; AVX1-NEXT:    vpsadbw (%rdx), %xmm0, %xmm0902; AVX1-NEXT:    vpaddq %xmm2, %xmm0, %xmm0903; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0904; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]905; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0906; AVX1-NEXT:    vmovd %xmm0, %eax907; AVX1-NEXT:    retq908;909; AVX2-LABEL: sad_nonloop_64i8:910; AVX2:       # %bb.0:911; AVX2-NEXT:    vmovdqu (%rdi), %ymm0912; AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1913; AVX2-NEXT:    vpsadbw 32(%rdx), %ymm1, %ymm1914; AVX2-NEXT:    vpsadbw (%rdx), %ymm0, %ymm0915; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0916; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1917; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0918; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]919; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0920; AVX2-NEXT:    vmovd %xmm0, %eax921; AVX2-NEXT:    vzeroupper922; AVX2-NEXT:    retq923;924; AVX512F-LABEL: sad_nonloop_64i8:925; AVX512F:       # %bb.0:926; AVX512F-NEXT:    vmovdqu (%rdi), %ymm0927; AVX512F-NEXT:    vmovdqu 32(%rdi), %ymm1928; AVX512F-NEXT:    vpsadbw 32(%rdx), %ymm1, %ymm1929; AVX512F-NEXT:    vpsadbw (%rdx), %ymm0, %ymm0930; AVX512F-NEXT:    vpaddq %ymm1, %ymm0, %ymm0931; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1932; AVX512F-NEXT:    vpaddq %xmm1, %xmm0, %xmm0933; AVX512F-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]934; AVX512F-NEXT:    vpaddq %xmm1, %xmm0, %xmm0935; AVX512F-NEXT:    vmovd %xmm0, %eax936; AVX512F-NEXT:    vzeroupper937; AVX512F-NEXT:    retq938;939; AVX512BW-LABEL: sad_nonloop_64i8:940; AVX512BW:       # %bb.0:941; AVX512BW-NEXT:    vmovdqu64 (%rdi), %zmm0942; AVX512BW-NEXT:    vpsadbw (%rdx), %zmm0, %zmm0943; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1944; AVX512BW-NEXT:    vpaddq %zmm1, %zmm0, %zmm0945; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1946; AVX512BW-NEXT:    vpaddq %xmm1, %xmm0, %xmm0947; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]948; AVX512BW-NEXT:    vpaddq %xmm1, %xmm0, %xmm0949; AVX512BW-NEXT:    vmovd %xmm0, %eax950; AVX512BW-NEXT:    vzeroupper951; AVX512BW-NEXT:    retq952  %v1 = load <64 x i8>, ptr %p, align 1953  %z1 = zext <64 x i8> %v1 to <64 x i32>954  %v2 = load <64 x i8>, ptr %q, align 1955  %z2 = zext <64 x i8> %v2 to <64 x i32>956  %sub = sub nsw <64 x i32> %z1, %z2957  %isneg = icmp sgt <64 x i32> %sub, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>958  %neg = sub nsw <64 x i32> zeroinitializer, %sub959  %abs = select <64 x i1> %isneg, <64 x i32> %sub, <64 x i32> %neg960  %h64 = shufflevector <64 x i32> %abs, <64 x i32> undef, <64 x i32> <i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 48, i32 49, i32 50, i32 51, i32 52, i32 53, i32 54, i32 55, i32 56, i32 57, i32 58, i32 59, i32 60, i32 61, i32 62, i32 63, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>961  %sum64 = add <64 x i32> %abs, %h64962  %h32 = shufflevector <64 x i32> %sum64, <64 x i32> undef, <64 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>963  %sum32 = add <64 x i32> %sum64, %h32964  %h0 = shufflevector <64 x i32> %sum32, <64 x i32> undef, <64 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>965  %sum0 = add <64 x i32> %sum32, %h0966  %h1 = shufflevector <64 x i32> %sum0, <64 x i32> undef, <64 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>967  %sum1 = add <64 x i32> %sum0, %h1968  %h2 = shufflevector <64 x i32> %sum1, <64 x i32> undef, <64 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>969  %sum2 = add <64 x i32> %sum1, %h2970  %h3 = shufflevector <64 x i32> %sum2, <64 x i32> undef, <64 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>971  %sum3 = add <64 x i32> %sum2, %h3972  %sum = extractelement <64 x i32> %sum3, i32 0973  ret i32 %sum974}975 976; This contains an unrolled sad loop with a non-zero initial value.977; DAGCombiner reassociation previously rewrote the adds to move the constant vector further down the tree. This resulted in the vector-reduction flag being lost.978define dso_local i32 @sad_unroll_nonzero_initial(ptr %arg, ptr %arg1, ptr %arg2, ptr %arg3) {979; SSE2-LABEL: sad_unroll_nonzero_initial:980; SSE2:       # %bb.0: # %bb981; SSE2-NEXT:    movdqu (%rdi), %xmm0982; SSE2-NEXT:    movdqu (%rsi), %xmm1983; SSE2-NEXT:    psadbw %xmm0, %xmm1984; SSE2-NEXT:    movdqu (%rdx), %xmm0985; SSE2-NEXT:    movdqu (%rcx), %xmm2986; SSE2-NEXT:    psadbw %xmm0, %xmm2987; SSE2-NEXT:    paddd %xmm1, %xmm2988; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]989; SSE2-NEXT:    paddd %xmm2, %xmm0990; SSE2-NEXT:    movd %xmm0, %eax991; SSE2-NEXT:    incl %eax992; SSE2-NEXT:    retq993;994; AVX1-LABEL: sad_unroll_nonzero_initial:995; AVX1:       # %bb.0: # %bb996; AVX1-NEXT:    vmovdqu (%rdi), %xmm0997; AVX1-NEXT:    vpsadbw (%rsi), %xmm0, %xmm0998; AVX1-NEXT:    vmovdqu (%rdx), %xmm1999; AVX1-NEXT:    vpsadbw (%rcx), %xmm1, %xmm11000; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm01001; AVX1-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11002; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]1003; AVX1-NEXT:    vpaddd %xmm0, %xmm1, %xmm01004; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1005; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm01006; AVX1-NEXT:    vmovd %xmm0, %eax1007; AVX1-NEXT:    retq1008;1009; AVX2-LABEL: sad_unroll_nonzero_initial:1010; AVX2:       # %bb.0: # %bb1011; AVX2-NEXT:    vmovdqu (%rdi), %xmm01012; AVX2-NEXT:    vpsadbw (%rsi), %xmm0, %xmm01013; AVX2-NEXT:    vmovdqu (%rdx), %xmm11014; AVX2-NEXT:    vpsadbw (%rcx), %xmm1, %xmm11015; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm01016; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1017; AVX2-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01018; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm01019; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1020; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm01021; AVX2-NEXT:    vmovd %xmm0, %eax1022; AVX2-NEXT:    retq1023;1024; AVX512-LABEL: sad_unroll_nonzero_initial:1025; AVX512:       # %bb.0: # %bb1026; AVX512-NEXT:    vmovdqu (%rdi), %xmm01027; AVX512-NEXT:    vpsadbw (%rsi), %xmm0, %xmm01028; AVX512-NEXT:    vmovdqu (%rdx), %xmm11029; AVX512-NEXT:    vpsadbw (%rcx), %xmm1, %xmm11030; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm01031; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1032; AVX512-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01033; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm01034; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1035; AVX512-NEXT:    vpor %xmm1, %xmm0, %xmm01036; AVX512-NEXT:    vmovd %xmm0, %eax1037; AVX512-NEXT:    retq1038bb:1039  %tmp = load <16 x i8>, ptr %arg, align 11040  %tmp4 = load <16 x i8>, ptr %arg1, align 11041  %tmp5 = zext <16 x i8> %tmp to <16 x i32>1042  %tmp6 = zext <16 x i8> %tmp4 to <16 x i32>1043  %tmp7 = sub nsw <16 x i32> %tmp5, %tmp61044  %tmp8 = icmp slt <16 x i32> %tmp7, zeroinitializer1045  %tmp9 = sub nsw <16 x i32> zeroinitializer, %tmp71046  %tmp10 = select <16 x i1> %tmp8, <16 x i32> %tmp9, <16 x i32> %tmp71047  %tmp11 = add nuw nsw <16 x i32> %tmp10, <i32 1, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>1048  %tmp12 = load <16 x i8>, ptr %arg2, align 11049  %tmp13 = load <16 x i8>, ptr %arg3, align 11050  %tmp14 = zext <16 x i8> %tmp12 to <16 x i32>1051  %tmp15 = zext <16 x i8> %tmp13 to <16 x i32>1052  %tmp16 = sub nsw <16 x i32> %tmp14, %tmp151053  %tmp17 = icmp slt <16 x i32> %tmp16, zeroinitializer1054  %tmp18 = sub nsw <16 x i32> zeroinitializer, %tmp161055  %tmp19 = select <16 x i1> %tmp17, <16 x i32> %tmp18, <16 x i32> %tmp161056  %tmp20 = add nuw nsw <16 x i32> %tmp19, %tmp111057  %tmp21 = shufflevector <16 x i32> %tmp20, <16 x i32> undef, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1058  %tmp22 = add <16 x i32> %tmp20, %tmp211059  %tmp23 = shufflevector <16 x i32> %tmp22, <16 x i32> undef, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1060  %tmp24 = add <16 x i32> %tmp22, %tmp231061  %tmp25 = shufflevector <16 x i32> %tmp24, <16 x i32> undef, <16 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1062  %tmp26 = add <16 x i32> %tmp24, %tmp251063  %tmp27 = shufflevector <16 x i32> %tmp26, <16 x i32> undef, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1064  %tmp28 = add <16 x i32> %tmp26, %tmp271065  %tmp29 = extractelement <16 x i32> %tmp28, i64 01066  ret i32 %tmp291067}1068 1069; This test contains two absolute difference patterns joined by an add. The result of that add is then reduced to a single element.1070; SelectionDAGBuilder should tag the joining add as a vector reduction. We neeed to recognize that both sides can use psadbw.1071define dso_local i32 @sad_double_reduction(ptr %arg, ptr %arg1, ptr %arg2, ptr %arg3) {1072; SSE2-LABEL: sad_double_reduction:1073; SSE2:       # %bb.0: # %bb1074; SSE2-NEXT:    movdqu (%rdi), %xmm01075; SSE2-NEXT:    movdqu (%rsi), %xmm11076; SSE2-NEXT:    psadbw %xmm0, %xmm11077; SSE2-NEXT:    movdqu (%rdx), %xmm01078; SSE2-NEXT:    movdqu (%rcx), %xmm21079; SSE2-NEXT:    psadbw %xmm0, %xmm21080; SSE2-NEXT:    paddd %xmm1, %xmm21081; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]1082; SSE2-NEXT:    paddd %xmm2, %xmm01083; SSE2-NEXT:    movd %xmm0, %eax1084; SSE2-NEXT:    retq1085;1086; AVX-LABEL: sad_double_reduction:1087; AVX:       # %bb.0: # %bb1088; AVX-NEXT:    vmovdqu (%rdi), %xmm01089; AVX-NEXT:    vpsadbw (%rsi), %xmm0, %xmm01090; AVX-NEXT:    vmovdqu (%rdx), %xmm11091; AVX-NEXT:    vpsadbw (%rcx), %xmm1, %xmm11092; AVX-NEXT:    vpaddd %xmm0, %xmm1, %xmm01093; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1094; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm01095; AVX-NEXT:    vmovd %xmm0, %eax1096; AVX-NEXT:    retq1097bb:1098  %tmp = load <16 x i8>, ptr %arg, align 11099  %tmp4 = load <16 x i8>, ptr %arg1, align 11100  %tmp5 = zext <16 x i8> %tmp to <16 x i32>1101  %tmp6 = zext <16 x i8> %tmp4 to <16 x i32>1102  %tmp7 = sub nsw <16 x i32> %tmp5, %tmp61103  %tmp8 = icmp slt <16 x i32> %tmp7, zeroinitializer1104  %tmp9 = sub nsw <16 x i32> zeroinitializer, %tmp71105  %tmp10 = select <16 x i1> %tmp8, <16 x i32> %tmp9, <16 x i32> %tmp71106  %tmp11 = load <16 x i8>, ptr %arg2, align 11107  %tmp12 = load <16 x i8>, ptr %arg3, align 11108  %tmp13 = zext <16 x i8> %tmp11 to <16 x i32>1109  %tmp14 = zext <16 x i8> %tmp12 to <16 x i32>1110  %tmp15 = sub nsw <16 x i32> %tmp13, %tmp141111  %tmp16 = icmp slt <16 x i32> %tmp15, zeroinitializer1112  %tmp17 = sub nsw <16 x i32> zeroinitializer, %tmp151113  %tmp18 = select <16 x i1> %tmp16, <16 x i32> %tmp17, <16 x i32> %tmp151114  %tmp19 = add nuw nsw <16 x i32> %tmp18, %tmp101115  %tmp20 = shufflevector <16 x i32> %tmp19, <16 x i32> undef, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1116  %tmp21 = add <16 x i32> %tmp19, %tmp201117  %tmp22 = shufflevector <16 x i32> %tmp21, <16 x i32> undef, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1118  %tmp23 = add <16 x i32> %tmp21, %tmp221119  %tmp24 = shufflevector <16 x i32> %tmp23, <16 x i32> undef, <16 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1120  %tmp25 = add <16 x i32> %tmp23, %tmp241121  %tmp26 = shufflevector <16 x i32> %tmp25, <16 x i32> undef, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1122  %tmp27 = add <16 x i32> %tmp25, %tmp261123  %tmp28 = extractelement <16 x i32> %tmp27, i64 01124  ret i32 %tmp281125}1126 1127; This test contains two absolute difference patterns joined by an add. The result of that add is then reduced to a single element.1128; SelectionDAGBuilder should tag the joining add as a vector reduction. We neeed to recognize that both sides can use psadbw.1129define dso_local i32 @sad_double_reduction_abs(ptr %arg, ptr %arg1, ptr %arg2, ptr %arg3) {1130; SSE2-LABEL: sad_double_reduction_abs:1131; SSE2:       # %bb.0: # %bb1132; SSE2-NEXT:    movdqu (%rdi), %xmm01133; SSE2-NEXT:    movdqu (%rsi), %xmm11134; SSE2-NEXT:    psadbw %xmm0, %xmm11135; SSE2-NEXT:    movdqu (%rdx), %xmm01136; SSE2-NEXT:    movdqu (%rcx), %xmm21137; SSE2-NEXT:    psadbw %xmm0, %xmm21138; SSE2-NEXT:    paddd %xmm1, %xmm21139; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]1140; SSE2-NEXT:    paddd %xmm2, %xmm01141; SSE2-NEXT:    movd %xmm0, %eax1142; SSE2-NEXT:    retq1143;1144; AVX-LABEL: sad_double_reduction_abs:1145; AVX:       # %bb.0: # %bb1146; AVX-NEXT:    vmovdqu (%rdi), %xmm01147; AVX-NEXT:    vpsadbw (%rsi), %xmm0, %xmm01148; AVX-NEXT:    vmovdqu (%rdx), %xmm11149; AVX-NEXT:    vpsadbw (%rcx), %xmm1, %xmm11150; AVX-NEXT:    vpaddd %xmm0, %xmm1, %xmm01151; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1152; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm01153; AVX-NEXT:    vmovd %xmm0, %eax1154; AVX-NEXT:    retq1155bb:1156  %tmp = load <16 x i8>, ptr %arg, align 11157  %tmp4 = load <16 x i8>, ptr %arg1, align 11158  %tmp5 = zext <16 x i8> %tmp to <16 x i32>1159  %tmp6 = zext <16 x i8> %tmp4 to <16 x i32>1160  %tmp7 = sub nsw <16 x i32> %tmp5, %tmp61161  %tmp10 = call <16 x i32> @llvm.abs.v16i32(<16 x i32> %tmp7, i1 false)1162  %tmp11 = load <16 x i8>, ptr %arg2, align 11163  %tmp12 = load <16 x i8>, ptr %arg3, align 11164  %tmp13 = zext <16 x i8> %tmp11 to <16 x i32>1165  %tmp14 = zext <16 x i8> %tmp12 to <16 x i32>1166  %tmp15 = sub nsw <16 x i32> %tmp13, %tmp141167  %tmp18 = call <16 x i32> @llvm.abs.v16i32(<16 x i32> %tmp15, i1 false)1168  %tmp19 = add nuw nsw <16 x i32> %tmp18, %tmp101169  %tmp20 = shufflevector <16 x i32> %tmp19, <16 x i32> undef, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1170  %tmp21 = add <16 x i32> %tmp19, %tmp201171  %tmp22 = shufflevector <16 x i32> %tmp21, <16 x i32> undef, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1172  %tmp23 = add <16 x i32> %tmp21, %tmp221173  %tmp24 = shufflevector <16 x i32> %tmp23, <16 x i32> undef, <16 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1174  %tmp25 = add <16 x i32> %tmp23, %tmp241175  %tmp26 = shufflevector <16 x i32> %tmp25, <16 x i32> undef, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1176  %tmp27 = add <16 x i32> %tmp25, %tmp261177  %tmp28 = extractelement <16 x i32> %tmp27, i64 01178  ret i32 %tmp281179}1180declare <16 x i32> @llvm.abs.v16i32(<16 x i32>, i1 immarg)1181 1182define i32 @PR143456(ptr %p0, ptr %p1) {1183; SSE2-LABEL: PR143456:1184; SSE2:       # %bb.0:1185; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero1186; SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero1187; SSE2-NEXT:    psadbw %xmm0, %xmm11188; SSE2-NEXT:    movd %xmm1, %eax1189; SSE2-NEXT:    movzbl %al, %eax1190; SSE2-NEXT:    retq1191;1192; AVX-LABEL: PR143456:1193; AVX:       # %bb.0:1194; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero1195; AVX-NEXT:    vmovq {{.*#+}} xmm1 = mem[0],zero1196; AVX-NEXT:    vpsadbw %xmm1, %xmm0, %xmm01197; AVX-NEXT:    vpextrb $0, %xmm0, %eax1198; AVX-NEXT:    retq1199  %v0 = load <8 x i8>, ptr %p0, align 11200  %v1 = load <8 x i8>, ptr %p1, align 11201  %max = tail call <8 x i8> @llvm.umax.v8i8(<8 x i8> %v0, <8 x i8> %v1)1202  %min = tail call <8 x i8> @llvm.umin.v8i8(<8 x i8> %v0, <8 x i8> %v1)1203  %abd = sub nuw <8 x i8> %max, %min1204  %rdx.shuf = shufflevector <8 x i8> %abd, <8 x i8> poison, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison>1205  %bin.rdx = add <8 x i8> %abd, %rdx.shuf1206  %rdx.shuf15 = shufflevector <8 x i8> %bin.rdx, <8 x i8> poison, <8 x i32> <i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>1207  %bin.rdx16 = add <8 x i8> %bin.rdx, %rdx.shuf151208  %rdx.shuf17 = shufflevector <8 x i8> %bin.rdx16, <8 x i8> poison, <8 x i32> <i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>1209  %bin.rdx18 = add <8 x i8> %bin.rdx16, %rdx.shuf171210  %elt = extractelement <8 x i8> %bin.rdx18, i32 01211  %res = zext i8 %elt to i321212  ret i32 %res1213}1214declare <8 x i8> @llvm.umax.v8i8(<8 x i8>, <8 x i8>)1215declare <8 x i8> @llvm.umin.v8i8(<8 x i8>, <8 x i8>)1216declare i8 @llvm.vector.reduce.add.v8i8(<8 x i8>)1217 1218attributes #0 = { nofree nosync nounwind readnone speculatable willreturn }1219