diff options
author | Chris Lattner <sabre@nondot.org> | 2006-04-08 04:05:48 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2006-04-08 04:05:48 +0000 |
commit | d2325d0a7325972a7caf01df5a3593615542aa5f (patch) | |
tree | f755dcd35f8fc8a3957eb935bb9ac154c54c1d58 /lib/VMCore | |
parent | fa495844a6b78db0d8e39ca4fe94f4b2a76aad81 (diff) |
Add methods to check insertelement/extractelement instructions for validity,
check validity when instructions are created.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27523 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore')
-rw-r--r-- | lib/VMCore/Instructions.cpp | 43 |
1 files changed, 37 insertions, 6 deletions
diff --git a/lib/VMCore/Instructions.cpp b/lib/VMCore/Instructions.cpp index 9ef72d4353..9eaa8f7e84 100644 --- a/lib/VMCore/Instructions.cpp +++ b/lib/VMCore/Instructions.cpp @@ -804,6 +804,8 @@ ExtractElementInst::ExtractElementInst(Value *Val, Value *Index, Instruction *InsertBef) : Instruction(cast<PackedType>(Val->getType())->getElementType(), ExtractElement, Ops, 2, Name, InsertBef) { + assert(isValidOperands(Val, Index) && + "Invalid extractelement instruction operands!"); Ops[0].init(Val, this); Ops[1].init(Index, this); } @@ -813,32 +815,61 @@ ExtractElementInst::ExtractElementInst(Value *Val, Value *Index, BasicBlock *InsertAE) : Instruction(cast<PackedType>(Val->getType())->getElementType(), ExtractElement, Ops, 2, Name, InsertAE) { + assert(isValidOperands(Val, Index) && + "Invalid extractelement instruction operands!"); + Ops[0].init(Val, this); Ops[1].init(Index, this); } +bool ExtractElementInst::isValidOperands(const Value *Val, const Value *Index) { + if (!isa<PackedType>(Val->getType()) || Index->getType() != Type::UIntTy) + return false; + return true; +} + + //===----------------------------------------------------------------------===// // InsertElementInst Implementation //===----------------------------------------------------------------------===// -InsertElementInst::InsertElementInst(Value *Val, Value *Elt, Value *Index, +InsertElementInst::InsertElementInst(Value *Vec, Value *Elt, Value *Index, const std::string &Name, Instruction *InsertBef) - : Instruction(Val->getType(), InsertElement, Ops, 3, Name, InsertBef) { - Ops[0].init(Val, this); + : Instruction(Vec->getType(), InsertElement, Ops, 3, Name, InsertBef) { + assert(isValidOperands(Vec, Elt, Index) && + "Invalid insertelement instruction operands!"); + Ops[0].init(Vec, this); Ops[1].init(Elt, this); Ops[2].init(Index, this); } -InsertElementInst::InsertElementInst(Value *Val, Value *Elt, Value *Index, +InsertElementInst::InsertElementInst(Value *Vec, Value *Elt, Value *Index, const std::string &Name, BasicBlock *InsertAE) - : Instruction(Val->getType(), InsertElement, Ops, 3, Name, InsertAE) { - Ops[0].init(Val, this); + : Instruction(Vec->getType(), InsertElement, Ops, 3, Name, InsertAE) { + assert(isValidOperands(Vec, Elt, Index) && + "Invalid insertelement instruction operands!"); + + Ops[0].init(Vec, this); Ops[1].init(Elt, this); Ops[2].init(Index, this); } +bool InsertElementInst::isValidOperands(const Value *Vec, const Value *Elt, + const Value *Index) { + if (!isa<PackedType>(Vec->getType())) + return false; // First operand of insertelement must be packed type. + + if (Elt->getType() != cast<PackedType>(Vec->getType())->getElementType()) + return false;// Second operand of insertelement must be packed element type. + + if (Index->getType() != Type::UIntTy) + return false; // Third operand of insertelement must be uint. + return true; +} + + //===----------------------------------------------------------------------===// // ShuffleVectorInst Implementation //===----------------------------------------------------------------------===// |