[llvm-commits] [PATCH (need approval)] Add support for InsertValue and ExtractValue to gep_type_iterator

Peter Collingbourne peter at pcc.me.uk
Wed Jun 30 12:39:45 PDT 2010


---
Hi,

This adds iv_type_iterator, ev_type_iterator and vce_type_iterator
to complement gep_type_iterator.

I'm not 100% certain this is the right way to do this.  Perhaps we
should introduce an Operator for generically accessing the index
iterators for {Insert,Extract}Values.  This would work right now
because all the iterators are of underlying type const unsigned *
but of course this may change in the future.

Thanks,
Peter

 include/llvm/Support/GetElementPtrTypeIterator.h |   38 ++++++++++++++++++++-
 1 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/include/llvm/Support/GetElementPtrTypeIterator.h b/include/llvm/Support/GetElementPtrTypeIterator.h
index e5e7fc7..35046fe 100644
--- a/include/llvm/Support/GetElementPtrTypeIterator.h
+++ b/include/llvm/Support/GetElementPtrTypeIterator.h
@@ -8,7 +8,7 @@
 //===----------------------------------------------------------------------===//
 //
 // This file implements an iterator for walking through the types indexed by
-// getelementptr instructions.
+// getelementptr, insertvalue and extractvalue instructions.
 //
 //===----------------------------------------------------------------------===//
 
@@ -17,6 +17,7 @@
 
 #include "llvm/User.h"
 #include "llvm/DerivedTypes.h"
+#include "llvm/Instructions.h"
 
 namespace llvm {
   template<typename ItTy = User::const_op_iterator>
@@ -28,6 +29,12 @@ namespace llvm {
     ItTy OpIt;
     const Type *CurTy;
     generic_gep_type_iterator() {}
+
+    Value *asValue(Value *V) const { return V; }
+    Value *asValue(unsigned U) const {
+      return ConstantInt::get(CurTy->getContext(), APInt(32, U));
+    }
+
   public:
 
     static generic_gep_type_iterator begin(const Type *Ty, ItTy It) {
@@ -63,7 +70,7 @@ namespace llvm {
     // current type directly.
     const Type *operator->() const { return operator*(); }
 
-    Value *getOperand() const { return *OpIt; }
+    Value *getOperand() const { return asValue(*OpIt); }
 
     generic_gep_type_iterator& operator++() {   // Preincrement
       if (const CompositeType *CT = dyn_cast<CompositeType>(CurTy)) {
@@ -81,6 +88,9 @@ namespace llvm {
   };
 
   typedef generic_gep_type_iterator<> gep_type_iterator;
+  typedef generic_gep_type_iterator<ExtractValueInst::idx_iterator> ev_type_iterator;
+  typedef generic_gep_type_iterator<InsertValueInst::idx_iterator> iv_type_iterator;
+  typedef generic_gep_type_iterator<SmallVector<unsigned, 4>::const_iterator> vce_type_iterator;
 
   inline gep_type_iterator gep_type_begin(const User *GEP) {
     return gep_type_iterator::begin(GEP->getOperand(0)->getType(),
@@ -97,6 +107,30 @@ namespace llvm {
     return gep_type_iterator::end(GEP.op_end());
   }
 
+  inline ev_type_iterator ev_type_begin(const ExtractValueInst *EV) {
+    return ev_type_iterator::begin(EV->getOperand(0)->getType(),
+                                   EV->idx_begin());
+  }
+  inline ev_type_iterator ev_type_end(const ExtractValueInst *EV) {
+    return ev_type_iterator::end(EV->idx_end());
+  }
+
+  inline iv_type_iterator iv_type_begin(const InsertValueInst *IV) {
+    return iv_type_iterator::begin(IV->getType(),
+                                   IV->idx_begin());
+  }
+  inline iv_type_iterator iv_type_end(const InsertValueInst *IV) {
+    return iv_type_iterator::end(IV->idx_end());
+  }
+
+  inline vce_type_iterator vce_type_begin(const ConstantExpr *CE) {
+    return vce_type_iterator::begin(CE->getOperand(0)->getType(),
+                                    CE->getIndices().begin());
+  }
+  inline vce_type_iterator vce_type_end(const ConstantExpr *CE) {
+    return vce_type_iterator::end(CE->getIndices().end());
+  }
+
   template<typename ItTy>
   inline generic_gep_type_iterator<ItTy>
   gep_type_begin(const Type *Op0, ItTy I, ItTy E) {
-- 
1.6.5




More information about the llvm-commits mailing list