summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86/X86ISelLowering.cpp
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2018-09-29 14:17:32 +0000
committerSimon Pilgrim <llvm-dev@redking.me.uk>2018-09-29 14:17:32 +0000
commit22d51014afb3b29e2918bf7cf8c17b04944da6b0 (patch)
tree89a9a56c736bcb26da94bb1c277e97e19a73ca36 /llvm/lib/Target/X86/X86ISelLowering.cpp
parentd029a9bfa0208c14fc698c0f25ef3f7450726ef4 (diff)
downloadbcm5719-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.cpp15
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;
}
OpenPOWER on IntegriCloud