[llvm] [X86] Prefer AVX512 VPCMP against zero over splat(1) for sle/slt (PR #216716)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 17 09:44:54 PDT 2026
================
@@ -0,0 +1,179 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64-v3 | FileCheck %s --check-prefix=AVX2
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64-v4 | FileCheck %s --check-prefix=AVX512
+
+; Prefer VPCMP against zero over a constant-pool splat(1)/splat(-1).
+; See https://github.com/llvm/llvm-project/issues/216660
+
+define i16 @cmp_sle_v16i8(<16 x i8> %x) {
+; AVX2-LABEL: cmp_sle_v16i8:
+; AVX2: # %bb.0:
+; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
+; AVX2-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0
+; AVX2-NEXT: vpmovmskb %xmm0, %eax
+; AVX2-NEXT: notl %eax
+; AVX2-NEXT: # kill: def $ax killed $ax killed $eax
+; AVX2-NEXT: retq
+;
+; AVX512-LABEL: cmp_sle_v16i8:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1
+; AVX512-NEXT: vpcmpleb %xmm1, %xmm0, %k0
+; AVX512-NEXT: kmovd %k0, %eax
+; AVX512-NEXT: # kill: def $ax killed $ax killed $eax
+; AVX512-NEXT: retq
+ %c = icmp sle <16 x i8> %x, splat (i8 0)
+ %r = bitcast <16 x i1> %c to i16
+ ret i16 %r
+}
+
+define i16 @cmp_slt1_v16i8(<16 x i8> %x) {
+; AVX2-LABEL: cmp_slt1_v16i8:
+; AVX2: # %bb.0:
+; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
+; AVX2-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0
+; AVX2-NEXT: vpmovmskb %xmm0, %eax
+; AVX2-NEXT: notl %eax
+; AVX2-NEXT: # kill: def $ax killed $ax killed $eax
+; AVX2-NEXT: retq
+;
+; AVX512-LABEL: cmp_slt1_v16i8:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1
+; AVX512-NEXT: vpcmpleb %xmm1, %xmm0, %k0
+; AVX512-NEXT: kmovd %k0, %eax
+; AVX512-NEXT: # kill: def $ax killed $ax killed $eax
+; AVX512-NEXT: retq
+ %c = icmp slt <16 x i8> %x, splat (i8 1)
+ %r = bitcast <16 x i1> %c to i16
+ ret i16 %r
+}
+
+define i16 @cmp_sgt1_lhs_v16i8(<16 x i8> %x) {
+; AVX2-LABEL: cmp_sgt1_lhs_v16i8:
+; AVX2: # %bb.0:
+; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
+; AVX2-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0
+; AVX2-NEXT: vpmovmskb %xmm0, %eax
+; AVX2-NEXT: notl %eax
+; AVX2-NEXT: # kill: def $ax killed $ax killed $eax
+; AVX2-NEXT: retq
+;
+; AVX512-LABEL: cmp_sgt1_lhs_v16i8:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1
+; AVX512-NEXT: vpcmpleb %xmm1, %xmm0, %k0
+; AVX512-NEXT: kmovd %k0, %eax
+; AVX512-NEXT: # kill: def $ax killed $ax killed $eax
+; AVX512-NEXT: retq
+ %c = icmp sgt <16 x i8> splat (i8 1), %x
+ %r = bitcast <16 x i1> %c to i16
+ ret i16 %r
+}
+
+define i16 @cmp_sge_v16i8(<16 x i8> %x) {
+; AVX2-LABEL: cmp_sge_v16i8:
+; AVX2: # %bb.0:
+; AVX2-NEXT: vpmovmskb %xmm0, %eax
+; AVX2-NEXT: notl %eax
+; AVX2-NEXT: # kill: def $ax killed $ax killed $eax
+; AVX2-NEXT: retq
+;
+; AVX512-LABEL: cmp_sge_v16i8:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1
+; AVX512-NEXT: vpcmpnltb %xmm1, %xmm0, %k0
----------------
Andarwinux wrote:
This sounds like a potential candidate for CompressEVEX, I'll open a separate issue after this PR merged.
https://github.com/llvm/llvm-project/pull/216716
More information about the llvm-commits
mailing list