summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2018-01-11 14:25:18 +0000
committerSimon Pilgrim <llvm-dev@redking.me.uk>2018-01-11 14:25:18 +0000
commit6e6da3f449ae631cd1812ec045a44c6015c0fcdb (patch)
treedb2f007a2744dec1f2633767475911a682f81341 /llvm/lib
parent774355e3210839cf649499a89084bb8cd0f542d1 (diff)
downloadbcm5719-llvm-6e6da3f449ae631cd1812ec045a44c6015c0fcdb.tar.gz
bcm5719-llvm-6e6da3f449ae631cd1812ec045a44c6015c0fcdb.zip
[X86][SSE] Add ISD::VECTOR_SHUFFLE to faux shuffle decoding
Primarily, this allows us to use the aggressive extraction mechanisms in combineExtractWithShuffle earlier and make use of UNDEF elements that may be lost during lowering. llvm-svn: 322279
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 52ad6504760..0ad988d69da 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -5940,6 +5940,17 @@ static bool getFauxShuffleMask(SDValue N, SmallVectorImpl<int> &Mask,
unsigned Opcode = N.getOpcode();
switch (Opcode) {
+ case ISD::VECTOR_SHUFFLE: {
+ // Don't treat ISD::VECTOR_SHUFFLE as a target shuffle so decode it here.
+ ArrayRef<int> ShuffleMask = cast<ShuffleVectorSDNode>(N)->getMask();
+ if (isUndefOrInRange(ShuffleMask, 0, 2 * NumElts)) {
+ Mask.append(ShuffleMask.begin(), ShuffleMask.end());
+ Ops.push_back(N.getOperand(0));
+ Ops.push_back(N.getOperand(1));
+ return true;
+ }
+ return false;
+ }
case ISD::AND:
case X86ISD::ANDNP: {
// Attempt to decode as a per-byte mask.
OpenPOWER on IntegriCloud