summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2018-12-06 16:29:14 +0000
committerSimon Pilgrim <llvm-dev@redking.me.uk>2018-12-06 16:29:14 +0000
commitbb650daeaf5d7dd9786ce90431c4c68afb09fabc (patch)
treebd54cd607c4f5ae77ebad45a192fe575c206b730
parent2e1a7821895ffdb6bb7309ad31853da082510f4b (diff)
downloadbcm5719-llvm-bb650daeaf5d7dd9786ce90431c4c68afb09fabc.tar.gz
bcm5719-llvm-bb650daeaf5d7dd9786ce90431c4c68afb09fabc.zip
[X86] Refactored IsSplatVector to use switch. NFCI.
Initial step towards making the function more generic (and probably move into SelectionDAG). This is necessary to avoid massive codegen bloat for PR38243 (Add modulo rotate support to LowerRotate). llvm-svn: 348498
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp45
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,
OpenPOWER on IntegriCloud