[llvm-branch-commits] [llvm] [DAG] Handle mask_beforefirst in ComputeNumSignBits (PR #232256)
Luke Lau via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Oct 15 03:14:44 PDT 2026
https://github.com/lukel97 created https://github.com/llvm/llvm-project/pull/232256
It has the same sign bits as icmp
>From 347d92259255160a50b2dc1c9bbc2d5ac35ae21e Mon Sep 17 00:00:00 2001
From: Luke Lau <luke at igalia.com>
Date: Thu, 15 Oct 2026 13:40:07 +0800
Subject: [PATCH] [DAG] Handle mask_beforefirst in ComputeNumSignBits
It has the same sign bits as icmp
---
.../lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 1 +
llvm/test/CodeGen/X86/mask-beforefirst.ll | 23 ++++++++-----------
2 files changed, 10 insertions(+), 14 deletions(-)
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 0fe9a7c5e68f5..2d2834a9d409c 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -5283,6 +5283,7 @@ unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
break;
}
case ISD::GET_ACTIVE_LANE_MASK:
+ case ISD::MASK_BEFOREFIRST:
// Semantically similar to icmp ult.
if (TLI->getBooleanContents(VT.isVector(), /*isFloat=*/false) ==
TargetLowering::ZeroOrNegativeOneBooleanContent)
diff --git a/llvm/test/CodeGen/X86/mask-beforefirst.ll b/llvm/test/CodeGen/X86/mask-beforefirst.ll
index af15cd1a09b7a..e944d479f4d54 100644
--- a/llvm/test/CodeGen/X86/mask-beforefirst.ll
+++ b/llvm/test/CodeGen/X86/mask-beforefirst.ll
@@ -31,13 +31,10 @@ define <16 x i8> @v16i1(<16 x i8> %a0, <16 x i8> %a1) {
; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
; SSE2-NEXT: pmaxub %xmm3, %xmm2
; SSE2-NEXT: pcmpeqb %xmm3, %xmm2
-; SSE2-NEXT: pcmpeqd %xmm3, %xmm3
-; SSE2-NEXT: pxor %xmm2, %xmm3
-; SSE2-NEXT: pxor %xmm2, %xmm2
-; SSE2-NEXT: pcmpgtb %xmm3, %xmm2
-; SSE2-NEXT: pand %xmm2, %xmm0
-; SSE2-NEXT: pandn %xmm1, %xmm2
-; SSE2-NEXT: por %xmm2, %xmm0
+; SSE2-NEXT: pand %xmm2, %xmm1
+; SSE2-NEXT: pandn %xmm0, %xmm2
+; SSE2-NEXT: por %xmm1, %xmm2
+; SSE2-NEXT: movdqa %xmm2, %xmm0
; SSE2-NEXT: retq
;
; SSE42-LABEL: v16i1:
@@ -60,9 +57,8 @@ define <16 x i8> @v16i1(<16 x i8> %a0, <16 x i8> %a1) {
; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
; SSE42-NEXT: pmaxub %xmm3, %xmm0
; SSE42-NEXT: pcmpeqb %xmm3, %xmm0
-; SSE42-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE42-NEXT: pblendvb %xmm0, %xmm2, %xmm1
-; SSE42-NEXT: movdqa %xmm1, %xmm0
+; SSE42-NEXT: pblendvb %xmm0, %xmm1, %xmm2
+; SSE42-NEXT: movdqa %xmm2, %xmm0
; SSE42-NEXT: retq
;
; AVX2-LABEL: v16i1:
@@ -81,8 +77,7 @@ define <16 x i8> @v16i1(<16 x i8> %a0, <16 x i8> %a1) {
; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
; AVX2-NEXT: vpmaxub %xmm3, %xmm2, %xmm2
; AVX2-NEXT: vpcmpeqb %xmm3, %xmm2, %xmm2
-; AVX2-NEXT: vpandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
-; AVX2-NEXT: vpblendvb %xmm2, %xmm0, %xmm1, %xmm0
+; AVX2-NEXT: vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
; AVX2-NEXT: retq
;
; AVX512-LABEL: v16i1:
@@ -309,8 +304,8 @@ define <2 x i64> @v2i1(<2 x i64> %a0, <2 x i64> %a1) {
; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
; SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
; SSE2-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
-; SSE2-NEXT: pand %xmm2, %xmm3
-; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,0,2,2]
+; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
+; SSE2-NEXT: pand %xmm4, %xmm3
; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
; SSE2-NEXT: por %xmm3, %xmm2
; SSE2-NEXT: pand %xmm2, %xmm0
More information about the llvm-branch-commits
mailing list