From: Chris Lattner Date: Sat, 8 Apr 2006 04:05:48 +0000 (+0000) Subject: Add methods to check insertelement/extractelement instructions for validity, X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=d2325d0a7325972a7caf01df5a3593615542aa5f;p=oota-llvm.git 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 --- diff --git a/lib/VMCore/Instructions.cpp b/lib/VMCore/Instructions.cpp index 9ef72d43536..9eaa8f7e846 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(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(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(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(Vec->getType())) + return false; // First operand of insertelement must be packed type. + + if (Elt->getType() != cast(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 //===----------------------------------------------------------------------===//