[llvm-commits] CVS: llvm/lib/VMCore/Instructions.cpp

Chris Lattner lattner at cs.uiuc.edu
Fri Apr 7 21:06:01 PDT 2006



Changes in directory llvm/lib/VMCore:

Instructions.cpp updated: 1.33 -> 1.34
---
Log message:

Add methods to check insertelement/extractelement instructions for validity,
check validity when instructions are created.


---
Diffs of the changes:  (+37 -6)

 Instructions.cpp |   43 +++++++++++++++++++++++++++++++++++++------
 1 files changed, 37 insertions(+), 6 deletions(-)


Index: llvm/lib/VMCore/Instructions.cpp
diff -u llvm/lib/VMCore/Instructions.cpp:1.33 llvm/lib/VMCore/Instructions.cpp:1.34
--- llvm/lib/VMCore/Instructions.cpp:1.33	Fri Apr  7 20:18:18 2006
+++ llvm/lib/VMCore/Instructions.cpp	Fri Apr  7 23:05:48 2006
@@ -804,6 +804,8 @@
                                        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 @@
                                        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
 //===----------------------------------------------------------------------===//






More information about the llvm-commits mailing list