diff options
| author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2019-05-10 15:46:04 +0000 |
|---|---|---|
| committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2019-05-10 15:46:04 +0000 |
| commit | a0b1518a4a5738765619fd09a58d12573163ec79 (patch) | |
| tree | c62046eb659ea07eb136c783f67ee91f2cd48be0 /llvm/lib/Target | |
| parent | 7a41cd5b88849bc18b9d0a3971b4f9f551a6bd72 (diff) | |
| download | bcm5719-llvm-a0b1518a4a5738765619fd09a58d12573163ec79.tar.gz bcm5719-llvm-a0b1518a4a5738765619fd09a58d12573163ec79.zip | |
[X86][SSE] Add getHopForBuildVector vector splitting
If we only use the lower xmm of a ymm hop, then extract the xmm's (for free), perform the xmm hop and then insert back into a ymm (for free).
Fixes some of the regressions noted in D61782
llvm-svn: 360435
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 950e0f4c8e7..f7f3d38f68e 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -8581,6 +8581,22 @@ static SDValue getHopForBuildVector(const BuildVectorSDNode *BV, else if (V1.getValueSizeInBits() < Width) V1 = insertSubVector(DAG.getUNDEF(VT), V1, 0, DAG, SDLoc(BV), Width); + unsigned NumElts = VT.getVectorNumElements(); + APInt DemandedElts = APInt::getAllOnesValue(NumElts); + for (unsigned i = 0; i != NumElts; ++i) + if (BV->getOperand(i).isUndef()) + DemandedElts.clearBit(i); + + // If we don't need the upper xmm, then perform as a xmm hop. + unsigned HalfNumElts = NumElts / 2; + if (VT.is256BitVector() && DemandedElts.lshr(HalfNumElts) == 0) { + MVT HalfVT = MVT::getVectorVT(VT.getScalarType(), HalfNumElts); + V0 = extractSubVector(V0, 0, DAG, SDLoc(BV), 128); + V1 = extractSubVector(V1, 0, DAG, SDLoc(BV), 128); + SDValue Half = DAG.getNode(HOpcode, SDLoc(BV), HalfVT, V0, V1); + return insertSubVector(DAG.getUNDEF(VT), Half, 0, DAG, SDLoc(BV), 256); + } + return DAG.getNode(HOpcode, SDLoc(BV), VT, V0, V1); } |

