From c83e1c274c6548832d13553d152a1c1175258a2e Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Wed, 12 Nov 2025 11:42:32 -0800 Subject: [PATCH 1/4] DAG: Use poison when legalizing scalar_to_vector results --- llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp index 6284ded3be922..461cea2e80748 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp @@ -2186,7 +2186,7 @@ void DAGTypeLegalizer::SplitVecRes_ScalarOp(SDNode *N, SDValue &Lo, std::tie(LoVT, HiVT) = DAG.GetSplitDestVTs(N->getValueType(0)); Lo = DAG.getNode(N->getOpcode(), dl, LoVT, N->getOperand(0)); if (N->getOpcode() == ISD::SCALAR_TO_VECTOR) { - Hi = DAG.getUNDEF(HiVT); + Hi = DAG.getPOISON(HiVT); } else { assert(N->getOpcode() == ISD::SPLAT_VECTOR && "Unexpected opcode"); Hi = Lo; From 2466334854a796098e29246afcd2fafb6f4dc20e Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Wed, 12 Nov 2025 12:23:01 -0800 Subject: [PATCH 2/4] Update documentation phrasing --- llvm/include/llvm/CodeGen/ISDOpcodes.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/llvm/include/llvm/CodeGen/ISDOpcodes.h b/llvm/include/llvm/CodeGen/ISDOpcodes.h index b3a2ced70e628..cdaa916548c25 100644 --- a/llvm/include/llvm/CodeGen/ISDOpcodes.h +++ b/llvm/include/llvm/CodeGen/ISDOpcodes.h @@ -655,8 +655,8 @@ enum NodeType { /// SCALAR_TO_VECTOR(VAL) - This represents the operation of loading a /// scalar value into element 0 of the resultant vector type. The top - /// elements 1 to N-1 of the N-element vector are undefined. The type - /// of the operand must match the vector element type, except when they + /// elements 1 to N-1 of the N-element vector are poison. The type of + /// the operand must match the vector element type, except when they /// are integer types. In this case the operand is allowed to be wider /// than the vector element type, and is implicitly truncated to it. SCALAR_TO_VECTOR, From d18eeae4e916c4d09c30f417ab1b1f0a9d77f506 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Wed, 12 Nov 2025 12:05:48 -0800 Subject: [PATCH 3/4] DAG: Use poison in SplitVecRes_VP_LOAD_FF --- llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp index 461cea2e80748..417122d467054 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp @@ -2363,7 +2363,7 @@ void DAGTypeLegalizer::SplitVecRes_VP_LOAD_FF(VPLoadFFSDNode *LD, SDValue &Lo, Lo = DAG.getLoadFFVP(LoVT, dl, Ch, Ptr, MaskLo, EVLLo, MMO); // Fill the upper half with poison. - Hi = DAG.getUNDEF(HiVT); + Hi = DAG.getPOISON(HiVT); ReplaceValueWith(SDValue(LD, 1), Lo.getValue(1)); ReplaceValueWith(SDValue(LD, 2), Lo.getValue(2)); From 894713dd75ea0a69bbaf3d98a67826822dd41ea0 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Wed, 12 Nov 2025 12:18:03 -0800 Subject: [PATCH 4/4] DAG: Use poison for some load/store offsets in legalizer --- .../SelectionDAG/LegalizeVectorTypes.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp index 417122d467054..c7790404c0de1 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp @@ -496,7 +496,7 @@ SDValue DAGTypeLegalizer::ScalarizeVecRes_LOAD(LoadSDNode *N) { SDValue Result = DAG.getLoad( ISD::UNINDEXED, N->getExtensionType(), N->getValueType(0).getVectorElementType(), SDLoc(N), N->getChain(), - N->getBasePtr(), DAG.getUNDEF(N->getBasePtr().getValueType()), + N->getBasePtr(), DAG.getPOISON(N->getBasePtr().getValueType()), N->getPointerInfo(), N->getMemoryVT().getVectorElementType(), N->getBaseAlign(), N->getMemOperand()->getFlags(), N->getAAInfo()); @@ -2213,7 +2213,7 @@ void DAGTypeLegalizer::SplitVecRes_LOAD(LoadSDNode *LD, SDValue &Lo, ISD::LoadExtType ExtType = LD->getExtensionType(); SDValue Ch = LD->getChain(); SDValue Ptr = LD->getBasePtr(); - SDValue Offset = DAG.getUNDEF(Ptr.getValueType()); + SDValue Offset = DAG.getPOISON(Ptr.getValueType()); EVT MemoryVT = LD->getMemoryVT(); MachineMemOperand::Flags MMOFlags = LD->getMemOperand()->getFlags(); AAMDNodes AAInfo = LD->getAAInfo(); @@ -3344,7 +3344,7 @@ void DAGTypeLegalizer::SplitVecRes_VP_REVERSE(SDNode *N, SDValue &Lo, SDValue TrueMask = DAG.getBoolConstant(true, DL, Mask.getValueType(), VT); SDValue Store = DAG.getStridedStoreVP(DAG.getEntryNode(), DL, Val, StorePtr, - DAG.getUNDEF(PtrVT), Stride, TrueMask, + DAG.getPOISON(PtrVT), Stride, TrueMask, EVL, MemVT, StoreMMO, ISD::UNINDEXED); SDValue Load = DAG.getLoadVP(VT, DL, Store, StackPtr, Mask, EVL, LoadMMO); @@ -3387,14 +3387,16 @@ void DAGTypeLegalizer::SplitVecRes_VP_SPLICE(SDNode *N, SDValue &Lo, SDValue StackPtr2 = TLI.getVectorElementPointer(DAG, StackPtr, VT, EVL1); + SDValue PoisonPtr = DAG.getPOISON(PtrVT); + SDValue TrueMask = DAG.getBoolConstant(true, DL, Mask.getValueType(), VT); - SDValue StoreV1 = DAG.getStoreVP(DAG.getEntryNode(), DL, V1, StackPtr, - DAG.getUNDEF(PtrVT), TrueMask, EVL1, - V1.getValueType(), StoreMMO, ISD::UNINDEXED); + SDValue StoreV1 = + DAG.getStoreVP(DAG.getEntryNode(), DL, V1, StackPtr, PoisonPtr, TrueMask, + EVL1, V1.getValueType(), StoreMMO, ISD::UNINDEXED); SDValue StoreV2 = - DAG.getStoreVP(StoreV1, DL, V2, StackPtr2, DAG.getUNDEF(PtrVT), TrueMask, - EVL2, V2.getValueType(), StoreMMO, ISD::UNINDEXED); + DAG.getStoreVP(StoreV1, DL, V2, StackPtr2, PoisonPtr, TrueMask, EVL2, + V2.getValueType(), StoreMMO, ISD::UNINDEXED); SDValue Load; if (Imm >= 0) {