diff options
| author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-10-12 12:10:34 +0000 |
|---|---|---|
| committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-10-12 12:10:34 +0000 |
| commit | 29279f29c80b6ac35c187772c4337983c62a4815 (patch) | |
| tree | 5478d09dd472f5c7297ee2d672b8f4b80796b09b /llvm/lib/Target/X86 | |
| parent | f5617dce1ffb17a295790229e07be1172f0dcd7b (diff) | |
| download | bcm5719-llvm-29279f29c80b6ac35c187772c4337983c62a4815.tar.gz bcm5719-llvm-29279f29c80b6ac35c187772c4337983c62a4815.zip | |
[X86][SSE] Add extract_subvector(PSHUFB) -> PSHUFB(extract_subvector()) combine
Fixes PR32160 by reducing the size of PSHUFB if we only use one of the lanes.
This approach can probably be generalized to handle any target shuffle (and any subvector index) but we have no test coverage at the moment.
llvm-svn: 344336
Diffstat (limited to 'llvm/lib/Target/X86')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index c6ab4fb70f6..15bd238833d 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -40306,6 +40306,18 @@ static SDValue combineExtractSubvector(SDNode *N, SelectionDAG &DAG, : ISD::SIGN_EXTEND_VECTOR_INREG; return DAG.getNode(ExtOp, SDLoc(N), OpVT, InVec.getOperand(0)); } + if (InOpcode == ISD::BITCAST) { + // TODO - do this for target shuffles in general. + SDValue InVecBC = peekThroughOneUseBitcasts(InVec); + if (InVecBC.getOpcode() == X86ISD::PSHUFB && OpVT.is128BitVector()) { + SDLoc DL(N); + SDValue SubPSHUFB = + DAG.getNode(X86ISD::PSHUFB, DL, MVT::v16i8, + extract128BitVector(InVecBC.getOperand(0), 0, DAG, DL), + extract128BitVector(InVecBC.getOperand(1), 0, DAG, DL)); + return DAG.getBitcast(OpVT, SubPSHUFB); + } + } } return SDValue(); |

