[llvm-commits] [llvm] r51461 - in /llvm/trunk: include/llvm/Instructions.h lib/VMCore/Constants.cpp lib/VMCore/Instructions.cpp

Dan Gohman gohman at apple.com
Thu May 22 17:36:11 PDT 2008


Author: djg
Date: Thu May 22 19:36:11 2008
New Revision: 51461

URL: http://llvm.org/viewvc/llvm-project?rev=51461&view=rev
Log:
Add more IR support for the new extractvalue and insertvalue
instructions.

Modified:
    llvm/trunk/include/llvm/Instructions.h
    llvm/trunk/lib/VMCore/Constants.cpp
    llvm/trunk/lib/VMCore/Instructions.cpp

Modified: llvm/trunk/include/llvm/Instructions.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Instructions.h?rev=51461&r1=51460&r2=51461&view=diff

==============================================================================
--- llvm/trunk/include/llvm/Instructions.h (original)
+++ llvm/trunk/include/llvm/Instructions.h Thu May 22 19:36:11 2008
@@ -1689,8 +1689,42 @@
 struct OperandTraits<ExtractValueInst> : VariadicOperandTraits<1> {
 };
 
+template<typename InputIterator>
+ExtractValueInst::ExtractValueInst(Value *Agg,
+                                   InputIterator IdxBegin, 
+                                   InputIterator IdxEnd,
+                                   unsigned Values,
+                                   const std::string &Name,
+                                   Instruction *InsertBefore)
+  : Instruction(checkType(getIndexedType(Agg->getType(), IdxBegin, IdxEnd)),
+                ExtractValue,
+                OperandTraits<ExtractValueInst>::op_end(this) - Values,
+                Values, InsertBefore) {
+  init(Agg, IdxBegin, IdxEnd, Name,
+       typename std::iterator_traits<InputIterator>::iterator_category());
+}
+template<typename InputIterator>
+ExtractValueInst::ExtractValueInst(Value *Agg,
+                                   InputIterator IdxBegin,
+                                   InputIterator IdxEnd,
+                                   unsigned Values,
+                                   const std::string &Name,
+                                   BasicBlock *InsertAtEnd)
+  : Instruction(PointerType::get(checkType(
+                                   getIndexedType(Agg->getType(),
+                                                  IdxBegin, IdxEnd)),
+                                 cast<PointerType>(Agg->getType())
+                                   ->getAddressSpace()),
+                ExtractValue,
+                OperandTraits<ExtractValueInst>::op_end(this) - Values,
+                Values, InsertAtEnd) {
+  init(Agg, IdxBegin, IdxEnd, Name,
+       typename std::iterator_traits<InputIterator>::iterator_category());
+}
+
 DEFINE_TRANSPARENT_OPERAND_ACCESSORS(ExtractValueInst, Value)
 
+
 //===----------------------------------------------------------------------===//
 //                                InsertValueInst Class
 //===----------------------------------------------------------------------===//
@@ -1840,6 +1874,44 @@
 struct OperandTraits<InsertValueInst> : VariadicOperandTraits<2> {
 };
 
+template<typename InputIterator>
+InsertValueInst::InsertValueInst(Value *Agg,
+                                 Value *Val,
+                                 InputIterator IdxBegin, 
+                                 InputIterator IdxEnd,
+                                 unsigned Values,
+                                 const std::string &Name,
+                                 Instruction *InsertBefore)
+  : Instruction(checkType(ExtractValueInst::getIndexedType(
+                                     Agg->getType(),
+                                     IdxBegin, IdxEnd)),
+                InsertValue,
+                OperandTraits<InsertValueInst>::op_end(this) - Values,
+                Values, InsertBefore) {
+  init(Agg, Val, IdxBegin, IdxEnd, Name,
+       typename std::iterator_traits<InputIterator>::iterator_category());
+}
+template<typename InputIterator>
+InsertValueInst::InsertValueInst(Value *Agg,
+                                 Value *Val,
+                                 InputIterator IdxBegin,
+                                 InputIterator IdxEnd,
+                                 unsigned Values,
+                                 const std::string &Name,
+                                 BasicBlock *InsertAtEnd)
+  : Instruction(PointerType::get(checkType(
+                                   ExtractValueInst::getIndexedType(
+                                     Val->getType(),
+                                     IdxBegin, IdxEnd)),
+                                 cast<PointerType>(Val->getType())
+                                   ->getAddressSpace()),
+                InsertValue,
+                OperandTraits<InsertValueInst>::op_end(this) - Values,
+                Values, InsertAtEnd) {
+  init(Agg, Val, IdxBegin, IdxEnd, Name,
+       typename std::iterator_traits<InputIterator>::iterator_category());
+}
+
 DEFINE_TRANSPARENT_OPERAND_ACCESSORS(InsertValueInst, Value)
 
 //===----------------------------------------------------------------------===//

