[llvm] [X86] combineKSHIFT - fold kshift(logicop(X,C1),C2) -> logicop(kshift(X,C2),kshift(C1,C2)) (PR #194343)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 27 04:00:19 PDT 2026
https://github.com/RKSimon created https://github.com/llvm/llvm-project/pull/194343
Attempt to push KSHIFTs up through logicops in the DAG to expose additional folding
Requires us to add constant folding handling for KSHIFTL/R instructions as well
Yak shaving for #193700
>From 7d34d43173b0bb8bd924eda88a04d7429fcd6eb4 Mon Sep 17 00:00:00 2001
From: Simon Pilgrim <llvm-dev at redking.me.uk>
Date: Mon, 27 Apr 2026 11:58:36 +0100
Subject: [PATCH] [X86] combineKSHIFT - fold kshift(logicop(X,C1),C2) ->
logicop(kshift(X,C2),kshift(C1,C2))
Attempt to push kshifts up through logicops in the DAG to expose additional folding
Requires us to add constant folding handling for kshiftl/r instructions as well
Yak shaving for #193700
---
llvm/lib/Target/X86/X86ISelLowering.cpp | 23 ++++-
llvm/test/CodeGen/X86/avx512-ext.ll | 12 +--
.../test/CodeGen/X86/avx512-insert-extract.ll | 14 ++-
llvm/test/CodeGen/X86/avx512-mask-op.ll | 16 +---
llvm/test/CodeGen/X86/masked_store.ll | 8 +-
.../CodeGen/X86/vector-replicaton-i1-mask.ll | 86 +++++++++----------
6 files changed, 80 insertions(+), 79 deletions(-)
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index cbae4a97527a8..16170045a8f4c 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -61857,15 +61857,23 @@ static SDValue combineKSHIFT(SDNode *N, SelectionDAG &DAG,
uint64_t Amt = N->getConstantOperandVal(1);
unsigned Opcode = N->getOpcode();
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
+ SDLoc DL(N);
if (ISD::isBuildVectorAllZeros(Src.getNode()))
- return DAG.getConstant(0, SDLoc(N), VT);
+ return DAG.getConstant(0, DL, VT);
+
+ // Constant Fold.
+ if (auto *SrcC = dyn_cast<ConstantSDNode>(peekThroughBitcasts(Src))) {
+ APInt NewCst = Opcode == X86ISD::KSHIFTR ? SrcC->getAPIntValue().lshr(Amt)
+ : SrcC->getAPIntValue().shl(Amt);
+ return DAG.getBitcast(VT,
+ DAG.getConstant(NewCst, DL, SrcC->getValueType(0)));
+ }
// Fold kshiftr(extract_subvector(X,C1),C2)
// --> extract_subvector(kshiftr(X,C1+C2),0)
// Fold kshiftr(kshiftr(X,C1),C2) --> kshiftr(X,C1+C2)
if (Opcode == X86ISD::KSHIFTR) {
- SDLoc DL(N);
if (Src.getOpcode() == ISD::EXTRACT_SUBVECTOR ||
Src.getOpcode() == X86ISD::KSHIFTR) {
SDValue Inner = Src.getOperand(0);
@@ -61880,6 +61888,17 @@ static SDValue combineKSHIFT(SDNode *N, SelectionDAG &DAG,
}
}
+ // Fold kshift(logicop(X,C1),C2)
+ // --> logicop(kshift(X,C2),kshift(C1,C2))
+ if (ISD::isBitwiseLogicOp(Src.getOpcode()) &&
+ isa<ConstantSDNode>(peekThroughBitcasts(Src.getOperand(1)))) {
+ SDValue LHS =
+ DAG.getNode(Opcode, DL, VT, Src.getOperand(0), N->getOperand(1));
+ SDValue RHS =
+ DAG.getNode(Opcode, DL, VT, Src.getOperand(1), N->getOperand(1));
+ return DAG.getNode(Src.getOpcode(), DL, VT, LHS, RHS);
+ }
+
APInt DemandedElts = APInt::getAllOnes(VT.getVectorNumElements());
if (TLI.SimplifyDemandedVectorElts(SDValue(N, 0), DemandedElts, DCI))
return SDValue(N, 0);
diff --git a/llvm/test/CodeGen/X86/avx512-ext.ll b/llvm/test/CodeGen/X86/avx512-ext.ll
index 43ca488351986..2a2c95d85c3f7 100644
--- a/llvm/test/CodeGen/X86/avx512-ext.ll
+++ b/llvm/test/CodeGen/X86/avx512-ext.ll
@@ -1777,9 +1777,7 @@ define i16 @trunc_i32_to_i1(i32 %a) {
; KNL-NEXT: kmovw %edi, %k0
; KNL-NEXT: movw $-4, %ax
; KNL-NEXT: kmovw %eax, %k1
-; KNL-NEXT: kshiftrw $1, %k1, %k1
-; KNL-NEXT: kshiftlw $1, %k1, %k1
-; KNL-NEXT: korw %k0, %k1, %k0
+; KNL-NEXT: korw %k1, %k0, %k0
; KNL-NEXT: kmovw %k0, %eax
; KNL-NEXT: # kill: def $ax killed $ax killed $eax
; KNL-NEXT: retq
@@ -1790,9 +1788,7 @@ define i16 @trunc_i32_to_i1(i32 %a) {
; SKX-NEXT: kmovw %edi, %k0
; SKX-NEXT: movw $-4, %ax
; SKX-NEXT: kmovd %eax, %k1
-; SKX-NEXT: kshiftrw $1, %k1, %k1
-; SKX-NEXT: kshiftlw $1, %k1, %k1
-; SKX-NEXT: korw %k0, %k1, %k0
+; SKX-NEXT: korw %k1, %k0, %k0
; SKX-NEXT: kmovd %k0, %eax
; SKX-NEXT: # kill: def $ax killed $ax killed $eax
; SKX-NEXT: retq
@@ -1803,9 +1799,7 @@ define i16 @trunc_i32_to_i1(i32 %a) {
; AVX512DQNOBW-NEXT: kmovw %edi, %k0
; AVX512DQNOBW-NEXT: movw $-4, %ax
; AVX512DQNOBW-NEXT: kmovw %eax, %k1
-; AVX512DQNOBW-NEXT: kshiftrw $1, %k1, %k1
-; AVX512DQNOBW-NEXT: kshiftlw $1, %k1, %k1
-; AVX512DQNOBW-NEXT: korw %k0, %k1, %k0
+; AVX512DQNOBW-NEXT: korw %k1, %k0, %k0
; AVX512DQNOBW-NEXT: kmovw %k0, %eax
; AVX512DQNOBW-NEXT: # kill: def $ax killed $ax killed $eax
; AVX512DQNOBW-NEXT: retq
diff --git a/llvm/test/CodeGen/X86/avx512-insert-extract.ll b/llvm/test/CodeGen/X86/avx512-insert-extract.ll
index 67e5dfdc98ca8..f31c10c2fa0c7 100644
--- a/llvm/test/CodeGen/X86/avx512-insert-extract.ll
+++ b/llvm/test/CodeGen/X86/avx512-insert-extract.ll
@@ -238,11 +238,9 @@ define i16 @test13(i32 %a, i32 %b) nounwind {
; KNL: ## %bb.0:
; KNL-NEXT: cmpl %esi, %edi
; KNL-NEXT: setb %al
-; KNL-NEXT: movw $-4, %cx
-; KNL-NEXT: kmovw %ecx, %k0
-; KNL-NEXT: kshiftrw $1, %k0, %k0
-; KNL-NEXT: kshiftlw $1, %k0, %k0
; KNL-NEXT: andl $1, %eax
+; KNL-NEXT: kmovw %eax, %k0
+; KNL-NEXT: movw $-4, %ax
; KNL-NEXT: kmovw %eax, %k1
; KNL-NEXT: korw %k1, %k0, %k0
; KNL-NEXT: kmovw %k0, %eax
@@ -253,12 +251,10 @@ define i16 @test13(i32 %a, i32 %b) nounwind {
; SKX: ## %bb.0:
; SKX-NEXT: cmpl %esi, %edi
; SKX-NEXT: setb %al
-; SKX-NEXT: movw $-4, %cx
-; SKX-NEXT: kmovd %ecx, %k0
-; SKX-NEXT: kshiftrw $1, %k0, %k0
-; SKX-NEXT: kshiftlw $1, %k0, %k0
; SKX-NEXT: andl $1, %eax
-; SKX-NEXT: kmovw %eax, %k1
+; SKX-NEXT: kmovw %eax, %k0
+; SKX-NEXT: movw $-4, %ax
+; SKX-NEXT: kmovd %eax, %k1
; SKX-NEXT: korw %k1, %k0, %k0
; SKX-NEXT: kmovd %k0, %eax
; SKX-NEXT: ## kill: def $ax killed $ax killed $eax
diff --git a/llvm/test/CodeGen/X86/avx512-mask-op.ll b/llvm/test/CodeGen/X86/avx512-mask-op.ll
index da0cef0e4e99b..735d85ffee064 100644
--- a/llvm/test/CodeGen/X86/avx512-mask-op.ll
+++ b/llvm/test/CodeGen/X86/avx512-mask-op.ll
@@ -5053,9 +5053,7 @@ define <64 x i1> @mask64_insert(i32 %a) {
; KNL-NEXT: kmovw %esi, %k0
; KNL-NEXT: movw $-4, %cx
; KNL-NEXT: kmovw %ecx, %k1
-; KNL-NEXT: kshiftrw $1, %k1, %k1
-; KNL-NEXT: kshiftlw $1, %k1, %k1
-; KNL-NEXT: korw %k0, %k1, %k0
+; KNL-NEXT: korw %k1, %k0, %k0
; KNL-NEXT: kmovw %k0, (%rdi)
; KNL-NEXT: movw $-3, 6(%rdi)
; KNL-NEXT: movl $-131075, 2(%rdi) ## imm = 0xFFFDFFFD
@@ -5068,9 +5066,7 @@ define <64 x i1> @mask64_insert(i32 %a) {
; SKX-NEXT: kshiftrq $63, %k0, %k0
; SKX-NEXT: movabsq $-562958543486980, %rax ## imm = 0xFFFDFFFDFFFDFFFC
; SKX-NEXT: kmovq %rax, %k1
-; SKX-NEXT: kshiftrq $1, %k1, %k1
-; SKX-NEXT: kshiftlq $1, %k1, %k1
-; SKX-NEXT: korq %k0, %k1, %k0
+; SKX-NEXT: korq %k1, %k0, %k0
; SKX-NEXT: vpmovm2b %k0, %zmm0
; SKX-NEXT: retq
;
@@ -5081,9 +5077,7 @@ define <64 x i1> @mask64_insert(i32 %a) {
; AVX512BW-NEXT: kshiftrq $63, %k0, %k0
; AVX512BW-NEXT: movabsq $-562958543486980, %rax ## imm = 0xFFFDFFFDFFFDFFFC
; AVX512BW-NEXT: kmovq %rax, %k1
-; AVX512BW-NEXT: kshiftrq $1, %k1, %k1
-; AVX512BW-NEXT: kshiftlq $1, %k1, %k1
-; AVX512BW-NEXT: korq %k0, %k1, %k0
+; AVX512BW-NEXT: korq %k1, %k0, %k0
; AVX512BW-NEXT: vpmovm2b %k0, %zmm0
; AVX512BW-NEXT: retq
;
@@ -5094,9 +5088,7 @@ define <64 x i1> @mask64_insert(i32 %a) {
; AVX512DQ-NEXT: kmovw %esi, %k0
; AVX512DQ-NEXT: movw $-4, %cx
; AVX512DQ-NEXT: kmovw %ecx, %k1
-; AVX512DQ-NEXT: kshiftrw $1, %k1, %k1
-; AVX512DQ-NEXT: kshiftlw $1, %k1, %k1
-; AVX512DQ-NEXT: korw %k0, %k1, %k0
+; AVX512DQ-NEXT: korw %k1, %k0, %k0
; AVX512DQ-NEXT: kmovw %k0, (%rdi)
; AVX512DQ-NEXT: movw $-3, 6(%rdi)
; AVX512DQ-NEXT: movl $-131075, 2(%rdi) ## imm = 0xFFFDFFFD
diff --git a/llvm/test/CodeGen/X86/masked_store.ll b/llvm/test/CodeGen/X86/masked_store.ll
index 3e35df97be6df..4db275d37cfaa 100644
--- a/llvm/test/CodeGen/X86/masked_store.ll
+++ b/llvm/test/CodeGen/X86/masked_store.ll
@@ -7269,10 +7269,10 @@ define void @undefshuffle(<8 x i1> %i0, ptr %src, ptr %dst) nounwind {
; AVX512VLBW-LABEL: undefshuffle:
; AVX512VLBW: ## %bb.0:
; AVX512VLBW-NEXT: vpsllw $15, %xmm0, %xmm0
-; AVX512VLBW-NEXT: vpmovw2m %xmm0, %k0
+; AVX512VLBW-NEXT: vpxor %xmm1, %xmm1, %xmm1
; AVX512VLBW-NEXT: movl $15, %eax
; AVX512VLBW-NEXT: kmovd %eax, %k1
-; AVX512VLBW-NEXT: kandd %k1, %k0, %k1
+; AVX512VLBW-NEXT: vpcmpgtw %xmm0, %xmm1, %k1 {%k1}
; AVX512VLBW-NEXT: vpxor %xmm0, %xmm0, %xmm0
; AVX512VLBW-NEXT: vmovdqu32 %ymm0, (%rsi) {%k1}
; AVX512VLBW-NEXT: vzeroupper
@@ -7281,11 +7281,11 @@ define void @undefshuffle(<8 x i1> %i0, ptr %src, ptr %dst) nounwind {
; X86-AVX512-LABEL: undefshuffle:
; X86-AVX512: ## %bb.0:
; X86-AVX512-NEXT: vpsllw $15, %xmm0, %xmm0
-; X86-AVX512-NEXT: vpmovw2m %xmm0, %k0
; X86-AVX512-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1
; X86-AVX512-NEXT: movl $15, %ecx
; X86-AVX512-NEXT: kmovd %ecx, %k1
-; X86-AVX512-NEXT: kandd %k1, %k0, %k1
+; X86-AVX512-NEXT: vpcmpgtw %xmm0, %xmm1, %k1 {%k1}
; X86-AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm0
; X86-AVX512-NEXT: vmovdqu32 %ymm0, (%eax) {%k1}
; X86-AVX512-NEXT: vzeroupper
diff --git a/llvm/test/CodeGen/X86/vector-replicaton-i1-mask.ll b/llvm/test/CodeGen/X86/vector-replicaton-i1-mask.ll
index edb33bed801d7..1d7cf9e7ec281 100644
--- a/llvm/test/CodeGen/X86/vector-replicaton-i1-mask.ll
+++ b/llvm/test/CodeGen/X86/vector-replicaton-i1-mask.ll
@@ -612,11 +612,11 @@ define void @mask_replication_factor3_vf8(ptr %in.maskvec, ptr %in.vec, ptr %out
; AVX512BW-NEXT: vpmovm2w %k0, %zmm0
; AVX512BW-NEXT: vpmovsxbw {{.*#+}} zmm1 = [0,0,0,1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,0,0,0,0,0,0,0,0]
; AVX512BW-NEXT: vpermw %zmm0, %zmm1, %zmm0
-; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1
-; AVX512BW-NEXT: movl $16777215, %eax # imm = 0xFFFFFF
-; AVX512BW-NEXT: kmovd %eax, %k1
-; AVX512BW-NEXT: vpcmpgtw %zmm0, %zmm1, %k1 {%k1}
-; AVX512BW-NEXT: kshiftrd $16, %k1, %k2
+; AVX512BW-NEXT: vpmovw2m %zmm0, %k1
+; AVX512BW-NEXT: kshiftrd $16, %k1, %k0
+; AVX512BW-NEXT: movl $255, %eax
+; AVX512BW-NEXT: kmovd %eax, %k2
+; AVX512BW-NEXT: kandw %k2, %k0, %k2
; AVX512BW-NEXT: vmovdqa32 64(%rsi), %zmm0 {%k2} {z}
; AVX512BW-NEXT: vmovdqa32 (%rsi), %zmm1 {%k1} {z}
; AVX512BW-NEXT: vmovdqa64 %zmm1, (%rdx)
@@ -3157,11 +3157,11 @@ define void @mask_replication_factor5_vf4(ptr %in.maskvec, ptr %in.vec, ptr %out
; AVX512BW-NEXT: vpmovm2w %k0, %zmm0
; AVX512BW-NEXT: vpmovsxbw {{.*#+}} zmm1 = [0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0]
; AVX512BW-NEXT: vpermw %zmm0, %zmm1, %zmm0
-; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1
-; AVX512BW-NEXT: movl $1048575, %eax # imm = 0xFFFFF
-; AVX512BW-NEXT: kmovd %eax, %k1
-; AVX512BW-NEXT: vpcmpgtw %zmm0, %zmm1, %k1 {%k1}
-; AVX512BW-NEXT: kshiftrd $16, %k1, %k2
+; AVX512BW-NEXT: vpmovw2m %zmm0, %k1
+; AVX512BW-NEXT: kshiftrd $16, %k1, %k0
+; AVX512BW-NEXT: movl $15, %eax
+; AVX512BW-NEXT: kmovd %eax, %k2
+; AVX512BW-NEXT: kandw %k2, %k0, %k2
; AVX512BW-NEXT: vmovdqa32 64(%rsi), %zmm0 {%k2} {z}
; AVX512BW-NEXT: vmovdqa32 (%rsi), %zmm1 {%k1} {z}
; AVX512BW-NEXT: vmovdqa64 %zmm1, (%rdx)
@@ -3241,11 +3241,11 @@ define void @mask_replication_factor5_vf8(ptr %in.maskvec, ptr %in.vec, ptr %out
; AVX512BW-ONLY-NEXT: vpmovm2b %k0, %zmm0
; AVX512BW-ONLY-NEXT: vpbroadcastq %xmm0, %zmm0
; AVX512BW-ONLY-NEXT: vpshufb {{.*#+}} zmm0 = zmm0[0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,3,19,19,19,19,20,20,20,20,20,21,21,21,21,21,22,22,38,38,38,39,39,39,39,39,u,u,u,u,u,u,u,u,u,u,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
-; AVX512BW-ONLY-NEXT: vpxor %xmm1, %xmm1, %xmm1
-; AVX512BW-ONLY-NEXT: movabsq $1099511627775, %rax # imm = 0xFFFFFFFFFF
-; AVX512BW-ONLY-NEXT: kmovq %rax, %k1
-; AVX512BW-ONLY-NEXT: vpcmpgtb %zmm0, %zmm1, %k1 {%k1}
+; AVX512BW-ONLY-NEXT: vpmovb2m %zmm0, %k1
+; AVX512BW-ONLY-NEXT: movl $255, %eax
+; AVX512BW-ONLY-NEXT: kmovq %rax, %k0
; AVX512BW-ONLY-NEXT: kshiftrq $32, %k1, %k2
+; AVX512BW-ONLY-NEXT: kandw %k0, %k2, %k2
; AVX512BW-ONLY-NEXT: vmovdqa32 128(%rsi), %zmm0 {%k2} {z}
; AVX512BW-ONLY-NEXT: vmovdqa32 (%rsi), %zmm1 {%k1} {z}
; AVX512BW-ONLY-NEXT: kshiftrq $16, %k1, %k1
@@ -3262,11 +3262,11 @@ define void @mask_replication_factor5_vf8(ptr %in.maskvec, ptr %in.vec, ptr %out
; AVX512VBMI-ONLY-NEXT: vpmovm2b %k0, %zmm0
; AVX512VBMI-ONLY-NEXT: vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,5,5,5,5,5,6,6,6,6,6,7,7,7,7,7,u,u,u,u,u,u,u,u,u,u,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
; AVX512VBMI-ONLY-NEXT: vpermb %zmm0, %zmm1, %zmm0
-; AVX512VBMI-ONLY-NEXT: vpxor %xmm1, %xmm1, %xmm1
-; AVX512VBMI-ONLY-NEXT: movabsq $1099511627775, %rax # imm = 0xFFFFFFFFFF
-; AVX512VBMI-ONLY-NEXT: kmovq %rax, %k1
-; AVX512VBMI-ONLY-NEXT: vpcmpgtb %zmm0, %zmm1, %k1 {%k1}
-; AVX512VBMI-ONLY-NEXT: kshiftrq $32, %k1, %k2
+; AVX512VBMI-ONLY-NEXT: vpmovb2m %zmm0, %k1
+; AVX512VBMI-ONLY-NEXT: kshiftrq $32, %k1, %k0
+; AVX512VBMI-ONLY-NEXT: movl $255, %eax
+; AVX512VBMI-ONLY-NEXT: kmovq %rax, %k2
+; AVX512VBMI-ONLY-NEXT: kandw %k2, %k0, %k2
; AVX512VBMI-ONLY-NEXT: vmovdqa32 128(%rsi), %zmm0 {%k2} {z}
; AVX512VBMI-ONLY-NEXT: vmovdqa32 (%rsi), %zmm1 {%k1} {z}
; AVX512VBMI-ONLY-NEXT: kshiftrq $16, %k1, %k1
@@ -5930,11 +5930,11 @@ define void @mask_replication_factor6_vf4(ptr %in.maskvec, ptr %in.vec, ptr %out
; AVX512BW-NEXT: vpmovm2w %k0, %zmm0
; AVX512BW-NEXT: vpmovsxbw {{.*#+}} zmm1 = [0,0,0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,0,0,0,0,0,0,0,0]
; AVX512BW-NEXT: vpermw %zmm0, %zmm1, %zmm0
-; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1
-; AVX512BW-NEXT: movl $16777215, %eax # imm = 0xFFFFFF
-; AVX512BW-NEXT: kmovd %eax, %k1
-; AVX512BW-NEXT: vpcmpgtw %zmm0, %zmm1, %k1 {%k1}
-; AVX512BW-NEXT: kshiftrd $16, %k1, %k2
+; AVX512BW-NEXT: vpmovw2m %zmm0, %k1
+; AVX512BW-NEXT: kshiftrd $16, %k1, %k0
+; AVX512BW-NEXT: movl $255, %eax
+; AVX512BW-NEXT: kmovd %eax, %k2
+; AVX512BW-NEXT: kandw %k2, %k0, %k2
; AVX512BW-NEXT: vmovdqa32 64(%rsi), %zmm0 {%k2} {z}
; AVX512BW-NEXT: vmovdqa32 (%rsi), %zmm1 {%k1} {z}
; AVX512BW-NEXT: vmovdqa64 %zmm1, (%rdx)
@@ -9106,12 +9106,12 @@ define void @mask_replication_factor7_vf4(ptr %in.maskvec, ptr %in.vec, ptr %out
; AVX512BW-NEXT: vpmovm2w %k0, %zmm0
; AVX512BW-NEXT: vpmovsxbw {{.*#+}} zmm1 = [0,0,0,0,0,0,0,1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3,0,0,0,0]
; AVX512BW-NEXT: vpermw %zmm0, %zmm1, %zmm0
-; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1
-; AVX512BW-NEXT: movl $268435455, %eax # imm = 0xFFFFFFF
-; AVX512BW-NEXT: kmovd %eax, %k1
-; AVX512BW-NEXT: vpcmpgtw %zmm0, %zmm1, %k1 {%k1}
+; AVX512BW-NEXT: vpmovw2m %zmm0, %k1
; AVX512BW-NEXT: vmovdqa32 (%rsi), %zmm0 {%k1} {z}
-; AVX512BW-NEXT: kshiftrd $16, %k1, %k1
+; AVX512BW-NEXT: kshiftrd $16, %k1, %k0
+; AVX512BW-NEXT: movl $4095, %eax # imm = 0xFFF
+; AVX512BW-NEXT: kmovd %eax, %k1
+; AVX512BW-NEXT: kandw %k1, %k0, %k1
; AVX512BW-NEXT: vmovdqa32 64(%rsi), %zmm1 {%k1} {z}
; AVX512BW-NEXT: vextracti32x4 $2, %zmm1, 96(%rdx)
; AVX512BW-NEXT: vmovdqa64 %zmm0, (%rdx)
@@ -9268,14 +9268,14 @@ define void @mask_replication_factor7_vf8(ptr %in.maskvec, ptr %in.vec, ptr %out
; AVX512BW-ONLY-NEXT: vpmovm2b %k0, %zmm0
; AVX512BW-ONLY-NEXT: vpbroadcastq %xmm0, %zmm0
; AVX512BW-ONLY-NEXT: vpshufb {{.*#+}} zmm0 = zmm0[0,0,0,0,0,0,0,1,1,1,1,1,1,1,2,2,18,18,18,18,18,19,19,19,19,19,19,19,20,20,20,20,36,36,36,37,37,37,37,37,37,37,38,38,38,38,38,38,54,55,55,55,55,55,55,55,u,u,u,u,u,u,u,u]
-; AVX512BW-ONLY-NEXT: vpxor %xmm1, %xmm1, %xmm1
-; AVX512BW-ONLY-NEXT: movabsq $72057594037927935, %rax # imm = 0xFFFFFFFFFFFFFF
-; AVX512BW-ONLY-NEXT: kmovq %rax, %k1
-; AVX512BW-ONLY-NEXT: vpcmpgtb %zmm0, %zmm1, %k1 {%k1}
-; AVX512BW-ONLY-NEXT: kshiftrq $48, %k1, %k2
-; AVX512BW-ONLY-NEXT: vmovdqa32 192(%rsi), %zmm0 {%k2} {z}
-; AVX512BW-ONLY-NEXT: vmovdqa32 (%rsi), %zmm1 {%k1} {z}
+; AVX512BW-ONLY-NEXT: vpmovb2m %zmm0, %k1
+; AVX512BW-ONLY-NEXT: movl $16777215, %eax # imm = 0xFFFFFF
+; AVX512BW-ONLY-NEXT: kmovq %rax, %k0
; AVX512BW-ONLY-NEXT: kshiftrq $32, %k1, %k2
+; AVX512BW-ONLY-NEXT: kandd %k0, %k2, %k2
+; AVX512BW-ONLY-NEXT: kshiftrd $16, %k2, %k3
+; AVX512BW-ONLY-NEXT: vmovdqa32 192(%rsi), %zmm0 {%k3} {z}
+; AVX512BW-ONLY-NEXT: vmovdqa32 (%rsi), %zmm1 {%k1} {z}
; AVX512BW-ONLY-NEXT: vmovdqa32 128(%rsi), %zmm2 {%k2} {z}
; AVX512BW-ONLY-NEXT: kshiftrq $16, %k1, %k1
; AVX512BW-ONLY-NEXT: vmovdqa32 64(%rsi), %zmm3 {%k1} {z}
@@ -9292,14 +9292,14 @@ define void @mask_replication_factor7_vf8(ptr %in.maskvec, ptr %in.vec, ptr %out
; AVX512VBMI-ONLY-NEXT: vpmovm2b %k0, %zmm0
; AVX512VBMI-ONLY-NEXT: vmovdqa64 {{.*#+}} zmm1 = [0,0,0,0,0,0,0,1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,4,4,4,4,5,5,5,5,5,5,5,6,6,6,6,6,6,6,7,7,7,7,7,7,7,u,u,u,u,u,u,u,u]
; AVX512VBMI-ONLY-NEXT: vpermb %zmm0, %zmm1, %zmm0
-; AVX512VBMI-ONLY-NEXT: vpxor %xmm1, %xmm1, %xmm1
-; AVX512VBMI-ONLY-NEXT: movabsq $72057594037927935, %rax # imm = 0xFFFFFFFFFFFFFF
-; AVX512VBMI-ONLY-NEXT: kmovq %rax, %k1
-; AVX512VBMI-ONLY-NEXT: vpcmpgtb %zmm0, %zmm1, %k1 {%k1}
-; AVX512VBMI-ONLY-NEXT: kshiftrq $48, %k1, %k2
-; AVX512VBMI-ONLY-NEXT: vmovdqa32 192(%rsi), %zmm0 {%k2} {z}
+; AVX512VBMI-ONLY-NEXT: vpmovb2m %zmm0, %k1
+; AVX512VBMI-ONLY-NEXT: kshiftrq $32, %k1, %k0
+; AVX512VBMI-ONLY-NEXT: movl $16777215, %eax # imm = 0xFFFFFF
+; AVX512VBMI-ONLY-NEXT: kmovq %rax, %k2
+; AVX512VBMI-ONLY-NEXT: kandd %k2, %k0, %k2
+; AVX512VBMI-ONLY-NEXT: kshiftrd $16, %k2, %k3
+; AVX512VBMI-ONLY-NEXT: vmovdqa32 192(%rsi), %zmm0 {%k3} {z}
; AVX512VBMI-ONLY-NEXT: vmovdqa32 (%rsi), %zmm1 {%k1} {z}
-; AVX512VBMI-ONLY-NEXT: kshiftrq $32, %k1, %k2
; AVX512VBMI-ONLY-NEXT: vmovdqa32 128(%rsi), %zmm2 {%k2} {z}
; AVX512VBMI-ONLY-NEXT: kshiftrq $16, %k1, %k1
; AVX512VBMI-ONLY-NEXT: vmovdqa32 64(%rsi), %zmm3 {%k1} {z}
More information about the llvm-commits
mailing list