diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-03-06 21:54:52 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-03-06 21:54:52 +0000 |
commit | 253ca348b2ea5fbde89377dfbbedab100cef4e7a (patch) | |
tree | 545634a99ba3b24f8074b422395e6d2024242bea /llvm/lib/Target/X86/X86ShuffleDecodeConstantPool.cpp | |
parent | dc11054f20a3dc532319217ddc5a9f32a2ccaa07 (diff) | |
download | llvm-253ca348b2ea5fbde89377dfbbedab100cef4e7a.zip llvm-253ca348b2ea5fbde89377dfbbedab100cef4e7a.tar.gz llvm-253ca348b2ea5fbde89377dfbbedab100cef4e7a.tar.bz2 |
[X86][AVX512] Fixed VPERMT2* shuffle mask decoding and enabled target shuffle combining.
Patch to add support for target shuffle combining of X86ISD::VPERMV3 nodes, including support for detecting unary shuffles.
This uncovered several issues with the X86ISD::VPERMV3 shuffle mask decoding of non-64 bit shuffle mask elements - the bit masking wasn't being correctly computed.
Removed non-constant pool mask decode path as we have no way of testing it right now.
Differential Revision: http://reviews.llvm.org/D17916
llvm-svn: 262809
Diffstat (limited to 'llvm/lib/Target/X86/X86ShuffleDecodeConstantPool.cpp')
-rw-r--r-- | llvm/lib/Target/X86/X86ShuffleDecodeConstantPool.cpp | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/llvm/lib/Target/X86/X86ShuffleDecodeConstantPool.cpp b/llvm/lib/Target/X86/X86ShuffleDecodeConstantPool.cpp index e84d76a..4e7714e 100644 --- a/llvm/lib/Target/X86/X86ShuffleDecodeConstantPool.cpp +++ b/llvm/lib/Target/X86/X86ShuffleDecodeConstantPool.cpp @@ -191,6 +191,7 @@ void DecodeVPERMV3Mask(const Constant *C, MVT VT, Type *MaskTy = C->getType(); unsigned NumElements = MaskTy->getVectorNumElements(); if (NumElements == VT.getVectorNumElements()) { + unsigned EltMaskSize = Log2_64(NumElements * 2); for (unsigned i = 0; i < NumElements; ++i) { Constant *COp = C->getAggregateElement(i); if (!COp) { @@ -200,9 +201,9 @@ void DecodeVPERMV3Mask(const Constant *C, MVT VT, if (isa<UndefValue>(COp)) ShuffleMask.push_back(SM_SentinelUndef); else { - uint64_t Element = cast<ConstantInt>(COp)->getZExtValue(); - Element &= (1 << NumElements*2) - 1; - ShuffleMask.push_back(Element); + APInt Element = cast<ConstantInt>(COp)->getValue(); + Element = Element.getLoBits(EltMaskSize); + ShuffleMask.push_back(Element.getZExtValue()); } } } |