[llvm] [SelectionDAG] add ISD::BITCAST handling for isGuaranteedNotToBeUndefOrPoison (PR #161745)
Yi-Chi Lee via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 3 09:19:03 PDT 2025
https://github.com/yichi170 updated https://github.com/llvm/llvm-project/pull/161745
>From 8ad7d9a779d52d70c08e86048534a363db1ff951 Mon Sep 17 00:00:00 2001
From: Yi-Chi Lee <yichi170 at gmail.com>
Date: Thu, 2 Oct 2025 17:31:10 -0500
Subject: [PATCH 1/2] [SelectionDAG] add ISD::BITCAST handling for
isGuaranteedNotToBeUndefOrPoison
---
.../lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 24 +++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 95f53fe0bfdba..deab1a919b952 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -5636,6 +5636,30 @@ bool SelectionDAG::isGuaranteedNotToBeUndefOrPoison(SDValue Op,
});
}
+ case ISD::BITCAST: {
+ SDValue Src = Op.getOperand(0);
+ EVT SrcVT = Src.getValueType();
+ EVT TgtVT = Op.getValueType();
+
+ // Case 1: Scalar -> Vector, or Scalar -> Scalar
+ if (!SrcVT.isVector()) {
+ APInt DemandedSrcElts(1, 1);
+ return isGuaranteedNotToBeUndefOrPoison(Src, DemandedSrcElts, PoisonOnly,
+ Depth + 1);
+ }
+
+ // Case 2: Vector -> Scalar
+ if (SrcVT.isVector() && !TgtVT.isVector())
+ return isGuaranteedNotToBeUndefOrPoison(Src, PoisonOnly, Depth + 1);
+
+ // Case 3: Vector -> Vector
+ unsigned NumSrcElts = SrcVT.getVectorNumElements();
+ APInt ScaledDemandedElts = APIntOps::ScaleBitMask(DemandedElts, NumSrcElts);
+
+ return isGuaranteedNotToBeUndefOrPoison(Src, ScaledDemandedElts, PoisonOnly,
+ Depth + 1);
+ }
+
// TODO: Search for noundef attributes from library functions.
// TODO: Pointers dereferenced by ISD::LOAD/STORE ops are noundef.
>From 2b946f2a448d390e37a25e3239825ed390996d69 Mon Sep 17 00:00:00 2001
From: Yi-Chi Lee <yichi170 at gmail.com>
Date: Fri, 3 Oct 2025 11:09:37 -0500
Subject: [PATCH 2/2] fix for scalable vector
---
llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index deab1a919b952..41304083e0033 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -5648,8 +5648,9 @@ bool SelectionDAG::isGuaranteedNotToBeUndefOrPoison(SDValue Op,
Depth + 1);
}
- // Case 2: Vector -> Scalar
- if (SrcVT.isVector() && !TgtVT.isVector())
+ // Case 2: Vector -> Scalar, or Scalable Vector -> Scalable Vector
+ if ((SrcVT.isVector() && !TgtVT.isVector()) ||
+ (SrcVT.isScalableVT() && TgtVT.isScalableVT()))
return isGuaranteedNotToBeUndefOrPoison(Src, PoisonOnly, Depth + 1);
// Case 3: Vector -> Vector
More information about the llvm-commits
mailing list