diff options
| author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-12-01 15:41:40 +0000 |
|---|---|---|
| committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-12-01 15:41:40 +0000 |
| commit | 1e4d8709992da36e46dca5b214a6810a0380948e (patch) | |
| tree | 8368fc0c057c29f3716c8b2b121326b323632acf /llvm/lib | |
| parent | 5d9f8f914acf221b3a4c531e0335bf0dc2dad21c (diff) | |
| download | bcm5719-llvm-1e4d8709992da36e46dca5b214a6810a0380948e.tar.gz bcm5719-llvm-1e4d8709992da36e46dca5b214a6810a0380948e.zip | |
[X86][SSE] Add support for combining AND bitmasks to shuffles.
llvm-svn: 288365
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 661d28156ba..85766c9f0cc 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -29889,6 +29889,17 @@ static SDValue combineAnd(SDNode *N, SelectionDAG &DAG, SDValue N1 = N->getOperand(1); SDLoc DL(N); + // Attempt to recursively combine a bitmask AND with shuffles. + if (VT.isVector() && (VT.getScalarSizeInBits() % 8) == 0) { + SDValue Op(N, 0); + SmallVector<int, 1> NonceMask; // Just a placeholder. + NonceMask.push_back(0); + if (combineX86ShufflesRecursively({Op}, 0, Op, NonceMask, + /*Depth*/ 1, /*HasPSHUFB*/ false, DAG, + DCI, Subtarget)) + return SDValue(); // This routine will use CombineTo to replace N. + } + // Create BEXTR instructions // BEXTR is ((X >> imm) & (2**size-1)) if (VT != MVT::i32 && VT != MVT::i64) |

