diff options
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 50 |
1 files changed, 0 insertions, 50 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 20faa8e3132..c66fac66500 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -40097,56 +40097,6 @@ static SDValue combineVSZext(SDNode *N, SelectionDAG &DAG, return getConstVector(Vals, Undefs, VT, DAG, DL); } - // (vzext (bitcast (vzext (x)) -> (vzext x) - // TODO: (vsext (bitcast (vsext (x)) -> (vsext x) - SDValue V = peekThroughBitcasts(Op); - if (Opcode == X86ISD::VZEXT && V != Op && V.getOpcode() == X86ISD::VZEXT) { - MVT InnerVT = V.getSimpleValueType(); - MVT InnerEltVT = InnerVT.getVectorElementType(); - - // If the element sizes match exactly, we can just do one larger vzext. This - // is always an exact type match as vzext operates on integer types. - if (OpEltVT == InnerEltVT) { - assert(OpVT == InnerVT && "Types must match for vzext!"); - return DAG.getNode(X86ISD::VZEXT, DL, VT, V.getOperand(0)); - } - - // The only other way we can combine them is if only a single element of the - // inner vzext is used in the input to the outer vzext. - if (InnerEltVT.getSizeInBits() < InputBits) - return SDValue(); - - // In this case, the inner vzext is completely dead because we're going to - // only look at bits inside of the low element. Just do the outer vzext on - // a bitcast of the input to the inner. - return DAG.getNode(X86ISD::VZEXT, DL, VT, DAG.getBitcast(OpVT, V)); - } - - // Check if we can bypass extracting and re-inserting an element of an input - // vector. Essentially: - // (bitcast (sclr2vec (ext_vec_elt x))) -> (bitcast x) - // TODO: Add X86ISD::VSEXT support - if (Opcode == X86ISD::VZEXT && - V.getOpcode() == ISD::SCALAR_TO_VECTOR && - V.getOperand(0).getOpcode() == ISD::EXTRACT_VECTOR_ELT && - V.getOperand(0).getSimpleValueType().getSizeInBits() == InputBits) { - SDValue ExtractedV = V.getOperand(0); - SDValue OrigV = ExtractedV.getOperand(0); - if (isNullConstant(ExtractedV.getOperand(1))) { - MVT OrigVT = OrigV.getSimpleValueType(); - // Extract a subvector if necessary... - if (OrigVT.getSizeInBits() > OpVT.getSizeInBits()) { - int Ratio = OrigVT.getSizeInBits() / OpVT.getSizeInBits(); - OrigVT = MVT::getVectorVT(OrigVT.getVectorElementType(), - OrigVT.getVectorNumElements() / Ratio); - OrigV = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, OrigVT, OrigV, - DAG.getIntPtrConstant(0, DL)); - } - Op = DAG.getBitcast(OpVT, OrigV); - return DAG.getNode(X86ISD::VZEXT, DL, VT, Op); - } - } - return SDValue(); } |