[llvm] 626cbf7 - [X86] isGuaranteedNotToBeUndefOrPoison - add simple target shuffles with known test coverage (#161553)

via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 7 09:22:54 PST 2025


Author: Simon Pilgrim
Date: 2025-11-07T17:22:50Z
New Revision: 626cbf70f1eb7827eaedec5f389a38caa60e82a9

URL: https://github.com/llvm/llvm-project/commit/626cbf70f1eb7827eaedec5f389a38caa60e82a9
DIFF: https://github.com/llvm/llvm-project/commit/626cbf70f1eb7827eaedec5f389a38caa60e82a9.diff

LOG: [X86] isGuaranteedNotToBeUndefOrPoison - add simple target shuffles with known test coverage (#161553)

Add a number of simple target shuffles (fixed shuffle mask or simple
immediate control) to
isGuaranteedNotToBeUndefOrPoison/canCreateUndefOrPoisonForTargetNode
that have known test coverage and obviously don't introduce
undef/poison.

These were found by adding an assert for unhandled target shuffles and
running over CodeGen/X86 - providing explicit test coverage is
incredibly difficult as ISD::VECTOR_SHUFFLE nodes will typically handle
freeze nodes before we lower to these target shuffle nodes.

Added: 
    

Modified: 
    llvm/lib/Target/X86/X86ISelLowering.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 090f6499e0b17..05a854a0bf3fa 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -45022,11 +45022,16 @@ bool X86TargetLowering::isGuaranteedNotToBeUndefOrPoisonForTargetNode(
   case X86ISD::INSERTPS:
   case X86ISD::BLENDI:
   case X86ISD::PSHUFB:
+  case X86ISD::VZEXT_MOVL:
   case X86ISD::PSHUFD:
+  case X86ISD::PSHUFHW:
+  case X86ISD::PSHUFLW:
+  case X86ISD::SHUFP:
   case X86ISD::UNPCKL:
   case X86ISD::UNPCKH:
   case X86ISD::VPERMILPV:
   case X86ISD::VPERMILPI:
+  case X86ISD::VPERMI:
   case X86ISD::VPERMV:
   case X86ISD::VPERMV3: {
     SmallVector<int, 8> Mask;
@@ -45052,6 +45057,16 @@ bool X86TargetLowering::isGuaranteedNotToBeUndefOrPoisonForTargetNode(
     }
     break;
   }
+  case X86ISD::VBROADCAST: {
+    SDValue Src = Op.getOperand(0);
+    MVT SrcVT = Src.getSimpleValueType();
+    if (SrcVT.isVector()) {
+      APInt DemandedSrc = APInt::getOneBitSet(SrcVT.getVectorNumElements(), 0);
+      return DAG.isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrc, PoisonOnly,
+                                                  Depth + 1);
+    }
+    return DAG.isGuaranteedNotToBeUndefOrPoison(Src, PoisonOnly, Depth + 1);
+  }
   }
   return TargetLowering::isGuaranteedNotToBeUndefOrPoisonForTargetNode(
       Op, DemandedElts, DAG, PoisonOnly, Depth);
@@ -45096,13 +45111,19 @@ bool X86TargetLowering::canCreateUndefOrPoisonForTargetNode(
   // SSE target shuffles.
   case X86ISD::INSERTPS:
   case X86ISD::PSHUFB:
+  case X86ISD::VZEXT_MOVL:
   case X86ISD::PSHUFD:
+  case X86ISD::PSHUFHW:
+  case X86ISD::PSHUFLW:
+  case X86ISD::SHUFP:
   case X86ISD::UNPCKL:
   case X86ISD::UNPCKH:
   case X86ISD::VPERMILPV:
   case X86ISD::VPERMILPI:
+  case X86ISD::VPERMI:
   case X86ISD::VPERMV:
   case X86ISD::VPERMV3:
+  case X86ISD::VBROADCAST:
     return false;
   // SSE comparisons handle all icmp/fcmp cases.
   // TODO: Add CMPM/MM with test coverage.


        


More information about the llvm-commits mailing list