diff options
| author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-01-26 21:39:25 +0000 |
|---|---|---|
| committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-01-26 21:39:25 +0000 |
| commit | 00adc1e105734a2a3982191863cff482676cad7d (patch) | |
| tree | 219d099ffd3a31e8956441294b9d15a7e25527c2 /llvm/lib/Target | |
| parent | 2cc7fec76a0ad622f1fcdb5ffee93cf5d53c08ee (diff) | |
| download | bcm5719-llvm-00adc1e105734a2a3982191863cff482676cad7d.tar.gz bcm5719-llvm-00adc1e105734a2a3982191863cff482676cad7d.zip | |
[X86] Add support for zeroed shuffle elements to getShuffleScalarElt
Enable handling of SM_SentinelZero shuffle elements to getShuffleScalarElt. Improves VZEXT_LOAD matches in EltsFromConsecutiveLoads.
llvm-svn: 258865
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index cb5a8b3d2df..749e57819ef 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -5135,16 +5135,20 @@ static SDValue getShuffleScalarElt(SDNode *N, unsigned Index, SelectionDAG &DAG, // Recurse into target specific vector shuffles to find scalars. if (isTargetShuffle(Opcode)) { MVT ShufVT = V.getSimpleValueType(); + MVT ShufSVT = ShufVT.getVectorElementType(); int NumElems = (int)ShufVT.getVectorNumElements(); SmallVector<int, 16> ShuffleMask; bool IsUnary; - if (!getTargetShuffleMask(N, ShufVT, false, ShuffleMask, IsUnary)) + if (!getTargetShuffleMask(N, ShufVT, true, ShuffleMask, IsUnary)) return SDValue(); int Elt = ShuffleMask[Index]; + if (Elt == SM_SentinelZero) + return ShufSVT.isInteger() ? DAG.getConstant(0, SDLoc(N), ShufSVT) + : DAG.getConstantFP(+0.0, SDLoc(N), ShufSVT); if (Elt == SM_SentinelUndef) - return DAG.getUNDEF(ShufVT.getVectorElementType()); + return DAG.getUNDEF(ShufSVT); assert(0 <= Elt && Elt < (2*NumElems) && "Shuffle index out of range"); SDValue NewV = (Elt < NumElems) ? N->getOperand(0) : N->getOperand(1); |

