diff options
| author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-01-11 14:25:18 +0000 |
|---|---|---|
| committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-01-11 14:25:18 +0000 |
| commit | 6e6da3f449ae631cd1812ec045a44c6015c0fcdb (patch) | |
| tree | db2f007a2744dec1f2633767475911a682f81341 /llvm/lib | |
| parent | 774355e3210839cf649499a89084bb8cd0f542d1 (diff) | |
| download | bcm5719-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.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 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. |

