diff options
| author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-09-29 14:17:32 +0000 |
|---|---|---|
| committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2018-09-29 14:17:32 +0000 |
| commit | 22d51014afb3b29e2918bf7cf8c17b04944da6b0 (patch) | |
| tree | 89a9a56c736bcb26da94bb1c277e97e19a73ca36 /llvm/lib/Target/X86/X86ISelLowering.cpp | |
| parent | d029a9bfa0208c14fc698c0f25ef3f7450726ef4 (diff) | |
| download | bcm5719-llvm-22d51014afb3b29e2918bf7cf8c17b04944da6b0.tar.gz bcm5719-llvm-22d51014afb3b29e2918bf7cf8c17b04944da6b0.zip | |
[X86] getTargetConstantBitsFromNode - add support for peeking through ISD::EXTRACT_SUBVECTOR
llvm-svn: 343375
Diffstat (limited to 'llvm/lib/Target/X86/X86ISelLowering.cpp')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 58a1865a9d8..a71c3271ed7 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -5742,6 +5742,21 @@ static bool getTargetConstantBitsFromNode(SDValue Op, unsigned EltSizeInBits, return CastBitData(UndefSrcElts, SrcEltBits); } + // Extract constant bits from a subvector's source. + if (Op.getOpcode() == ISD::EXTRACT_SUBVECTOR && + isa<ConstantSDNode>(Op.getOperand(1))) { + if (getTargetConstantBitsFromNode(Op.getOperand(0), EltSizeInBits, + UndefElts, EltBits, AllowWholeUndefs, + AllowPartialUndefs)) { + unsigned NumSubElts = VT.getVectorNumElements(); + unsigned BaseIdx = Op.getConstantOperandVal(1); + UndefElts = UndefElts.extractBits(NumSubElts, BaseIdx); + EltBits.erase(EltBits.begin() + BaseIdx + NumSubElts, EltBits.end()); + EltBits.erase(EltBits.begin(), EltBits.begin() + BaseIdx); + return true; + } + } + return false; } |