Modified: llvm/trunk/lib/VMCore/Constants.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Constants.cpp?rev=51461&r1=51460&r2=51461&view=diff

==============================================================================
--- llvm/trunk/lib/VMCore/Constants.cpp (original)
+++ llvm/trunk/lib/VMCore/Constants.cpp Thu May 22 19:36:11 2008
@@ -2308,8 +2308,8 @@
   if (Constant *FC = ConstantFoldInsertValue(Agg, Val, Idxs, NumIdx))
     return FC;          // Fold a few common cases...
 
-  assert(isa<PointerType>(Agg->getType()) &&
-         "Non-pointer type for constant InsertValue expression");
+  assert(Agg->getType()->isFirstClassType() &&
+         "Non-first-class type for constant InsertValue expression");
   // Look up the constant in the table first to ensure uniqueness
   std::vector<Constant*> ArgVec;
   ArgVec.reserve(NumIdx+2);
@@ -2323,13 +2323,13 @@
 
 Constant *ConstantExpr::getInsertValue(Constant *Agg, Constant *Val,
                                     Constant* const *IdxList, unsigned NumIdx) {
-  assert((isa<StructType>(Agg->getType()) || isa<ArrayType>(Agg->getType()) ||
-          isa<VectorType>(Agg->getType())) &&
-         "Tried to create insertelement operation on non-aggregate type!");
+  assert(Agg->getType()->isFirstClassType() &&
+         "Tried to create insertelement operation on non-first-class type!");
 
-  const Type *ReqTy =
+  const Type *ReqTy = Agg->getType();
+  const Type *ValTy =
     ExtractValueInst::getIndexedType(Agg->getType(), IdxList, IdxList+NumIdx);
-  assert(ReqTy && "insertvalue indices invalid!");
+  assert(ValTy == Val->getType() && "insertvalue indices invalid!");
   return getInsertValueTy(ReqTy, Agg, Val, IdxList, NumIdx);
 }
 
@@ -2342,8 +2342,8 @@
   if (Constant *FC = ConstantFoldExtractValue(Agg, Idxs, NumIdx))
     return FC;          // Fold a few common cases...
 
-  assert(isa<PointerType>(Agg->getType()) &&
-         "Non-pointer type for constant ExtractValue expression");
+  assert(Agg->getType()->isFirstClassType() &&
+         "Non-first-class type for constant extractvalue expression");
   // Look up the constant in the table first to ensure uniqueness
   std::vector<Constant*> ArgVec;
   ArgVec.reserve(NumIdx+1);
@@ -2356,9 +2356,8 @@
 
 Constant *ConstantExpr::getExtractValue(Constant *Agg,
                                     Constant* const *IdxList, unsigned NumIdx) {
-  assert((isa<StructType>(Agg->getType()) || isa<ArrayType>(Agg->getType()) ||
-          isa<VectorType>(Agg->getType())) &&
-         "Tried to create extractelement operation on non-aggregate type!");
+  assert(Agg->getType()->isFirstClassType() &&
+         "Tried to create extractelement operation on non-first-class type!");
 
   const Type *ReqTy =
     ExtractValueInst::getIndexedType(Agg->getType(), IdxList, IdxList+NumIdx);

Modified: llvm/trunk/lib/VMCore/Instructions.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Instructions.cpp?rev=51461&r1=51460&r2=51461&view=diff

==============================================================================
--- llvm/trunk/lib/VMCore/Instructions.cpp (original)
+++ llvm/trunk/lib/VMCore/Instructions.cpp Thu May 22 19:36:11 2008
@@ -1333,9 +1333,69 @@
 }
 
 //===----------------------------------------------------------------------===//
