Skip to content

Commit 65a576e

Browse files
committed
[X86] Add tests for incorrectly optimizing out shuffle used in movmsk; PR67287
1 parent cbafb6f commit 65a576e

File tree

1 file changed

+137
-0
lines changed

1 file changed

+137
-0
lines changed

llvm/test/CodeGen/X86/movmsk-cmp.ll

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4430,3 +4430,140 @@ define i32 @PR39665_c_ray_opt(<2 x double> %x, <2 x double> %y) {
44304430
%r = select i1 %u, i32 42, i32 99
44314431
ret i32 %r
44324432
}
4433+
4434+
define i32 @pr67287(<2 x i64> %broadcast.splatinsert25) {
4435+
; SSE2-LABEL: pr67287:
4436+
; SSE2: # %bb.0: # %entry
4437+
; SSE2-NEXT: movl $3, %eax
4438+
; SSE2-NEXT: testl %eax, %eax
4439+
; SSE2-NEXT: jne .LBB97_2
4440+
; SSE2-NEXT: # %bb.1: # %entry
4441+
; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
4442+
; SSE2-NEXT: pxor %xmm1, %xmm1
4443+
; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
4444+
; SSE2-NEXT: movd %xmm1, %eax
4445+
; SSE2-NEXT: testb $1, %al
4446+
; SSE2-NEXT: jne .LBB97_2
4447+
; SSE2-NEXT: # %bb.3: # %middle.block
4448+
; SSE2-NEXT: xorl %eax, %eax
4449+
; SSE2-NEXT: retq
4450+
; SSE2-NEXT: .LBB97_2:
4451+
; SSE2-NEXT: movw $0, 0
4452+
; SSE2-NEXT: xorl %eax, %eax
4453+
; SSE2-NEXT: retq
4454+
;
4455+
; SSE41-LABEL: pr67287:
4456+
; SSE41: # %bb.0: # %entry
4457+
; SSE41-NEXT: pxor %xmm1, %xmm1
4458+
; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
4459+
; SSE41-NEXT: pcmpeqq %xmm1, %xmm0
4460+
; SSE41-NEXT: movmskpd %xmm0, %eax
4461+
; SSE41-NEXT: testl %eax, %eax
4462+
; SSE41-NEXT: jne .LBB97_2
4463+
; SSE41-NEXT: # %bb.1: # %entry
4464+
; SSE41-NEXT: movd %xmm0, %eax
4465+
; SSE41-NEXT: testb $1, %al
4466+
; SSE41-NEXT: jne .LBB97_2
4467+
; SSE41-NEXT: # %bb.3: # %middle.block
4468+
; SSE41-NEXT: xorl %eax, %eax
4469+
; SSE41-NEXT: retq
4470+
; SSE41-NEXT: .LBB97_2:
4471+
; SSE41-NEXT: movw $0, 0
4472+
; SSE41-NEXT: xorl %eax, %eax
4473+
; SSE41-NEXT: retq
4474+
;
4475+
; AVX1-LABEL: pr67287:
4476+
; AVX1: # %bb.0: # %entry
4477+
; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
4478+
; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
4479+
; AVX1-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
4480+
; AVX1-NEXT: vtestpd %xmm0, %xmm0
4481+
; AVX1-NEXT: jne .LBB97_2
4482+
; AVX1-NEXT: # %bb.1: # %entry
4483+
; AVX1-NEXT: vmovd %xmm0, %eax
4484+
; AVX1-NEXT: testb $1, %al
4485+
; AVX1-NEXT: jne .LBB97_2
4486+
; AVX1-NEXT: # %bb.3: # %middle.block
4487+
; AVX1-NEXT: xorl %eax, %eax
4488+
; AVX1-NEXT: retq
4489+
; AVX1-NEXT: .LBB97_2:
4490+
; AVX1-NEXT: movw $0, 0
4491+
; AVX1-NEXT: xorl %eax, %eax
4492+
; AVX1-NEXT: retq
4493+
;
4494+
; AVX2-LABEL: pr67287:
4495+
; AVX2: # %bb.0: # %entry
4496+
; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
4497+
; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
4498+
; AVX2-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
4499+
; AVX2-NEXT: vtestpd %xmm0, %xmm0
4500+
; AVX2-NEXT: jne .LBB97_2
4501+
; AVX2-NEXT: # %bb.1: # %entry
4502+
; AVX2-NEXT: vmovd %xmm0, %eax
4503+
; AVX2-NEXT: testb $1, %al
4504+
; AVX2-NEXT: jne .LBB97_2
4505+
; AVX2-NEXT: # %bb.3: # %middle.block
4506+
; AVX2-NEXT: xorl %eax, %eax
4507+
; AVX2-NEXT: retq
4508+
; AVX2-NEXT: .LBB97_2:
4509+
; AVX2-NEXT: movw $0, 0
4510+
; AVX2-NEXT: xorl %eax, %eax
4511+
; AVX2-NEXT: retq
4512+
;
4513+
; KNL-LABEL: pr67287:
4514+
; KNL: # %bb.0: # %entry
4515+
; KNL-NEXT: vpxor %xmm1, %xmm1, %xmm1
4516+
; KNL-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
4517+
; KNL-NEXT: vptestnmq %zmm0, %zmm0, %k0
4518+
; KNL-NEXT: kmovw %k0, %eax
4519+
; KNL-NEXT: testb $3, %al
4520+
; KNL-NEXT: jne .LBB97_2
4521+
; KNL-NEXT: # %bb.1: # %entry
4522+
; KNL-NEXT: kmovw %k0, %eax
4523+
; KNL-NEXT: testb $1, %al
4524+
; KNL-NEXT: jne .LBB97_2
4525+
; KNL-NEXT: # %bb.3: # %middle.block
4526+
; KNL-NEXT: xorl %eax, %eax
4527+
; KNL-NEXT: vzeroupper
4528+
; KNL-NEXT: retq
4529+
; KNL-NEXT: .LBB97_2:
4530+
; KNL-NEXT: movw $0, 0
4531+
; KNL-NEXT: xorl %eax, %eax
4532+
; KNL-NEXT: vzeroupper
4533+
; KNL-NEXT: retq
4534+
;
4535+
; SKX-LABEL: pr67287:
4536+
; SKX: # %bb.0: # %entry
4537+
; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1
4538+
; SKX-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
4539+
; SKX-NEXT: vptestnmq %xmm0, %xmm0, %k0
4540+
; SKX-NEXT: kortestb %k0, %k0
4541+
; SKX-NEXT: jne .LBB97_2
4542+
; SKX-NEXT: # %bb.1: # %entry
4543+
; SKX-NEXT: kmovd %k0, %eax
4544+
; SKX-NEXT: testb $1, %al
4545+
; SKX-NEXT: jne .LBB97_2
4546+
; SKX-NEXT: # %bb.3: # %middle.block
4547+
; SKX-NEXT: xorl %eax, %eax
4548+
; SKX-NEXT: retq
4549+
; SKX-NEXT: .LBB97_2:
4550+
; SKX-NEXT: movw $0, 0
4551+
; SKX-NEXT: xorl %eax, %eax
4552+
; SKX-NEXT: retq
4553+
entry:
4554+
%0 = and <2 x i64> %broadcast.splatinsert25, <i64 4294967295, i64 4294967295>
4555+
%1 = icmp eq <2 x i64> %0, zeroinitializer
4556+
%shift = shufflevector <2 x i1> %1, <2 x i1> zeroinitializer, <2 x i32> <i32 1, i32 poison>
4557+
%2 = or <2 x i1> %1, %shift
4558+
%3 = extractelement <2 x i1> %2, i64 0
4559+
%4 = extractelement <2 x i1> %1, i64 0
4560+
%5 = or i1 %3, %4
4561+
br i1 %5, label %6, label %middle.block
4562+
4563+
6: ; preds = %entry
4564+
store i16 0, ptr null, align 2
4565+
br label %middle.block
4566+
4567+
middle.block: ; preds = %6, %entry
4568+
ret i32 0
4569+
}

0 commit comments

Comments
 (0)