[llvm] [DAG] isKnownNeverZero - add ISD::VECTOR_SHUFFLE handling (PR #186335)

via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 13 01:31:36 PDT 2026


https://github.com/absarkar created https://github.com/llvm/llvm-project/pull/186335

Closed #183351 

>From 6e70e8c5bbe447255d6644f62daf91b1b24f9f13 Mon Sep 17 00:00:00 2001
From: Abdullah Sarkar <fa2818 at nyu.edu>
Date: Fri, 13 Mar 2026 04:25:14 -0400
Subject: [PATCH] [DAG] isKnownNeverZero - add ISD::VECTOR_SHUFFLE handling

---
 .../lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 25 +++++++++++++++++++
 llvm/test/CodeGen/X86/known-never-zero.ll     | 17 +++++++++++++
 2 files changed, 42 insertions(+)

diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 1c5b2d00fe83c..ef042e5ca9e54 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -6295,6 +6295,31 @@ bool SelectionDAG::isKnownNeverZero(SDValue Op, const APInt &DemandedElts,
     break;
   }
 
+  case ISD::VECTOR_SHUFFLE: {
+    assert(!Op.getValueType().isScalableVector());
+    unsigned NumElts = DemandedElts.getBitWidth();
+    // Collect the known bits that are shared by every vector element referenced
+    // by the shuffle.
+    APInt DemandedLHS, DemandedRHS;
+    const ShuffleVectorSDNode *SVN = cast<ShuffleVectorSDNode>(Op);
+    assert(NumElts == SVN->getMask().size() && "Unexpected vector size");
+    if (!getShuffleDemandedElts(NumElts, SVN->getMask(), DemandedElts,
+                                DemandedLHS, DemandedRHS))
+      return false;
+
+    for (int i = 0; i < (int)NumElts; ++i)
+	    if (DemandedElts[i] && SVN->getMaskElt(i) < 0)
+		    return false;
+
+    if (!!DemandedLHS && !isKnownNeverZero(Op.getOperand(0), DemandedLHS, Depth + 1))
+	    return false;
+
+    if (!!DemandedRHS && !isKnownNeverZero(Op.getOperand(1), DemandedRHS, Depth + 1))
+	    return false;
+    
+    return true;
+  }
+
   case ISD::UADDSAT:
   case ISD::UMAX:
     return isKnownNeverZero(Op.getOperand(1), DemandedElts, Depth + 1) ||
diff --git a/llvm/test/CodeGen/X86/known-never-zero.ll b/llvm/test/CodeGen/X86/known-never-zero.ll
index 8327a90bdeda5..15210d8278a40 100644
--- a/llvm/test/CodeGen/X86/known-never-zero.ll
+++ b/llvm/test/CodeGen/X86/known-never-zero.ll
@@ -2821,3 +2821,20 @@ define i32 @test_sext_demanded_elts(<4 x i32> %a0, ptr %p) {
   ret i32 %res
 }
 
+
+define <4 x i32> @known_nonzero_shuffle(<4 x i32> %a, <4 x i32> %b) {
+; X86-LABEL: known_nonzero_shuffle:
+; X86:       # %bb.0:
+; X86-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
+; X86-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; X86-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
+; X86-NEXT:    retl
+;
+; X64-LABEL: known_nonzero_shuffle:
+; X64:       # %bb.0:
+; X64-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
+; X64-NEXT:    retq
+	%shuf = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
+	ret <4 x i32> %shuf
+}
+



More information about the llvm-commits mailing list