diff options
| author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2019-03-16 15:02:00 +0000 |
|---|---|---|
| committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2019-03-16 15:02:00 +0000 |
| commit | f2c53b5d6c5516ed5f270e3e8e90281ea6acbea9 (patch) | |
| tree | 2ce2c60a41adb1affabeea3d5555621747cb1cff /llvm/lib/Target | |
| parent | 0f472e1d01d60b6e615cd71a09b0a52eb8e42072 (diff) | |
| download | bcm5719-llvm-f2c53b5d6c5516ed5f270e3e8e90281ea6acbea9.tar.gz bcm5719-llvm-f2c53b5d6c5516ed5f270e3e8e90281ea6acbea9.zip | |
[X86][SSE] Constant fold PEXTRB/PEXTRW/EXTRACT_VECTOR_ELT nodes.
Replaces existing i1-only fold.
llvm-svn: 356325
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 43 |
1 files changed, 26 insertions, 17 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index d6ee4a3e302..8fa0309e092 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -34552,23 +34552,41 @@ static SDValue combineExtractVectorElt(SDNode *N, SelectionDAG &DAG, if (SDValue NewOp = combineExtractWithShuffle(N, DAG, DCI, Subtarget)) return NewOp; + SDValue InputVector = N->getOperand(0); + SDValue EltIdx = N->getOperand(1); + auto *CIdx = dyn_cast<ConstantSDNode>(EltIdx); + + EVT SrcVT = InputVector.getValueType(); + EVT VT = N->getValueType(0); + SDLoc dl(InputVector); + bool IsPextr = N->getOpcode() != ISD::EXTRACT_VECTOR_ELT; + + // Integer Constant Folding. + if (VT.isInteger() && CIdx && + CIdx->getAPIntValue().ult(SrcVT.getVectorNumElements())) { + APInt UndefVecElts; + SmallVector<APInt, 16> EltBits; + unsigned VecEltBitWidth = SrcVT.getScalarSizeInBits(); + if (getTargetConstantBitsFromNode(InputVector, VecEltBitWidth, UndefVecElts, + EltBits, true, false)) { + uint64_t Idx = CIdx->getZExtValue(); + if (UndefVecElts[Idx]) + return IsPextr ? DAG.getConstant(0, dl, VT) : DAG.getUNDEF(VT); + return DAG.getConstant(EltBits[Idx].zextOrSelf(VT.getScalarSizeInBits()), + dl, VT); + } + } + // TODO - Remove this once we can handle the implicit zero-extension of // X86ISD::PEXTRW/X86ISD::PEXTRB in: // XFormVExtractWithShuffleIntoLoad, combineHorizontalPredicateResult and // combineBasicSADPattern. - if (N->getOpcode() != ISD::EXTRACT_VECTOR_ELT) + if (IsPextr) return SDValue(); if (SDValue NewOp = XFormVExtractWithShuffleIntoLoad(N, DAG, DCI)) return NewOp; - SDValue InputVector = N->getOperand(0); - SDValue EltIdx = N->getOperand(1); - - EVT SrcVT = InputVector.getValueType(); - EVT VT = N->getValueType(0); - SDLoc dl(InputVector); - // Detect mmx extraction of all bits as a i64. It works better as a bitcast. if (InputVector.getOpcode() == ISD::BITCAST && InputVector.hasOneUse() && VT == MVT::i64 && SrcVT == MVT::v1i64 && isNullConstant(EltIdx)) { @@ -34589,15 +34607,6 @@ static SDValue combineExtractVectorElt(SDNode *N, SelectionDAG &DAG, return DAG.getNode(X86ISD::MMX_MOVD2W, dl, MVT::i32, MMXSrc); } - if (VT == MVT::i1 && InputVector.getOpcode() == ISD::BITCAST && - isa<ConstantSDNode>(EltIdx) && - isa<ConstantSDNode>(InputVector.getOperand(0))) { - uint64_t ExtractedElt = N->getConstantOperandVal(1); - const APInt &InputValue = InputVector.getConstantOperandAPInt(0); - uint64_t Res = InputValue[ExtractedElt]; - return DAG.getConstant(Res, dl, MVT::i1); - } - // Check whether this extract is the root of a sum of absolute differences // pattern. This has to be done here because we really want it to happen // pre-legalization, |

