diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/AArch64/AArch64ISelLowering.cpp | 9 | ||||
-rw-r--r-- | llvm/lib/Target/RISCV/RISCVISelLowering.cpp | 18 |
2 files changed, 15 insertions, 12 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp index fb8bd81..761f7ea 100644 --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -15125,11 +15125,14 @@ SDValue AArch64TargetLowering::LowerBUILD_VECTOR(SDValue Op, if (PreferDUPAndInsert) { // First, build a constant vector with the common element. - SmallVector<SDValue, 8> Ops(NumElts, Value); + // Make sure to freeze the common element first, since we will use it also + // for indices that should be UNDEF (so we want to avoid making those + // elements more poisonous). + SmallVector<SDValue, 8> Ops(NumElts, DAG.getFreeze(Value)); SDValue NewVector = LowerBUILD_VECTOR(DAG.getBuildVector(VT, DL, Ops), DAG); // Next, insert the elements that do not match the common value. for (unsigned I = 0; I < NumElts; ++I) - if (Op.getOperand(I) != Value) + if (Op.getOperand(I) != Value && !Op.getOperand(I).isUndef()) NewVector = DAG.getNode(ISD::INSERT_VECTOR_ELT, DL, VT, NewVector, Op.getOperand(I), DAG.getConstant(I, DL, MVT::i64)); @@ -28721,7 +28724,7 @@ static SDValue convertToScalableVector(SelectionDAG &DAG, EVT VT, SDValue V) { "Expected a fixed length vector operand!"); SDLoc DL(V); SDValue Zero = DAG.getConstant(0, DL, MVT::i64); - return DAG.getNode(ISD::INSERT_SUBVECTOR, DL, VT, DAG.getUNDEF(VT), V, Zero); + return DAG.getNode(ISD::INSERT_SUBVECTOR, DL, VT, DAG.getPOISON(VT), V, Zero); } // Shrink V so it's just big enough to maintain a VT's worth of data. diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp index 4f280c3..55e352a 100644 --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -2859,7 +2859,7 @@ static SDValue convertToScalableVector(EVT VT, SDValue V, SelectionDAG &DAG, assert(V.getValueType().isFixedLengthVector() && "Expected a fixed length vector operand!"); SDLoc DL(V); - return DAG.getInsertSubvector(DL, DAG.getUNDEF(VT), V, 0); + return DAG.getInsertSubvector(DL, DAG.getPOISON(VT), V, 0); } // Shrink V so it's just big enough to maintain a VT's worth of data. @@ -4347,7 +4347,8 @@ static SDValue lowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG, DAG.getNode(ISD::BUILD_VECTOR, DL, OneRegVT, OneVRegOfOps); SubBV = convertToScalableVector(M1VT, SubBV, DAG, Subtarget); unsigned InsertIdx = (i / ElemsPerVReg) * NumOpElts; - Vec = DAG.getInsertSubvector(DL, Vec, SubBV, InsertIdx); + Vec = DAG.getInsertSubvector(DL, Vec, SubBV, InsertIdx, + /*SkipUndef=*/true); } return convertFromScalableVector(VT, Vec, DAG, Subtarget); } @@ -7849,10 +7850,8 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op, SDValue Vec = DAG.getUNDEF(VT); for (const auto &OpIdx : enumerate(Op->ops())) { SDValue SubVec = OpIdx.value(); - // Don't insert undef subvectors. - if (SubVec.isUndef()) - continue; - Vec = DAG.getInsertSubvector(DL, Vec, SubVec, OpIdx.index() * NumOpElts); + Vec = DAG.getInsertSubvector(DL, Vec, SubVec, OpIdx.index() * NumOpElts, + /*SkipUndef=*/true); } return Vec; } @@ -12272,9 +12271,10 @@ SDValue RISCVTargetLowering::lowerVECTOR_REVERSE(SDValue Op, Hi = DAG.getNode(ISD::VECTOR_REVERSE, DL, HiVT, Hi); // Reassemble the low and high pieces reversed. // FIXME: This is a CONCAT_VECTORS. - SDValue Res = DAG.getInsertSubvector(DL, DAG.getUNDEF(VecVT), Hi, 0); - return DAG.getInsertSubvector(DL, Res, Lo, - LoVT.getVectorMinNumElements()); + SDValue Res = DAG.getInsertSubvector(DL, DAG.getUNDEF(VecVT), Hi, 0, + /*SkipUndef=*/true); + return DAG.getInsertSubvector(DL, Res, Lo, LoVT.getVectorMinNumElements(), + /*SkipUndef=*/true); } // Just promote the int type to i16 which will double the LMUL. |