summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2016-12-01 15:41:40 +0000
committerSimon Pilgrim <llvm-dev@redking.me.uk>2016-12-01 15:41:40 +0000
commit1e4d8709992da36e46dca5b214a6810a0380948e (patch)
tree8368fc0c057c29f3716c8b2b121326b323632acf /llvm/lib
parent5d9f8f914acf221b3a4c531e0335bf0dc2dad21c (diff)
downloadbcm5719-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.cpp11
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)
OpenPOWER on IntegriCloud