+//                             InsertValueInst Class
+//===----------------------------------------------------------------------===//
+
+void InsertValueInst::init(Value *Agg, Value *Val, Value* const *Idx, unsigned NumIdx) {
+  assert(NumOperands == 1+NumIdx && "NumOperands not initialized?");
+  Use *OL = OperandList;
+  OL[0].init(Agg, this);
+  OL[1].init(Val, this);
+
+  for (unsigned i = 0; i != NumIdx; ++i)
+    OL[i+2].init(Idx[i], this);
+}
+
+void InsertValueInst::init(Value *Agg, Value *Val, Value *Idx) {
+  assert(NumOperands == 3 && "NumOperands not initialized?");
+  Use *OL = OperandList;
+  OL[0].init(Agg, this);
+  OL[1].init(Val, this);
+  OL[2].init(Idx, this);
+}
+
+InsertValueInst::InsertValueInst(const InsertValueInst &IVI)
+  : Instruction(reinterpret_cast<const Type*>(IVI.getType()), InsertValue,
+                OperandTraits<InsertValueInst>::op_end(this)
+                - IVI.getNumOperands(),
+                IVI.getNumOperands()) {
+  Use *OL = OperandList;
+  Use *IVIOL = IVI.OperandList;
+  for (unsigned i = 0, E = NumOperands; i != E; ++i)
+    OL[i].init(IVIOL[i], this);
+}
+
+//===----------------------------------------------------------------------===//
 //                             ExtractValueInst Class
 //===----------------------------------------------------------------------===//
 
+void ExtractValueInst::init(Value *Agg, Value* const *Idx, unsigned NumIdx) {
+  assert(NumOperands == 1+NumIdx && "NumOperands not initialized?");
+  Use *OL = OperandList;
+  OL[0].init(Agg, this);
+
+  for (unsigned i = 0; i != NumIdx; ++i)
+    OL[i+1].init(Idx[i], this);
+}
+
+void ExtractValueInst::init(Value *Agg, Value *Idx) {
+  assert(NumOperands == 2 && "NumOperands not initialized?");
+  Use *OL = OperandList;
+  OL[0].init(Agg, this);
+  OL[1].init(Idx, this);
+}
+
+ExtractValueInst::ExtractValueInst(const ExtractValueInst &EVI)
+  : Instruction(reinterpret_cast<const Type*>(EVI.getType()), ExtractValue,
+                OperandTraits<ExtractValueInst>::op_end(this)
+                - EVI.getNumOperands(),
+                EVI.getNumOperands()) {
+  Use *OL = OperandList;
+  Use *EVIOL = EVI.OperandList;
+  for (unsigned i = 0, E = NumOperands; i != E; ++i)
+    OL[i].init(EVIOL[i], this);
+}
+
 // getIndexedType - Returns the type of the element that would be extracted
 // with an extractvalue instruction with the specified parameters.
 //
@@ -2809,6 +2869,14 @@
   return new VICmpInst(getPredicate(), Op<0>(), Op<1>());
 }
 
+ExtractValueInst *ExtractValueInst::clone() const {
+  return new(getNumOperands()) ExtractValueInst(*this);
+}
+InsertValueInst *InsertValueInst::clone() const {
+  return new(getNumOperands()) InsertValueInst(*this);
+}
+
+
 MallocInst *MallocInst::clone()   const { return new MallocInst(*this); }
 AllocaInst *AllocaInst::clone()   const { return new AllocaInst(*this); }
 FreeInst   *FreeInst::clone()     const { return new FreeInst(getOperand(0)); }





More information about the llvm-commits mailing list