mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-05-16 23:38:40 +00:00
add direct support for making GEP instrs with one index
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21665 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4c42937b64
commit
38bacf29e8
@ -300,6 +300,7 @@ class GetElementPtrInst : public Instruction {
|
|||||||
}
|
}
|
||||||
void init(Value *Ptr, const std::vector<Value*> &Idx);
|
void init(Value *Ptr, const std::vector<Value*> &Idx);
|
||||||
void init(Value *Ptr, Value *Idx0, Value *Idx1);
|
void init(Value *Ptr, Value *Idx0, Value *Idx1);
|
||||||
|
void init(Value *Ptr, Value *Idx);
|
||||||
public:
|
public:
|
||||||
/// Constructors - Create a getelementptr instruction with a base pointer an
|
/// Constructors - Create a getelementptr instruction with a base pointer an
|
||||||
/// list of indices. The first ctor can optionally insert before an existing
|
/// list of indices. The first ctor can optionally insert before an existing
|
||||||
@ -310,8 +311,12 @@ public:
|
|||||||
GetElementPtrInst(Value *Ptr, const std::vector<Value*> &Idx,
|
GetElementPtrInst(Value *Ptr, const std::vector<Value*> &Idx,
|
||||||
const std::string &Name, BasicBlock *InsertAtEnd);
|
const std::string &Name, BasicBlock *InsertAtEnd);
|
||||||
|
|
||||||
/// Constructors - These two constructors are convenience methods because two
|
/// Constructors - These two constructors are convenience methods because one
|
||||||
/// index getelementptr instructions are so common.
|
/// and two index getelementptr instructions are so common.
|
||||||
|
GetElementPtrInst(Value *Ptr, Value *Idx,
|
||||||
|
const std::string &Name = "", Instruction *InsertBefore =0);
|
||||||
|
GetElementPtrInst(Value *Ptr, Value *Idx,
|
||||||
|
const std::string &Name, BasicBlock *InsertAtEnd);
|
||||||
GetElementPtrInst(Value *Ptr, Value *Idx0, Value *Idx1,
|
GetElementPtrInst(Value *Ptr, Value *Idx0, Value *Idx1,
|
||||||
const std::string &Name = "", Instruction *InsertBefore =0);
|
const std::string &Name = "", Instruction *InsertBefore =0);
|
||||||
GetElementPtrInst(Value *Ptr, Value *Idx0, Value *Idx1,
|
GetElementPtrInst(Value *Ptr, Value *Idx0, Value *Idx1,
|
||||||
@ -336,6 +341,7 @@ public:
|
|||||||
bool AllowStructLeaf = false);
|
bool AllowStructLeaf = false);
|
||||||
static const Type *getIndexedType(const Type *Ptr, Value *Idx0, Value *Idx1,
|
static const Type *getIndexedType(const Type *Ptr, Value *Idx0, Value *Idx1,
|
||||||
bool AllowStructLeaf = false);
|
bool AllowStructLeaf = false);
|
||||||
|
static const Type *getIndexedType(const Type *Ptr, Value *Idx);
|
||||||
|
|
||||||
inline op_iterator idx_begin() { return op_begin()+1; }
|
inline op_iterator idx_begin() { return op_begin()+1; }
|
||||||
inline const_op_iterator idx_begin() const { return op_begin()+1; }
|
inline const_op_iterator idx_begin() const { return op_begin()+1; }
|
||||||
|
@ -603,6 +603,13 @@ void GetElementPtrInst::init(Value *Ptr, Value *Idx0, Value *Idx1) {
|
|||||||
OL[2].init(Idx1, this);
|
OL[2].init(Idx1, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GetElementPtrInst::init(Value *Ptr, Value *Idx) {
|
||||||
|
NumOperands = 2;
|
||||||
|
Use *OL = OperandList = new Use[2];
|
||||||
|
OL[0].init(Ptr, this);
|
||||||
|
OL[1].init(Idx, this);
|
||||||
|
}
|
||||||
|
|
||||||
GetElementPtrInst::GetElementPtrInst(Value *Ptr, const std::vector<Value*> &Idx,
|
GetElementPtrInst::GetElementPtrInst(Value *Ptr, const std::vector<Value*> &Idx,
|
||||||
const std::string &Name, Instruction *InBe)
|
const std::string &Name, Instruction *InBe)
|
||||||
: Instruction(PointerType::get(checkType(getIndexedType(Ptr->getType(),
|
: Instruction(PointerType::get(checkType(getIndexedType(Ptr->getType(),
|
||||||
@ -619,6 +626,20 @@ GetElementPtrInst::GetElementPtrInst(Value *Ptr, const std::vector<Value*> &Idx,
|
|||||||
init(Ptr, Idx);
|
init(Ptr, Idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GetElementPtrInst::GetElementPtrInst(Value *Ptr, Value *Idx,
|
||||||
|
const std::string &Name, Instruction *InBe)
|
||||||
|
: Instruction(PointerType::get(checkType(getIndexedType(Ptr->getType(),Idx))),
|
||||||
|
GetElementPtr, 0, 0, Name, InBe) {
|
||||||
|
init(Ptr, Idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
GetElementPtrInst::GetElementPtrInst(Value *Ptr, Value *Idx,
|
||||||
|
const std::string &Name, BasicBlock *IAE)
|
||||||
|
: Instruction(PointerType::get(checkType(getIndexedType(Ptr->getType(),Idx))),
|
||||||
|
GetElementPtr, 0, 0, Name, IAE) {
|
||||||
|
init(Ptr, Idx);
|
||||||
|
}
|
||||||
|
|
||||||
GetElementPtrInst::GetElementPtrInst(Value *Ptr, Value *Idx0, Value *Idx1,
|
GetElementPtrInst::GetElementPtrInst(Value *Ptr, Value *Idx0, Value *Idx1,
|
||||||
const std::string &Name, Instruction *InBe)
|
const std::string &Name, Instruction *InBe)
|
||||||
: Instruction(PointerType::get(checkType(getIndexedType(Ptr->getType(),
|
: Instruction(PointerType::get(checkType(getIndexedType(Ptr->getType(),
|
||||||
@ -700,6 +721,16 @@ const Type* GetElementPtrInst::getIndexedType(const Type *Ptr,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const Type* GetElementPtrInst::getIndexedType(const Type *Ptr, Value *Idx) {
|
||||||
|
const PointerType *PTy = dyn_cast<PointerType>(Ptr);
|
||||||
|
if (!PTy) return 0; // Type isn't a pointer type!
|
||||||
|
|
||||||
|
// Check the pointer index.
|
||||||
|
if (!PTy->indexValid(Idx)) return 0;
|
||||||
|
|
||||||
|
return PTy;
|
||||||
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// BinaryOperator Class
|
// BinaryOperator Class
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
Loading…
x
Reference in New Issue
Block a user