diff --git a/include/llvm/iMemory.h b/include/llvm/iMemory.h index 29518686cfe..1dbc1dbea34 100644 --- a/include/llvm/iMemory.h +++ b/include/llvm/iMemory.h @@ -182,16 +182,19 @@ public: const vector &Indices, bool AllowStructLeaf = false); - const vector &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 &getIndices() const { return indexVec; } + inline bool hasIndices() const { + return getNumOperands() <= getFirstIndexOperandNumber(); + } }; @@ -213,8 +216,8 @@ public: 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 @@ public: 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 @@ public: 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 d460bb77e23..f928683060a 100644 --- a/lib/CodeGen/InstrSelection/InstrForest.cpp +++ b/lib/CodeGen/InstrSelection/InstrForest.cpp @@ -76,7 +76,7 @@ InstructionNode::InstructionNode(Instruction* I) } else if ((opLabel == Instruction::Load || opLabel == Instruction::GetElementPtr) && - ((MemAccessInst*)I)->getFirstOffsetIdx() > 0) + cast(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 0a6d7d331d3..cb3f9a15822 100644 --- a/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp +++ b/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp @@ -117,7 +117,7 @@ FoldGetElemChain(const InstructionNode* getElemInstrNode, 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 @@ FoldGetElemChain(const InstructionNode* getElemInstrNode, const vector& 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 d460bb77e23..f928683060a 100644 --- a/lib/Target/SparcV9/InstrSelection/InstrForest.cpp +++ b/lib/Target/SparcV9/InstrSelection/InstrForest.cpp @@ -76,7 +76,7 @@ InstructionNode::InstructionNode(Instruction* I) } else if ((opLabel == Instruction::Load || opLabel == Instruction::GetElementPtr) && - ((MemAccessInst*)I)->getFirstOffsetIdx() > 0) + cast(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 0a6d7d331d3..cb3f9a15822 100644 --- a/lib/Target/SparcV9/InstrSelection/InstrSelectionSupport.cpp +++ b/lib/Target/SparcV9/InstrSelection/InstrSelectionSupport.cpp @@ -117,7 +117,7 @@ FoldGetElemChain(const InstructionNode* getElemInstrNode, 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 @@ FoldGetElemChain(const InstructionNode* getElemInstrNode, const vector& 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 4feecbb1bd1..8966db2f3e4 100644 --- a/lib/Target/SparcV9/SparcV9InstrSelection.cpp +++ b/lib/Target/SparcV9/SparcV9InstrSelection.cpp @@ -781,17 +781,16 @@ SetOperandsForMemInstr(MachineInstr* minstr, // 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(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 @@ GetInstructionsByRule(InstructionNode* subtreeRoot, GetElementPtrInst* getElemInst = cast(subtreeRoot->getInstruction()); const PointerType* ptrType = - (const PointerType*) getElemInst->getPtrOperand()->getType(); + cast(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 f8052b24942..2e7c2979073 100644 --- a/lib/Transforms/ExprTypeConvert.cpp +++ b/lib/Transforms/ExprTypeConvert.cpp @@ -131,8 +131,8 @@ bool ExpressionConvertableToType(Value *V, const Type *Ty, 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 @@ bool ExpressionConvertableToType(Value *V, const Type *Ty, // get to the right type... // vector Indices = GEP->getIndices(); - const Type *BaseType = GEP->getPtrOperand()->getType(); + const Type *BaseType = GEP->getPointerOperand()->getType(); while (Indices.size() && cast(Indices.back())->getValue() == 0) { @@ -268,7 +268,7 @@ Value *ConvertExpressionToType(Value *V, const Type *Ty, ValueMapCache &VMC) { 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 @@ Value *ConvertExpressionToType(Value *V, const Type *Ty, ValueMapCache &VMC) { // get to the right type... // vector Indices = GEP->getIndices(); - const Type *BaseType = GEP->getPtrOperand()->getType(); + const Type *BaseType = GEP->getPointerOperand()->getType(); const Type *PVTy = cast(Ty)->getValueType(); Res = 0; while (Indices.size() && @@ -318,9 +318,9 @@ Value *ConvertExpressionToType(Value *V, const Type *Ty, ValueMapCache &VMC) { 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 @@ static bool OperandConvertableToType(User *U, Value *V, const Type *Ty, // get to the right type... // vector Indices = GEP->getIndices(); - const Type *BaseType = GEP->getPtrOperand()->getType(); + const Type *BaseType = GEP->getPointerOperand()->getType(); while (Indices.size() && cast(Indices.back())->getValue() == 0) { @@ -713,7 +713,7 @@ static void ConvertOperandToType(User *U, Value *OldVal, Value *NewVal, // get to the right type... // vector Indices = GEP->getIndices(); - const Type *BaseType = GEP->getPtrOperand()->getType(); + const Type *BaseType = GEP->getPointerOperand()->getType(); const Type *PVTy = cast(Ty)->getValueType(); Res = 0; while (Indices.size() && @@ -721,9 +721,9 @@ static void ConvertOperandToType(User *U, Value *OldVal, Value *NewVal, 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 06c8438f26f..e8598b9d859 100644 --- a/lib/Transforms/Instrumentation/TraceValues.cpp +++ b/lib/Transforms/Instrumentation/TraceValues.cpp @@ -310,7 +310,7 @@ InsertLoadInst(StoreInst* storeInst, 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 dfe92ee234c..78bb2ebce2d 100644 --- a/lib/Transforms/LevelRaise.cpp +++ b/lib/Transforms/LevelRaise.cpp @@ -630,7 +630,7 @@ static bool PeepholeOptimize(BasicBlock *BB, BasicBlock::iterator &BI) { } else if (StoreInst *SI = dyn_cast(I)) { Value *Val = SI->getOperand(0); - Value *Pointer = SI->getPtrOperand(); + Value *Pointer = SI->getPointerOperand(); // Peephole optimize the following instructions: // %t1 = getelementptr {<...>} * %StructPtr, @@ -648,7 +648,7 @@ static bool PeepholeOptimize(BasicBlock *BB, BasicBlock::iterator &BI) { 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 @@ static bool PeepholeOptimize(BasicBlock *BB, BasicBlock::iterator &BI) { } else if (LoadInst *LI = dyn_cast(I)) { - Value *Pointer = LI->getPtrOperand(); + Value *Pointer = LI->getPointerOperand(); // Peephole optimize the following instructions: // %t1 = getelementptr {<...>} * %StructPtr, @@ -703,7 +703,7 @@ static bool PeepholeOptimize(BasicBlock *BB, BasicBlock::iterator &BI) { 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;