diff --git a/include/llvm/iMemory.h b/include/llvm/iMemory.h
index 2951868..1dbc1db 100644
--- a/include/llvm/iMemory.h
+++ b/include/llvm/iMemory.h
@@ -182,16 +182,19 @@
 				    const vector<ConstPoolVal*> &Indices,
 				    bool AllowStructLeaf = false);
   
-  const vector<ConstPoolVal*> &getIndices() const { return indexVec; }
-
-  inline bool hasIndices() const { return !indexVec.empty(); }
-  
-  virtual Value *getPtrOperand() = 0;
+  Value *getPointerOperand() {
+    return getOperand(getFirstIndexOperandNumber()-1);
+  }
   const Value *getPointerOperand() const {
-    return ((MemAccessInst*)this)->getPtrOperand();
+    return getOperand(getFirstIndexOperandNumber()-1);
   }
   
-  virtual int getFirstOffsetIdx() const = 0;
+  virtual unsigned getFirstIndexOperandNumber() const = 0;
+
+  const vector<ConstPoolVal*> &getIndices() const { return indexVec; }
+  inline bool hasIndices() const {
+    return getNumOperands() <= getFirstIndexOperandNumber();
+  }
 };
 
 
@@ -213,8 +216,8 @@
 
   virtual Instruction *clone() const { return new LoadInst(*this); }
   virtual const char *getOpcodeName() const { return "load"; }  
-  virtual Value *getPtrOperand() { return this->getOperand(0); }
-  virtual int getFirstOffsetIdx() const { return (this->getNumOperands() > 1)? 1 : -1; }
+
+  virtual unsigned getFirstIndexOperandNumber() const { return 1; }
 
   // Methods for support type inquiry through isa, cast, and dyn_cast:
   static inline bool classof(const LoadInst *) { return true; }
@@ -247,8 +250,7 @@
   virtual const char *getOpcodeName() const { return "store"; }  
   
   virtual bool hasSideEffects() const { return true; }
-  virtual Value *getPtrOperand() { return this->getOperand(1); }
-  virtual int getFirstOffsetIdx() const { return (this->getNumOperands() > 2)? 2 : -1;}
+  virtual unsigned getFirstIndexOperandNumber() const { return 2; }
 
   // Methods for support type inquiry through isa, cast, and dyn_cast:
   static inline bool classof(const StoreInst *) { return true; }
@@ -277,8 +279,7 @@
 		    const string &Name = "");
   virtual Instruction *clone() const { return new GetElementPtrInst(*this); }
   virtual const char *getOpcodeName() const { return "getelementptr"; }  
-  virtual Value *getPtrOperand() { return this->getOperand(0); }
-  virtual int getFirstOffsetIdx() const { return (this->getNumOperands() > 1)? 1 : -1;}
+  virtual unsigned getFirstIndexOperandNumber() const { return 1; }
   
   inline bool isArraySelector() const { return !isStructSelector(); }
   bool isStructSelector() const;
diff --git a/lib/CodeGen/InstrSelection/InstrForest.cpp b/lib/CodeGen/InstrSelection/InstrForest.cpp
index d460bb7..f928683 100644
--- a/lib/CodeGen/InstrSelection/InstrForest.cpp
+++ b/lib/CodeGen/InstrSelection/InstrForest.cpp
@@ -76,7 +76,7 @@
     }
   else if ((opLabel == Instruction::Load ||
 	    opLabel == Instruction::GetElementPtr) &&
-	   ((MemAccessInst*)I)->getFirstOffsetIdx() > 0)
+	   cast<MemAccessInst>(I)->hasIndices())
     {
       opLabel = opLabel + 100;		 // load/getElem with index vector
     }
diff --git a/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp b/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp
index 0a6d7d3..cb3f9a1 100644
--- a/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp
+++ b/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp
@@ -117,7 +117,7 @@
     getElemInstrNode->getInstruction();
   
   // Initialize return values from the incoming instruction
-  Value* ptrVal = getElemInst->getPtrOperand();
+  Value* ptrVal = getElemInst->getPointerOperand();
   chainIdxVec = getElemInst->getIndices(); // copies index vector values
   
   // Now chase the chain of getElementInstr instructions, if any
@@ -131,7 +131,7 @@
       const vector<ConstPoolVal*>& idxVec = getElemInst->getIndices();
       
       // Get the pointer value out of ptrChild and *prepend* its index vector
-      ptrVal = getElemInst->getPtrOperand();
+      ptrVal = getElemInst->getPointerOperand();
       chainIdxVec.insert(chainIdxVec.begin(), idxVec.begin(), idxVec.end());
       
       ptrChild = ptrChild->leftChild();
diff --git a/lib/Target/SparcV9/InstrSelection/InstrForest.cpp b/lib/Target/SparcV9/InstrSelection/InstrForest.cpp
index d460bb7..f928683 100644
--- a/lib/Target/SparcV9/InstrSelection/InstrForest.cpp
+++ b/lib/Target/SparcV9/InstrSelection/InstrForest.cpp
@@ -76,7 +76,7 @@
     }
   else if ((opLabel == Instruction::Load ||
 	    opLabel == Instruction::GetElementPtr) &&
-	   ((MemAccessInst*)I)->getFirstOffsetIdx() > 0)
+	   cast<MemAccessInst>(I)->hasIndices())
     {
       opLabel = opLabel + 100;		 // load/getElem with index vector
     }
