From cd09f4b9510583e847267cae04eee87caf4d5e9d Mon Sep 17 00:00:00 2001 From: yan zhou <42528857+zhou3968322@users.noreply.github.com> Date: Thu, 21 Dec 2023 20:39:05 +0800 Subject: [PATCH] [CodeGen] This patch fix a bug that may caused error for a self-defined target in SelectionDAG::getNode (#75320) we need first judge N1.getNumOperands() > 0. If Lowering Generated SDNode like. ``` v2i32 t20: TargetOpNode. i32 t21: extract_vector_elt t20 0 i32 t22: extract_vector_elt t20 1 ``` will cause a error. --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 5be1892a44f6dd..81facf92e55ae9 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -6858,8 +6858,8 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT, // expanding copies of large vectors from registers. This only works for // fixed length vectors, since we need to know the exact number of // elements. - if (N2C && N1.getOperand(0).getValueType().isFixedLengthVector() && - N1.getOpcode() == ISD::CONCAT_VECTORS && N1.getNumOperands() > 0) { + if (N2C && N1.getOpcode() == ISD::CONCAT_VECTORS && + N1.getOperand(0).getValueType().isFixedLengthVector()) { unsigned Factor = N1.getOperand(0).getValueType().getVectorNumElements(); return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, @@ -6976,7 +6976,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT, // EXTRACT_SUBVECTOR of CONCAT_VECTOR can be simplified if the pieces of // the concat have the same type as the extract. - if (N1.getOpcode() == ISD::CONCAT_VECTORS && N1.getNumOperands() > 0 && + if (N1.getOpcode() == ISD::CONCAT_VECTORS && VT == N1.getOperand(0).getValueType()) { unsigned Factor = VT.getVectorMinNumElements(); return N1.getOperand(N2C->getZExtValue() / Factor);