diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 45 |
1 files changed, 24 insertions, 21 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 5bdfdfa6033..d725fbd6f41 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -24069,47 +24069,50 @@ static SDValue LowerScalarImmediateShift(SDValue Op, SelectionDAG &DAG, static SDValue IsSplatVector(SDValue V, int &SplatIdx) { V = peekThroughEXTRACT_SUBVECTORs(V); - // Check if this is a splat build_vector node. - if (BuildVectorSDNode *BV = dyn_cast<BuildVectorSDNode>(V)) { - BitVector BVUndefElts; - SDValue SplatAmt = BV->getSplatValue(&BVUndefElts); + unsigned Opcode = V.getOpcode(); + switch (Opcode) { + case ISD::BUILD_VECTOR: { + BitVector UndefElts; + SDValue SplatAmt = cast<BuildVectorSDNode>(V)->getSplatValue(&UndefElts); if (SplatAmt && !SplatAmt.isUndef()) { - for (int i = 0, e = BVUndefElts.size(); i != e; ++i) - if (!BVUndefElts[i]) { + for (int i = 0, e = UndefElts.size(); i != e; ++i) + if (!UndefElts[i]) { SplatIdx = i; return V; } } - return SDValue(); + break; } - - // Check for SUB(SPLAT_BV, SPLAT) cases from rotate patterns. - if (V.getOpcode() == ISD::SUB) { + case ISD::VECTOR_SHUFFLE: { + // Check if this is a shuffle node doing a splat. + auto *SVN = cast<ShuffleVectorSDNode>(V); + if (!SVN->isSplat()) + break; + int Idx = SVN->getSplatIndex(); + int NumElts = V.getValueType().getVectorNumElements(); + SplatIdx = Idx % NumElts; + return V.getOperand(Idx / NumElts); + } + case ISD::SUB: { SDValue LHS = peekThroughEXTRACT_SUBVECTORs(V.getOperand(0)); SDValue RHS = peekThroughEXTRACT_SUBVECTORs(V.getOperand(1)); // Ensure that the corresponding splat BV element is not UNDEF. BitVector UndefElts; - BuildVectorSDNode *BV0 = dyn_cast<BuildVectorSDNode>(LHS); - ShuffleVectorSDNode *SVN1 = dyn_cast<ShuffleVectorSDNode>(RHS); + auto *BV0 = dyn_cast<BuildVectorSDNode>(LHS); + auto *SVN1 = dyn_cast<ShuffleVectorSDNode>(RHS); if (BV0 && SVN1 && BV0->getSplatValue(&UndefElts) && SVN1->isSplat()) { int Idx = SVN1->getSplatIndex(); if (!UndefElts[Idx]) { SplatIdx = Idx; return V; } - return SDValue(); } + break; + } } - // Check if this is a shuffle node doing a splat. - ShuffleVectorSDNode *SVN = dyn_cast<ShuffleVectorSDNode>(V); - if (!SVN || !SVN->isSplat()) - return SDValue(); - int Idx = SVN->getSplatIndex(); - int NumElts = V.getValueType().getVectorNumElements(); - SplatIdx = Idx % NumElts; - return V.getOperand(Idx / NumElts); + return SDValue(); } static SDValue GetSplatValue(SDValue V, const SDLoc &dl, |