[llvm] efec798 - DAG: Preserve poison in some cast folds (#225403)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 22 08:55:16 PDT 2026
Author: Matt Arsenault
Date: 2026-09-22T17:55:08+02:00
New Revision: efec7984808669b2dc75fbfab7664658ff45f74a
URL: https://github.com/llvm/llvm-project/commit/efec7984808669b2dc75fbfab7664658ff45f74a
DIFF: https://github.com/llvm/llvm-project/commit/efec7984808669b2dc75fbfab7664658ff45f74a.diff
LOG: DAG: Preserve poison in some cast folds (#225403)
Added:
Modified:
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 17e2ab01bc11f..e86514aed9410 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -16736,14 +16736,24 @@ SDValue DAGCombiner::visitZERO_EXTEND(SDNode *N) {
return SDValue();
}
+/// For a unary operation, propagate poison or undef from the operand \p N0 to
+/// the result type \p VT. Returns an empty SDValue if \p N0 is neither.
+static SDValue propagateUnaryUndef(SelectionDAG &DAG, SDValue N0, EVT VT) {
+ if (N0.getOpcode() == ISD::POISON)
+ return DAG.getPOISON(VT);
+ if (N0.getOpcode() == ISD::UNDEF)
+ return DAG.getUNDEF(VT);
+ return SDValue();
+}
+
SDValue DAGCombiner::visitANY_EXTEND(SDNode *N) {
SDValue N0 = N->getOperand(0);
EVT VT = N->getValueType(0);
SDLoc DL(N);
- // aext(undef) = undef
- if (N0.isUndef())
- return DAG.getUNDEF(VT);
+ // aext(undef) = undef, aext(poison) = poison
+ if (SDValue R = propagateUnaryUndef(DAG, N0, VT))
+ return R;
if (SDValue Res = tryToFoldExtendOfConstant(N, DL, TLI, DAG, LegalTypes))
return Res;
@@ -17764,9 +17774,9 @@ SDValue DAGCombiner::visitTRUNCATE(SDNode *N) {
bool isLE = DAG.getDataLayout().isLittleEndian();
SDLoc DL(N);
- // trunc(undef) = undef
- if (N0.isUndef())
- return DAG.getUNDEF(VT);
+ // trunc(undef) = undef, trunc(poison) = poison
+ if (SDValue R = propagateUnaryUndef(DAG, N0, VT))
+ return R;
// fold (truncate (truncate x)) -> (truncate x)
if (N0.getOpcode() == ISD::TRUNCATE)
@@ -18305,8 +18315,8 @@ SDValue DAGCombiner::visitBITCAST(SDNode *N) {
SDValue N0 = N->getOperand(0);
EVT VT = N->getValueType(0);
- if (N0.isUndef())
- return DAG.getUNDEF(VT);
+ if (SDValue R = propagateUnaryUndef(DAG, N0, VT))
+ return R;
// If the input is a BUILD_VECTOR with all constant elements, fold this now.
// Only do this before legalize types, unless both types are integer and the
@@ -20792,8 +20802,8 @@ SDValue DAGCombiner::visitFP_TO_SINT(SDNode *N) {
SDLoc DL(N);
// fold (fp_to_sint undef) -> undef
- if (N0.isUndef())
- return DAG.getUNDEF(VT);
+ if (SDValue R = propagateUnaryUndef(DAG, N0, VT))
+ return R;
// fold (fp_to_sint c1fp) -> c1
if (SDValue C = DAG.FoldConstantArithmetic(ISD::FP_TO_SINT, DL, VT, {N0}))
@@ -20808,8 +20818,8 @@ SDValue DAGCombiner::visitFP_TO_UINT(SDNode *N) {
SDLoc DL(N);
// fold (fp_to_uint undef) -> undef
- if (N0.isUndef())
- return DAG.getUNDEF(VT);
+ if (SDValue R = propagateUnaryUndef(DAG, N0, VT))
+ return R;
// fold (fp_to_uint c1fp) -> c1
if (SDValue C = DAG.FoldConstantArithmetic(ISD::FP_TO_UINT, DL, VT, {N0}))
@@ -20824,8 +20834,8 @@ SDValue DAGCombiner::visitXROUND(SDNode *N) {
// fold (lrint|llrint undef) -> undef
// fold (lround|llround undef) -> undef
- if (N0.isUndef())
- return DAG.getUNDEF(VT);
+ if (SDValue R = propagateUnaryUndef(DAG, N0, VT))
+ return R;
// fold (lrint|llrint c1fp) -> c1
// fold (lround|llround c1fp) -> c1
More information about the llvm-commits
mailing list