diff options
author | Nate Begeman <natebegeman@mac.com> | 2010-08-13 00:16:46 +0000 |
---|---|---|
committer | Nate Begeman <natebegeman@mac.com> | 2010-08-13 00:16:46 +0000 |
commit | a966af2f4cf77c4b8107fb0e93bb97a78f99f5dc (patch) | |
tree | 9a59df3336639c620fb711df0b30ca2ab80a690f /lib/VMCore/Instructions.cpp | |
parent | ca2835411f87addaf55772de58ab23ffdb23ff1c (diff) |
Move some code from Verifier into SVI::isValidOperands. This allows us to catch bad shufflevector operations when they are created, rather than waiting for someone to notice later on.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@110986 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore/Instructions.cpp')
-rw-r--r-- | lib/VMCore/Instructions.cpp | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/lib/VMCore/Instructions.cpp b/lib/VMCore/Instructions.cpp index 9e5fd23923..401802ed13 100644 --- a/lib/VMCore/Instructions.cpp +++ b/lib/VMCore/Instructions.cpp @@ -1430,9 +1430,24 @@ bool ShuffleVectorInst::isValidOperands(const Value *V1, const Value *V2, return false; const VectorType *MaskTy = dyn_cast<VectorType>(Mask->getType()); - if (!isa<Constant>(Mask) || MaskTy == 0 || - !MaskTy->getElementType()->isIntegerTy(32)) + if (MaskTy == 0 || !MaskTy->getElementType()->isIntegerTy(32)) return false; + + // Check to see if Mask is valid. + if (const ConstantVector *MV = dyn_cast<ConstantVector>(Mask)) { + const VectorType *VTy = cast<VectorType>(V1->getType()); + for (unsigned i = 0, e = MV->getNumOperands(); i != e; ++i) { + if (ConstantInt* CI = dyn_cast<ConstantInt>(MV->getOperand(i))) { + if (CI->uge(VTy->getNumElements()*2)) + return false; + } else if (!isa<UndefValue>(MV->getOperand(i))) { + return false; + } + } + } + else if (!isa<UndefValue>(Mask) && !isa<ConstantAggregateZero>(Mask)) + return false; + return true; } |