diff --git a/lib/Target/SparcV9/InstrSelection/InstrSelectionSupport.cpp b/lib/Target/SparcV9/InstrSelection/InstrSelectionSupport.cpp
index 0a6d7d3..cb3f9a1 100644
--- a/lib/Target/SparcV9/InstrSelection/InstrSelectionSupport.cpp
+++ b/lib/Target/SparcV9/InstrSelection/InstrSelectionSupport.cpp
@@ -117,7 +117,7 @@
     getElemInstrNode->getInstruction();
   
   // Initialize return values from the incoming instruction
-  Value* ptrVal = getElemInst->getPtrOperand();
+  Value* ptrVal = getElemInst->getPointerOperand();
   chainIdxVec = getElemInst->getIndices(); // copies index vector values
   
   // Now chase the chain of getElementInstr instructions, if any
@@ -131,7 +131,7 @@
       const vector<ConstPoolVal*>& idxVec = getElemInst->getIndices();
       
       // Get the pointer value out of ptrChild and *prepend* its index vector
-      ptrVal = getElemInst->getPtrOperand();
+      ptrVal = getElemInst->getPointerOperand();
       chainIdxVec.insert(chainIdxVec.begin(), idxVec.begin(), idxVec.end());
       
       ptrChild = ptrChild->leftChild();
diff --git a/lib/Target/SparcV9/SparcV9InstrSelection.cpp b/lib/Target/SparcV9/SparcV9InstrSelection.cpp
index 4feecbb..8966db2 100644
--- a/lib/Target/SparcV9/SparcV9InstrSelection.cpp
+++ b/lib/Target/SparcV9/SparcV9InstrSelection.cpp
@@ -781,17 +781,16 @@
       // Use the pointer value and the index vector from the Mem instruction.
       // If it is an array reference, get the array offset value.
       // 
-      ptrVal = memInst->getPtrOperand();
+      ptrVal = memInst->getPointerOperand();
 
-      const Type* opType =
-        ((const PointerType*) ptrVal->getType())->getValueType();
+      const Type* opType = cast<PointerType>(ptrVal->getType())->getValueType();
       if (opType->isArrayType())
         {
           assert((memInst->getNumOperands()
-                  == (unsigned) 1 + memInst->getFirstOffsetIdx())
+                  == (unsigned) 1 + memInst->getFirstIndexOperandNumber())
                  && "Array refs must be lowered before Instruction Selection");
           
-          arrayOffsetVal = memInst->getOperand(memInst->getFirstOffsetIdx());
+          arrayOffsetVal = memInst->getOperand(memInst->getFirstIndexOperandNumber());
         }
     }
   
@@ -1835,7 +1834,7 @@
                 GetElementPtrInst* getElemInst =
                   cast<GetElementPtrInst>(subtreeRoot->getInstruction());
                 const PointerType* ptrType =
-                  (const PointerType*) getElemInst->getPtrOperand()->getType();
+                  cast<PointerType>(getElemInst->getPointerOperand()->getType());
                 if (! ptrType->getValueType()->isArrayType())
                   {// we don't need a separate instr
                     numInstr = 0;		// don't forward operand!
diff --git a/lib/Transforms/ExprTypeConvert.cpp b/lib/Transforms/ExprTypeConvert.cpp
index f8052b2..2e7c297 100644
--- a/lib/Transforms/ExprTypeConvert.cpp
+++ b/lib/Transforms/ExprTypeConvert.cpp
@@ -131,8 +131,8 @@
         if (!CPV[i]->isNullValue()) return false;
     }
 
-    if (!ExpressionConvertableToType(LI->getPtrOperand(), PointerType::get(Ty),
-                                     CTMap))
+    if (!ExpressionConvertableToType(LI->getPointerOperand(),
+                                     PointerType::get(Ty), CTMap))
       return false;
     break;                                     
   }
@@ -163,7 +163,7 @@
     // get to the right type...
     //
     vector<ConstPoolVal*> Indices = GEP->getIndices();
