174 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX14; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX25; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64-v4 | FileCheck %s --check-prefixes=AVX5126 7define i32 @PR63108() {8; SSE-LABEL: PR63108:9; SSE: # %bb.0: # %entry10; SSE-NEXT: testb %al, %al11; SSE-NEXT: je .LBB0_212; SSE-NEXT: # %bb.1:13; SSE-NEXT: movd {{.*#+}} xmm0 = [57339,0,0,0]14; SSE-NEXT: jmp .LBB0_515; SSE-NEXT: .LBB0_2: # %vector.body.preheader16; SSE-NEXT: pxor %xmm0, %xmm017; SSE-NEXT: movd {{.*#+}} xmm1 = [57339,0,0,0]18; SSE-NEXT: xorl %eax, %eax19; SSE-NEXT: .p2align 420; SSE-NEXT: .LBB0_3: # %vector.body21; SSE-NEXT: # =>This Inner Loop Header: Depth=122; SSE-NEXT: movdqa %xmm1, %xmm223; SSE-NEXT: testb %al, %al24; SSE-NEXT: pxor %xmm1, %xmm125; SSE-NEXT: jne .LBB0_326; SSE-NEXT: # %bb.4: # %middle.block27; SSE-NEXT: pxor %xmm2, %xmm028; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]29; SSE-NEXT: pxor %xmm0, %xmm130; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]31; SSE-NEXT: pxor %xmm1, %xmm232; SSE-NEXT: movdqa %xmm2, %xmm033; SSE-NEXT: psrld $16, %xmm034; SSE-NEXT: pxor %xmm2, %xmm035; SSE-NEXT: .LBB0_5: # %for.cond.cleanup36; SSE-NEXT: movd %xmm0, %eax37; SSE-NEXT: movsbl %al, %ecx38; SSE-NEXT: shrl $8, %eax39; SSE-NEXT: movsbl %al, %eax40; SSE-NEXT: addl %ecx, %eax41; SSE-NEXT: retq42;43; AVX1-LABEL: PR63108:44; AVX1: # %bb.0: # %entry45; AVX1-NEXT: testb %al, %al46; AVX1-NEXT: je .LBB0_247; AVX1-NEXT: # %bb.1:48; AVX1-NEXT: vmovd {{.*#+}} xmm0 = [57339,0,0,0]49; AVX1-NEXT: jmp .LBB0_550; AVX1-NEXT: .LBB0_2: # %vector.body.preheader51; AVX1-NEXT: vmovss {{.*#+}} xmm0 = [57339,0,0,0]52; AVX1-NEXT: xorl %eax, %eax53; AVX1-NEXT: .p2align 454; AVX1-NEXT: .LBB0_3: # %vector.body55; AVX1-NEXT: # =>This Inner Loop Header: Depth=156; AVX1-NEXT: vmovaps %ymm0, %ymm157; AVX1-NEXT: vxorps %xmm0, %xmm0, %xmm058; AVX1-NEXT: testb %al, %al59; AVX1-NEXT: jne .LBB0_360; AVX1-NEXT: # %bb.4: # %middle.block61; AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm062; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm163; AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm064; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]65; AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm066; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]67; AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm068; AVX1-NEXT: vpsrld $16, %xmm0, %xmm169; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm070; AVX1-NEXT: .LBB0_5: # %for.cond.cleanup71; AVX1-NEXT: vmovd %xmm0, %eax72; AVX1-NEXT: vpextrb $1, %xmm0, %ecx73; AVX1-NEXT: movsbl %al, %edx74; AVX1-NEXT: movsbl %cl, %eax75; AVX1-NEXT: addl %edx, %eax76; AVX1-NEXT: vzeroupper77; AVX1-NEXT: retq78;79; AVX2-LABEL: PR63108:80; AVX2: # %bb.0: # %entry81; AVX2-NEXT: testb %al, %al82; AVX2-NEXT: je .LBB0_283; AVX2-NEXT: # %bb.1:84; AVX2-NEXT: vpbroadcastw {{.*#+}} xmm0 = [251,223,251,223,251,223,251,223,251,223,251,223,251,223,251,223]85; AVX2-NEXT: jmp .LBB0_586; AVX2-NEXT: .LBB0_2: # %vector.body.preheader87; AVX2-NEXT: vmovd {{.*#+}} xmm0 = [57339,0,0,0]88; AVX2-NEXT: xorl %eax, %eax89; AVX2-NEXT: .p2align 490; AVX2-NEXT: .LBB0_3: # %vector.body91; AVX2-NEXT: # =>This Inner Loop Header: Depth=192; AVX2-NEXT: vmovdqa %ymm0, %ymm193; AVX2-NEXT: vpxor %xmm0, %xmm0, %xmm094; AVX2-NEXT: testb %al, %al95; AVX2-NEXT: jne .LBB0_396; AVX2-NEXT: # %bb.4: # %middle.block97; AVX2-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm098; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm199; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0100; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]101; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0102; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]103; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0104; AVX2-NEXT: vpsrld $16, %xmm0, %xmm1105; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0106; AVX2-NEXT: .LBB0_5: # %for.cond.cleanup107; AVX2-NEXT: vmovd %xmm0, %eax108; AVX2-NEXT: vpextrb $1, %xmm0, %ecx109; AVX2-NEXT: movsbl %al, %edx110; AVX2-NEXT: movsbl %cl, %eax111; AVX2-NEXT: addl %edx, %eax112; AVX2-NEXT: vzeroupper113; AVX2-NEXT: retq114;115; AVX512-LABEL: PR63108:116; AVX512: # %bb.0: # %entry117; AVX512-NEXT: testb %al, %al118; AVX512-NEXT: je .LBB0_2119; AVX512-NEXT: # %bb.1:120; AVX512-NEXT: vmovd {{.*#+}} xmm0 = [57339,0,0,0]121; AVX512-NEXT: jmp .LBB0_5122; AVX512-NEXT: .LBB0_2: # %vector.body.preheader123; AVX512-NEXT: vmovd {{.*#+}} xmm0 = [57339,0,0,0]124; AVX512-NEXT: xorl %eax, %eax125; AVX512-NEXT: .p2align 4126; AVX512-NEXT: .LBB0_3: # %vector.body127; AVX512-NEXT: # =>This Inner Loop Header: Depth=1128; AVX512-NEXT: vmovdqa %ymm0, %ymm1129; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm0130; AVX512-NEXT: testb %al, %al131; AVX512-NEXT: jne .LBB0_3132; AVX512-NEXT: # %bb.4: # %middle.block133; AVX512-NEXT: vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm0134; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1135; AVX512-NEXT: vpxor %xmm1, %xmm0, %xmm0136; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]137; AVX512-NEXT: vpxor %xmm1, %xmm0, %xmm0138; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]139; AVX512-NEXT: vpxor %xmm1, %xmm0, %xmm0140; AVX512-NEXT: vpsrld $16, %xmm0, %xmm1141; AVX512-NEXT: vpxor %xmm1, %xmm0, %xmm0142; AVX512-NEXT: .LBB0_5: # %for.cond.cleanup143; AVX512-NEXT: vmovd %xmm0, %eax144; AVX512-NEXT: vpextrb $1, %xmm0, %ecx145; AVX512-NEXT: movsbl %al, %edx146; AVX512-NEXT: movsbl %cl, %eax147; AVX512-NEXT: addl %edx, %eax148; AVX512-NEXT: vzeroupper149; AVX512-NEXT: retq150entry:151 br i1 poison, label %for.cond.cleanup, label %vector.body152 153vector.body: ; preds = %vector.body, %entry154 %vec.phi = phi <16 x i16> [ zeroinitializer, %vector.body ], [ <i16 -8197, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, %entry ]155 %0 = icmp eq i32 poison, poison156 br i1 %0, label %middle.block, label %vector.body157 158middle.block: ; preds = %vector.body159 %bin.rdx22 = xor <16 x i16> %vec.phi, <i16 256, i16 256, i16 256, i16 256, i16 256, i16 256, i16 256, i16 256, i16 256, i16 256, i16 256, i16 256, i16 256, i16 256, i16 256, i16 256>160 %1 = tail call i16 @llvm.vector.reduce.xor.v16i16(<16 x i16> %bin.rdx22)161 %2 = bitcast i16 %1 to <2 x i8>162 br label %for.cond.cleanup163 164for.cond.cleanup: ; preds = %middle.block, %entry165 %id15142.0.lcssa = phi <2 x i8> [ <i8 -5, i8 -33>, %entry ], [ %2, %middle.block ]166 %vecext = extractelement <2 x i8> %id15142.0.lcssa, i64 0167 %vecext8 = extractelement <2 x i8> %id15142.0.lcssa, i64 1168 %conv7 = sext i8 %vecext to i32169 %conv9 = sext i8 %vecext8 to i32170 %res = add i32 %conv7, %conv9171 ret i32 %res172}173declare i16 @llvm.vector.reduce.xor.v16i16(<16 x i16>)174