diff options
Diffstat (limited to 'llvm/lib/Target/X86/X86ISelLowering.cpp')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 46 |
1 files changed, 23 insertions, 23 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index def4be5afb5..c8ed78d0b4e 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -16296,34 +16296,25 @@ static SDValue ExtractBitFromMaskVector(SDValue Op, SelectionDAG &DAG, } unsigned IdxVal = cast<ConstantSDNode>(Idx)->getZExtValue(); + if (IdxVal == 0) // the operation is legal + return Op; - // If the kshift instructions of the correct width aren't natively supported - // then we need to promote the vector to the native size to get the correct - // zeroing behavior. - if (VecVT.getVectorNumElements() < 16) { - VecVT = MVT::v16i1; - Vec = DAG.getNode(ISD::INSERT_SUBVECTOR, dl, MVT::v16i1, - DAG.getUNDEF(VecVT), Vec, + // Extend to natively supported kshift. + unsigned NumElems = VecVT.getVectorNumElements(); + MVT WideVecVT = VecVT; + if ((!Subtarget.hasDQI() && NumElems == 8) || NumElems < 8) { + WideVecVT = Subtarget.hasDQI() ? MVT::v8i1 : MVT::v16i1; + Vec = DAG.getNode(ISD::INSERT_SUBVECTOR, dl, WideVecVT, + DAG.getUNDEF(WideVecVT), Vec, DAG.getIntPtrConstant(0, dl)); } - // Extracts from element 0 are always allowed. - if (IdxVal != 0) { - // Use kshiftr instruction to move to the lower element. - Vec = DAG.getNode(X86ISD::KSHIFTR, dl, VecVT, Vec, - DAG.getConstant(IdxVal, dl, MVT::i8)); - } - - // Shrink to v16i1 since that's always legal. - if (VecVT.getVectorNumElements() > 16) { - VecVT = MVT::v16i1; - Vec = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, VecVT, Vec, - DAG.getIntPtrConstant(0, dl)); - } + // Use kshiftr instruction to move to the lower element. + Vec = DAG.getNode(X86ISD::KSHIFTR, dl, WideVecVT, Vec, + DAG.getConstant(IdxVal, dl, MVT::i8)); - // Convert to a bitcast+aext/trunc. - MVT CastVT = MVT::getIntegerVT(VecVT.getVectorNumElements()); - return DAG.getAnyExtOrTrunc(DAG.getBitcast(CastVT, Vec), dl, EltVT); + return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, Op.getValueType(), Vec, + DAG.getIntPtrConstant(0, dl)); } SDValue @@ -41413,6 +41404,15 @@ static SDValue combineScalarToVector(SDNode *N, SelectionDAG &DAG) { return DAG.getNode(ISD::SCALAR_TO_VECTOR, SDLoc(N), MVT::v1i1, Src.getOperand(0)); + // Combine scalar_to_vector of an extract_vector_elt into an extract_subvec. + if (VT == MVT::v1i1 && Src.getOpcode() == ISD::EXTRACT_VECTOR_ELT && + Src.hasOneUse() && Src.getOperand(0).getValueType().isVector() && + Src.getOperand(0).getValueType().getVectorElementType() == MVT::i1) + if (auto *C = dyn_cast<ConstantSDNode>(Src.getOperand(1))) + if (C->isNullValue()) + return DAG.getNode(ISD::EXTRACT_SUBVECTOR, SDLoc(N), VT, + Src.getOperand(0), Src.getOperand(1)); + return SDValue(); } |

