diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2017-02-10 14:04:11 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2017-02-10 14:04:11 +0000 |
commit | c371159aac979c9219cf4c3f89e55a88084e7e3f (patch) | |
tree | 9fb9ad9a71b35d6879ca739d4b0521a250e47e56 /llvm/lib/Target/X86/X86ISelLowering.cpp | |
parent | 11402814139dc78dddeb6ca5f733fbe727a2e142 (diff) | |
download | bcm5719-llvm-c371159aac979c9219cf4c3f89e55a88084e7e3f.tar.gz bcm5719-llvm-c371159aac979c9219cf4c3f89e55a88084e7e3f.zip |
[X86][SSE] Add support for extracting target constants from BUILD_VECTOR
In some cases we call getTargetConstantBitsFromNode for nodes that haven't been lowered from BUILD_VECTOR yet
Note: We're getting very close to being able to move most of the constant extraction code from getTargetShuffleMaskIndices into getTargetConstantBitsFromNode
llvm-svn: 294746
Diffstat (limited to 'llvm/lib/Target/X86/X86ISelLowering.cpp')
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 4fddf3ff1d6..7200b1cea45 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -5212,6 +5212,23 @@ static bool getTargetConstantBitsFromNode(SDValue Op, unsigned EltSizeInBits, return false; }; + // Extract constant bits from build vector. + if (ISD::isBuildVectorOfConstantSDNodes(Op.getNode())) { + unsigned SrcEltSizeInBits = VT.getScalarSizeInBits(); + for (unsigned i = 0, e = Op.getNumOperands(); i != e; ++i) { + const SDValue &Src = Op.getOperand(i); + if (Src.isUndef()) { + APInt Undefs = APInt::getLowBitsSet(SizeInBits, SrcEltSizeInBits); + UndefBits |= Undefs.shl(i * SrcEltSizeInBits); + continue; + } + auto *Cst = cast<ConstantSDNode>(Src); + APInt Bits = Cst->getAPIntValue().zextOrTrunc(SrcEltSizeInBits); + MaskBits |= Bits.zext(SizeInBits).shl(i * SrcEltSizeInBits); + } + return SplitBitData(); + } + // Extract constant bits from constant pool vector. if (auto *Cst = getTargetConstantFromNode(Op)) { Type *CstTy = Cst->getType(); |