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();
+ }
};
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; }
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; }
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;
}
else if ((opLabel == Instruction::Load ||
opLabel == Instruction::GetElementPtr) &&
- ((MemAccessInst*)I)->getFirstOffsetIdx() > 0)
+ cast<MemAccessInst>(I)->hasIndices())
{
opLabel = opLabel + 100; // load/getElem with index vector
}
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
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();
}
else if ((opLabel == Instruction::Load ||
opLabel == Instruction::GetElementPtr) &&
- ((MemAccessInst*)I)->getFirstOffsetIdx() > 0)
+ cast<MemAccessInst>(I)->hasIndices())
{
opLabel = opLabel + 100; // load/getElem with index vector
}
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
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();
// 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());
}
}
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!
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;
}
// 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) {
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());
// 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() &&
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;
}
// 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) {
// 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() &&
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;
}
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;
} 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>
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;
} 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>
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;