diff options
author | Bjorn Pettersson <bjorn.a.pettersson@ericsson.com> | 2025-05-31 09:37:27 +0200 |
---|---|---|
committer | Bjorn Pettersson <bjorn.a.pettersson@ericsson.com> | 2025-07-04 00:38:25 +0200 |
commit | be4f7432d8f35a8b07dc745736dccac6ae742743 (patch) | |
tree | b0634208ac354eb98f629608b9f0dd3e438a5899 /llvm/lib | |
parent | fe73a97a1ef8c1c2df5999e0b6abecde0e89733b (diff) | |
download | llvm-users/bjope/insertundef_4.zip llvm-users/bjope/insertundef_4.tar.gz llvm-users/bjope/insertundef_4.tar.bz2 |
[SelectionDAG] Deal with POISON for INSERT_VECTOR_ELT/INSERT_SUBVECTOR (part 3)users/bjope/insertundef_4
Target specific patches to avoid regressions seen after "part 1"
aiming at fixing github issue #141034.
One perhaps controversial change here is that convertToScalableVector
now uses POISON instead of UNDEF for any additional elements added
when converting to the scalable vector. This can avoid that we end
up with things like
t31: nxv1f32 =
t32: v2f32 = extract_subvector t31, Constant:i64<0>
t38: nxv1f32 = insert_subvector undef:nxv1f32, t32, Constant:i64<0>
since if we instead try to insert into poison we can just use t31
instead of t38 without the risk that t31 would be more poisonous.
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. |