-    const Type *BaseType = GEP->getPtrOperand()->getType();
+    const Type *BaseType = GEP->getPointerOperand()->getType();
 
     while (Indices.size() &&
            cast<ConstPoolUInt>(Indices.back())->getValue() == 0) {
@@ -268,7 +268,7 @@
     Res = new LoadInst(ConstPoolVal::getNullConstant(PointerType::get(Ty)), 
                        Name);
     VMC.ExprMap[I] = Res;
-    Res->setOperand(0, ConvertExpressionToType(LI->getPtrOperand(),
+    Res->setOperand(0, ConvertExpressionToType(LI->getPointerOperand(),
                                                PointerType::get(Ty), VMC));
     assert(Res->getOperand(0)->getType() == PointerType::get(Ty));
     assert(Ty == Res->getType());
@@ -310,7 +310,7 @@
     // get to the right type...
     //
     vector<ConstPoolVal*> Indices = GEP->getIndices();
-    const Type *BaseType = GEP->getPtrOperand()->getType();
+    const Type *BaseType = GEP->getPointerOperand()->getType();
     const Type *PVTy = cast<PointerType>(Ty)->getValueType();
     Res = 0;
     while (Indices.size() &&
@@ -318,9 +318,9 @@
       Indices.pop_back();
       if (GetElementPtrInst::getIndexedType(BaseType, Indices, true) == PVTy) {
         if (Indices.size() == 0) {
-          Res = new CastInst(GEP->getPtrOperand(), BaseType); // NOOP
+          Res = new CastInst(GEP->getPointerOperand(), BaseType); // NOOP
         } else {
-          Res = new GetElementPtrInst(GEP->getPtrOperand(), Indices, Name);
+          Res = new GetElementPtrInst(GEP->getPointerOperand(), Indices, Name);
         }
         break;
       }
@@ -549,7 +549,7 @@
     // get to the right type...
     //
     vector<ConstPoolVal*> Indices = GEP->getIndices();
-    const Type *BaseType = GEP->getPtrOperand()->getType();
+    const Type *BaseType = GEP->getPointerOperand()->getType();
 
     while (Indices.size() &&
            cast<ConstPoolUInt>(Indices.back())->getValue() == 0) {
@@ -713,7 +713,7 @@
     // get to the right type...
     //
     vector<ConstPoolVal*> Indices = GEP->getIndices();
-    const Type *BaseType = GEP->getPtrOperand()->getType();
+    const Type *BaseType = GEP->getPointerOperand()->getType();
     const Type *PVTy = cast<PointerType>(Ty)->getValueType();
     Res = 0;
     while (Indices.size() &&
@@ -721,9 +721,9 @@
       Indices.pop_back();
       if (GetElementPtrInst::getIndexedType(BaseType, Indices, true) == PVTy) {
         if (Indices.size() == 0) {
-          Res = new CastInst(GEP->getPtrOperand(), BaseType); // NOOP
+          Res = new CastInst(GEP->getPointerOperand(), BaseType); // NOOP
         } else {
-          Res = new GetElementPtrInst(GEP->getPtrOperand(), Indices, Name);
+          Res = new GetElementPtrInst(GEP->getPointerOperand(), Indices, Name);
         }
         break;
       }
diff --git a/lib/Transforms/Instrumentation/TraceValues.cpp b/lib/Transforms/Instrumentation/TraceValues.cpp
index 06c8438..e8598b9 100644
--- a/lib/Transforms/Instrumentation/TraceValues.cpp
+++ b/lib/Transforms/Instrumentation/TraceValues.cpp
@@ -310,7 +310,7 @@
                BasicBlock *bb,
                BasicBlock::iterator &BBI)
 {
-  LoadInst* loadInst = new LoadInst(storeInst->getPtrOperand(),
+  LoadInst* loadInst = new LoadInst(storeInst->getPointerOperand(),
                                     storeInst->getIndices());
   BBI = bb->getInstList().insert(BBI, loadInst) + 1;
   return loadInst;
diff --git a/lib/Transforms/LevelRaise.cpp b/lib/Transforms/LevelRaise.cpp
index dfe92ee..78bb2eb 100644
--- a/lib/Transforms/LevelRaise.cpp
+++ b/lib/Transforms/LevelRaise.cpp
@@ -630,7 +630,7 @@
 
   } else if (StoreInst *SI = dyn_cast<StoreInst>(I)) {
     Value *Val     = SI->getOperand(0);
-    Value *Pointer = SI->getPtrOperand();
+    Value *Pointer = SI->getPointerOperand();
     
     // Peephole optimize the following instructions:
     // %t1 = getelementptr {<...>} * %StructPtr, <element indices>
@@ -648,7 +648,7 @@
 
       PRINT_PEEPHOLE2("gep-store:in", GEP, SI);
       ReplaceInstWithInst(BB->getInstList(), BI,
-                          SI = new StoreInst(Val, GEP->getPtrOperand(),
+                          SI = new StoreInst(Val, GEP->getPointerOperand(),
                                              Indices));
       PRINT_PEEPHOLE1("gep-store:out", SI);
       return true;
@@ -685,7 +685,7 @@
 
 
   } else if (LoadInst *LI = dyn_cast<LoadInst>(I)) {
-    Value *Pointer = LI->getPtrOperand();
+    Value *Pointer = LI->getPointerOperand();
     
     // Peephole optimize the following instructions:
     // %t1 = getelementptr {<...>} * %StructPtr, <element indices>
@@ -703,7 +703,7 @@
 
       PRINT_PEEPHOLE2("gep-load:in", GEP, LI);
       ReplaceInstWithInst(BB->getInstList(), BI,
-                          LI = new LoadInst(GEP->getPtrOperand(),
+                          LI = new LoadInst(GEP->getPointerOperand(),
                                             Indices));
       PRINT_PEEPHOLE1("gep-load:out", LI);
       return true;
