Issue |
120203
|
Summary |
[X86] AVX1 targets failure to recognise VPTEST YMM pattern
|
Labels |
backend:X86
|
Assignees |
|
Reporter |
RKSimon
|
```ll
define i1 @both_equal_v32qi(<32 x i8> %a, <32 x i8> %b, <32 x i8> %v) {
entry:
%0 = icmp ne <32 x i8> %v, %a
%1 = icmp ne <32 x i8> %v, %b
%2 = or <32 x i1> %0, %1
%3 = bitcast <32 x i1> %2 to i32
%cmp5 = icmp eq i32 %3, 0
ret i1 %cmp5
}
define i1 @both_equal_v16qi(<16 x i8> %a, <16 x i8> %b, <16 x i8> %v) {
entry:
%0 = icmp ne <16 x i8> %v, %a
%1 = icmp ne <16 x i8> %v, %b
%2 = or <16 x i1> %0, %1
%3 = bitcast <16 x i1> %2 to i16
%cmp5 = icmp eq i16 %3, 0
ret i1 %cmp5
}
```
llc -mcpu=znver2
```asm
both_equal_v32qi: # @both_equal_v32qi
vpxor %ymm0, %ymm2, %ymm0
vpxor %ymm1, %ymm2, %ymm1
vpor %ymm1, %ymm0, %ymm0
vptest %ymm0, %ymm0
sete %al
vzeroupper
retq
both_equal_v16qi: # @both_equal_v16qi
vpxor %xmm0, %xmm2, %xmm0
vpxor %xmm1, %xmm2, %xmm1
vpor %xmm1, %xmm0, %xmm0
vptest %xmm0, %xmm0
sete %al
retq
```
llc -mcpu=btver2
```asm
both_equal_v32qi: # @both_equal_v32qi
vpcmpeqb %xmm0, %xmm2, %xmm3
vextractf128 $1, %ymm2, %xmm4
vpcmpeqb %xmm1, %xmm2, %xmm2
vextractf128 $1, %ymm0, %xmm0
vextractf128 $1, %ymm1, %xmm1
vpcmpeqb %xmm0, %xmm4, %xmm0
vpcmpeqb %xmm1, %xmm4, %xmm1
vpand %xmm2, %xmm3, %xmm2
vpand %xmm1, %xmm0, %xmm0
vpand %xmm0, %xmm2, %xmm0
vpmovmskb %xmm0, %eax
xorl $65535, %eax # imm = 0xFFFF
sete %al
retq
both_equal_v16qi: # @both_equal_v16qi
vpxor %xmm0, %xmm2, %xmm0
vpxor %xmm1, %xmm2, %xmm1
vpor %xmm1, %xmm0, %xmm0
vptest %xmm0, %xmm0
sete %al
retq
```
The AVX2 codegen is legal on AVX1 (just replace vpxor/vpor with vxorps/vorps).
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs