From e7690b01073b4832cb5df60e6bc8a0537cd216ba Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 2 Mar 2008 05:28:33 +0000 Subject: Add a new ShuffleVectorInst::getMaskValue method. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47813 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/VMCore/Instructions.cpp | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) (limited to 'lib/VMCore/Instructions.cpp') diff --git a/lib/VMCore/Instructions.cpp b/lib/VMCore/Instructions.cpp index c0b3413da3..dfd3b830ca 100644 --- a/lib/VMCore/Instructions.cpp +++ b/lib/VMCore/Instructions.cpp @@ -1350,16 +1350,34 @@ ShuffleVectorInst::ShuffleVectorInst(Value *V1, Value *V2, Value *Mask, bool ShuffleVectorInst::isValidOperands(const Value *V1, const Value *V2, const Value *Mask) { - if (!isa(V1->getType())) return false; - if (V1->getType() != V2->getType()) return false; - if (!isa(Mask->getType()) || - cast(Mask->getType())->getElementType() != Type::Int32Ty || - cast(Mask->getType())->getNumElements() != - cast(V1->getType())->getNumElements()) + if (!isa(V1->getType()) || + V1->getType() != V2->getType()) + return false; + + const VectorType *MaskTy = dyn_cast(Mask->getType()); + if (!isa(Mask) || MaskTy == 0 || + MaskTy->getElementType() != Type::Int32Ty || + MaskTy->getNumElements() != + cast(V1->getType())->getNumElements()) return false; return true; } +/// getMaskValue - Return the index from the shuffle mask for the specified +/// output result. This is either -1 if the element is undef or a number less +/// than 2*numelements. +int ShuffleVectorInst::getMaskValue(unsigned i) const { + const Constant *Mask = cast(getOperand(2)); + if (isa(Mask)) return -1; + if (isa(Mask)) return 0; + const ConstantVector *MaskCV = cast(Mask); + assert(i < MaskCV->getNumOperands() && "Index out of range"); + + if (isa(MaskCV->getOperand(i))) + return -1; + return cast(MaskCV->getOperand(i))->getZExtValue(); +} + //===----------------------------------------------------------------------===// // BinaryOperator Class -- cgit v1.2.3