diff --git a/llvm/test/CodeGen/X86/movmsk-cmp.ll b/llvm/test/CodeGen/X86/movmsk-cmp.ll index 6ed44771f703e..f7ba49ce0e127 100644 --- a/llvm/test/CodeGen/X86/movmsk-cmp.ll +++ b/llvm/test/CodeGen/X86/movmsk-cmp.ll @@ -4454,3 +4454,140 @@ define i32 @PR39665_c_ray_opt(<2 x double> %x, <2 x double> %y) { %r = select i1 %u, i32 42, i32 99 ret i32 %r } + +define i32 @pr67287(<2 x i64> %broadcast.splatinsert25) { +; SSE2-LABEL: pr67287: +; SSE2: # %bb.0: # %entry +; SSE2-NEXT: movl $3, %eax +; SSE2-NEXT: testl %eax, %eax +; SSE2-NEXT: jne .LBB97_2 +; SSE2-NEXT: # %bb.1: # %entry +; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; SSE2-NEXT: pxor %xmm1, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 +; SSE2-NEXT: movd %xmm1, %eax +; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: jne .LBB97_2 +; SSE2-NEXT: # %bb.3: # %middle.block +; SSE2-NEXT: xorl %eax, %eax +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB97_2: +; SSE2-NEXT: movw $0, 0 +; SSE2-NEXT: xorl %eax, %eax +; SSE2-NEXT: retq +; +; SSE41-LABEL: pr67287: +; SSE41: # %bb.0: # %entry +; SSE41-NEXT: pxor %xmm1, %xmm1 +; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7] +; SSE41-NEXT: pcmpeqq %xmm1, %xmm0 +; SSE41-NEXT: movmskpd %xmm0, %eax +; SSE41-NEXT: testl %eax, %eax +; SSE41-NEXT: jne .LBB97_2 +; SSE41-NEXT: # %bb.1: # %entry +; SSE41-NEXT: movd %xmm0, %eax +; SSE41-NEXT: testb $1, %al +; SSE41-NEXT: jne .LBB97_2 +; SSE41-NEXT: # %bb.3: # %middle.block +; SSE41-NEXT: xorl %eax, %eax +; SSE41-NEXT: retq +; SSE41-NEXT: .LBB97_2: +; SSE41-NEXT: movw $0, 0 +; SSE41-NEXT: xorl %eax, %eax +; SSE41-NEXT: retq +; +; AVX1-LABEL: pr67287: +; AVX1: # %bb.0: # %entry +; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 +; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7] +; AVX1-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0 +; AVX1-NEXT: vtestpd %xmm0, %xmm0 +; AVX1-NEXT: jne .LBB97_2 +; AVX1-NEXT: # %bb.1: # %entry +; AVX1-NEXT: vmovd %xmm0, %eax +; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: jne .LBB97_2 +; AVX1-NEXT: # %bb.3: # %middle.block +; AVX1-NEXT: xorl %eax, %eax +; AVX1-NEXT: retq +; AVX1-NEXT: .LBB97_2: +; AVX1-NEXT: movw $0, 0 +; AVX1-NEXT: xorl %eax, %eax +; AVX1-NEXT: retq +; +; AVX2-LABEL: pr67287: +; AVX2: # %bb.0: # %entry +; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 +; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3] +; AVX2-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0 +; AVX2-NEXT: vtestpd %xmm0, %xmm0 +; AVX2-NEXT: jne .LBB97_2 +; AVX2-NEXT: # %bb.1: # %entry +; AVX2-NEXT: vmovd %xmm0, %eax +; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: jne .LBB97_2 +; AVX2-NEXT: # %bb.3: # %middle.block +; AVX2-NEXT: xorl %eax, %eax +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB97_2: +; AVX2-NEXT: movw $0, 0 +; AVX2-NEXT: xorl %eax, %eax +; AVX2-NEXT: retq +; +; KNL-LABEL: pr67287: +; KNL: # %bb.0: # %entry +; KNL-NEXT: vpxor %xmm1, %xmm1, %xmm1 +; KNL-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3] +; KNL-NEXT: vptestnmq %zmm0, %zmm0, %k0 +; KNL-NEXT: kmovw %k0, %eax +; KNL-NEXT: testb $3, %al +; KNL-NEXT: jne .LBB97_2 +; KNL-NEXT: # %bb.1: # %entry +; KNL-NEXT: kmovw %k0, %eax +; KNL-NEXT: testb $1, %al +; KNL-NEXT: jne .LBB97_2 +; KNL-NEXT: # %bb.3: # %middle.block +; KNL-NEXT: xorl %eax, %eax +; KNL-NEXT: vzeroupper +; KNL-NEXT: retq +; KNL-NEXT: .LBB97_2: +; KNL-NEXT: movw $0, 0 +; KNL-NEXT: xorl %eax, %eax +; KNL-NEXT: vzeroupper +; KNL-NEXT: retq +; +; SKX-LABEL: pr67287: +; SKX: # %bb.0: # %entry +; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1 +; SKX-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3] +; SKX-NEXT: vptestnmq %xmm0, %xmm0, %k0 +; SKX-NEXT: kortestb %k0, %k0 +; SKX-NEXT: jne .LBB97_2 +; SKX-NEXT: # %bb.1: # %entry +; SKX-NEXT: kmovd %k0, %eax +; SKX-NEXT: testb $1, %al +; SKX-NEXT: jne .LBB97_2 +; SKX-NEXT: # %bb.3: # %middle.block +; SKX-NEXT: xorl %eax, %eax +; SKX-NEXT: retq +; SKX-NEXT: .LBB97_2: +; SKX-NEXT: movw $0, 0 +; SKX-NEXT: xorl %eax, %eax +; SKX-NEXT: retq +entry: + %0 = and <2 x i64> %broadcast.splatinsert25, + %1 = icmp eq <2 x i64> %0, zeroinitializer + %shift = shufflevector <2 x i1> %1, <2 x i1> zeroinitializer, <2 x i32> + %2 = or <2 x i1> %1, %shift + %3 = extractelement <2 x i1> %2, i64 0 + %4 = extractelement <2 x i1> %1, i64 0 + %5 = or i1 %3, %4 + br i1 %5, label %6, label %middle.block + +6: ; preds = %entry + store i16 0, ptr null, align 2 + br label %middle.block + +middle.block: ; preds = %6, %entry + ret i32 0 +}