mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-27 05:32:22 +00:00
[opaque pointer type] Change GetElementPtrInst::getIndexedType to take the pointee type
This pushes the use of PointerType::getElementType up into several callers - I'll essentially just have to keep pushing that up the stack until I can eliminate every call to it... git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@233604 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a55ae077e4
commit
25e3d2d6d3
@ -882,9 +882,9 @@ public:
|
||||
/// Null is returned if the indices are invalid for the specified
|
||||
/// pointer type.
|
||||
///
|
||||
static Type *getIndexedType(Type *Ptr, ArrayRef<Value *> IdxList);
|
||||
static Type *getIndexedType(Type *Ptr, ArrayRef<Constant *> IdxList);
|
||||
static Type *getIndexedType(Type *Ptr, ArrayRef<uint64_t> IdxList);
|
||||
static Type *getIndexedType(Type *Ty, ArrayRef<Value *> IdxList);
|
||||
static Type *getIndexedType(Type *Ty, ArrayRef<Constant *> IdxList);
|
||||
static Type *getIndexedType(Type *Ty, ArrayRef<uint64_t> IdxList);
|
||||
|
||||
inline op_iterator idx_begin() { return op_begin()+1; }
|
||||
inline const_op_iterator idx_begin() const { return op_begin()+1; }
|
||||
@ -915,9 +915,12 @@ public:
|
||||
/// GetGEPReturnType - Returns the pointer type returned by the GEP
|
||||
/// instruction, which may be a vector of pointers.
|
||||
static Type *getGEPReturnType(Value *Ptr, ArrayRef<Value *> IdxList) {
|
||||
Type *PtrTy = PointerType::get(checkGEPType(
|
||||
getIndexedType(Ptr->getType(), IdxList)),
|
||||
Ptr->getType()->getPointerAddressSpace());
|
||||
Type *PtrTy =
|
||||
PointerType::get(checkGEPType(getIndexedType(
|
||||
cast<PointerType>(Ptr->getType()->getScalarType())
|
||||
->getElementType(),
|
||||
IdxList)),
|
||||
Ptr->getType()->getPointerAddressSpace());
|
||||
// Vector GEP
|
||||
if (Ptr->getType()->isVectorTy()) {
|
||||
unsigned NumElem = cast<VectorType>(Ptr->getType())->getNumElements();
|
||||
|
@ -932,14 +932,14 @@ aliasSameBasePointerGEPs(const GEPOperator *GEP1, uint64_t V1Size,
|
||||
// Also, check that they all index through arrays.
|
||||
for (unsigned i = 1, e = GEP1->getNumIndices() - 1; i != e; ++i) {
|
||||
if (!isa<ArrayType>(GetElementPtrInst::getIndexedType(
|
||||
GEP1->getPointerOperandType(), IntermediateIndices)))
|
||||
GEP1->getSourceElementType(), IntermediateIndices)))
|
||||
return AliasAnalysis::MayAlias;
|
||||
IntermediateIndices.push_back(GEP1->getOperand(i + 1));
|
||||
}
|
||||
|
||||
StructType *LastIndexedStruct =
|
||||
dyn_cast<StructType>(GetElementPtrInst::getIndexedType(
|
||||
GEP1->getPointerOperandType(), IntermediateIndices));
|
||||
GEP1->getSourceElementType(), IntermediateIndices));
|
||||
|
||||
if (!LastIndexedStruct)
|
||||
return AliasAnalysis::MayAlias;
|
||||
|
@ -681,8 +681,9 @@ static Constant *CastGEPIndices(ArrayRef<Constant *> Ops, Type *ResultTy,
|
||||
for (unsigned i = 1, e = Ops.size(); i != e; ++i) {
|
||||
if ((i == 1 ||
|
||||
!isa<StructType>(GetElementPtrInst::getIndexedType(
|
||||
Ops[0]->getType(),
|
||||
Ops.slice(1, i - 1)))) &&
|
||||
cast<PointerType>(Ops[0]->getType()->getScalarType())
|
||||
->getElementType(),
|
||||
Ops.slice(1, i - 1)))) &&
|
||||
Ops[i]->getType() != IntPtrTy) {
|
||||
Any = true;
|
||||
NewIdxs.push_back(ConstantExpr::getCast(CastInst::getCastOpcode(Ops[i],
|
||||
|
@ -3251,7 +3251,8 @@ static Value *SimplifyGEPInst(ArrayRef<Value *> Ops, const Query &Q, unsigned) {
|
||||
return Ops[0];
|
||||
|
||||
// Compute the (pointer) type returned by the GEP instruction.
|
||||
Type *LastType = GetElementPtrInst::getIndexedType(PtrTy, Ops.slice(1));
|
||||
Type *LastType =
|
||||
GetElementPtrInst::getIndexedType(PtrTy->getElementType(), Ops.slice(1));
|
||||
Type *GEPTy = PointerType::get(LastType, AS);
|
||||
if (VectorType *VT = dyn_cast<VectorType>(Ops[0]->getType()))
|
||||
GEPTy = VectorType::get(GEPTy, VT->getNumElements());
|
||||
|
@ -2831,7 +2831,10 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) {
|
||||
!BasePointerType->getElementType()->isSized(&Visited))
|
||||
return Error(ID.Loc, "base element of getelementptr must be sized");
|
||||
|
||||
if (!GetElementPtrInst::getIndexedType(Elts[0]->getType(), Indices))
|
||||
if (!GetElementPtrInst::getIndexedType(
|
||||
cast<PointerType>(Elts[0]->getType()->getScalarType())
|
||||
->getElementType(),
|
||||
Indices))
|
||||
return Error(ID.Loc, "invalid getelementptr indices");
|
||||
ID.ConstantVal = ConstantExpr::getGetElementPtr(Elts[0], Indices,
|
||||
InBounds);
|
||||
@ -5523,7 +5526,9 @@ int LLParser::ParseGetElementPtr(Instruction *&Inst, PerFunctionState &PFS) {
|
||||
!BasePointerType->getElementType()->isSized(&Visited))
|
||||
return Error(Loc, "base element of getelementptr must be sized");
|
||||
|
||||
if (!GetElementPtrInst::getIndexedType(BaseType, Indices))
|
||||
if (!GetElementPtrInst::getIndexedType(
|
||||
cast<PointerType>(BaseType->getScalarType())->getElementType(),
|
||||
Indices))
|
||||
return Error(Loc, "invalid getelementptr indices");
|
||||
Inst = GetElementPtrInst::Create(Ty, Ptr, Indices);
|
||||
if (InBounds)
|
||||
|
@ -2031,7 +2031,8 @@ static Constant *ConstantFoldGetElementPtrImpl(Constant *C,
|
||||
|
||||
if (isa<UndefValue>(C)) {
|
||||
PointerType *Ptr = cast<PointerType>(C->getType());
|
||||
Type *Ty = GetElementPtrInst::getIndexedType(Ptr, Idxs);
|
||||
Type *Ty = GetElementPtrInst::getIndexedType(
|
||||
cast<PointerType>(Ptr->getScalarType())->getElementType(), Idxs);
|
||||
assert(Ty && "Invalid indices for GEP!");
|
||||
return UndefValue::get(PointerType::get(Ty, Ptr->getAddressSpace()));
|
||||
}
|
||||
@ -2045,7 +2046,8 @@ static Constant *ConstantFoldGetElementPtrImpl(Constant *C,
|
||||
}
|
||||
if (isNull) {
|
||||
PointerType *Ptr = cast<PointerType>(C->getType());
|
||||
Type *Ty = GetElementPtrInst::getIndexedType(Ptr, Idxs);
|
||||
Type *Ty = GetElementPtrInst::getIndexedType(
|
||||
cast<PointerType>(Ptr->getScalarType())->getElementType(), Idxs);
|
||||
assert(Ty && "Invalid indices for GEP!");
|
||||
return ConstantPointerNull::get(PointerType::get(Ty,
|
||||
Ptr->getAddressSpace()));
|
||||
|
@ -2010,7 +2010,8 @@ Constant *ConstantExpr::getGetElementPtr(Constant *C, ArrayRef<Value *> Idxs,
|
||||
return FC; // Fold a few common cases.
|
||||
|
||||
// Get the result type of the getelementptr!
|
||||
Type *Ty = GetElementPtrInst::getIndexedType(C->getType(), Idxs);
|
||||
Type *Ty = GetElementPtrInst::getIndexedType(
|
||||
cast<PointerType>(C->getType()->getScalarType())->getElementType(), Idxs);
|
||||
assert(Ty && "GEP indices invalid!");
|
||||
unsigned AS = C->getType()->getPointerAddressSpace();
|
||||
Type *ReqTy = Ty->getPointerTo(AS);
|
||||
|
@ -1258,11 +1258,7 @@ GetElementPtrInst::GetElementPtrInst(const GetElementPtrInst &GEPI)
|
||||
/// pointer type.
|
||||
///
|
||||
template <typename IndexTy>
|
||||
static Type *getIndexedTypeInternal(Type *Ptr, ArrayRef<IndexTy> IdxList) {
|
||||
PointerType *PTy = dyn_cast<PointerType>(Ptr->getScalarType());
|
||||
if (!PTy) return nullptr; // Type isn't a pointer type!
|
||||
Type *Agg = PTy->getElementType();
|
||||
|
||||
static Type *getIndexedTypeInternal(Type *Agg, ArrayRef<IndexTy> IdxList) {
|
||||
// Handle the special case of the empty set index set, which is always valid.
|
||||
if (IdxList.empty())
|
||||
return Agg;
|
||||
@ -1283,17 +1279,17 @@ static Type *getIndexedTypeInternal(Type *Ptr, ArrayRef<IndexTy> IdxList) {
|
||||
return CurIdx == IdxList.size() ? Agg : nullptr;
|
||||
}
|
||||
|
||||
Type *GetElementPtrInst::getIndexedType(Type *Ptr, ArrayRef<Value *> IdxList) {
|
||||
return getIndexedTypeInternal(Ptr, IdxList);
|
||||
Type *GetElementPtrInst::getIndexedType(Type *Ty, ArrayRef<Value *> IdxList) {
|
||||
return getIndexedTypeInternal(Ty, IdxList);
|
||||
}
|
||||
|
||||
Type *GetElementPtrInst::getIndexedType(Type *Ptr,
|
||||
Type *GetElementPtrInst::getIndexedType(Type *Ty,
|
||||
ArrayRef<Constant *> IdxList) {
|
||||
return getIndexedTypeInternal(Ptr, IdxList);
|
||||
return getIndexedTypeInternal(Ty, IdxList);
|
||||
}
|
||||
|
||||
Type *GetElementPtrInst::getIndexedType(Type *Ptr, ArrayRef<uint64_t> IdxList) {
|
||||
return getIndexedTypeInternal(Ptr, IdxList);
|
||||
Type *GetElementPtrInst::getIndexedType(Type *Ty, ArrayRef<uint64_t> IdxList) {
|
||||
return getIndexedTypeInternal(Ty, IdxList);
|
||||
}
|
||||
|
||||
/// hasAllZeroIndices - Return true if all of the indices of this GEP are
|
||||
|
@ -2344,7 +2344,7 @@ void Verifier::visitGetElementPtrInst(GetElementPtrInst &GEP) {
|
||||
|
||||
SmallVector<Value*, 16> Idxs(GEP.idx_begin(), GEP.idx_end());
|
||||
Type *ElTy =
|
||||
GetElementPtrInst::getIndexedType(GEP.getPointerOperandType(), Idxs);
|
||||
GetElementPtrInst::getIndexedType(GEP.getSourceElementType(), Idxs);
|
||||
Assert(ElTy, "Invalid indices for GEP pointer type!", &GEP);
|
||||
|
||||
Assert(GEP.getType()->getScalarType()->isPointerTy() &&
|
||||
|
@ -674,8 +674,9 @@ CallGraphNode *ArgPromotion::DoPromotion(Function *F,
|
||||
for (ScalarizeTable::iterator SI = ArgIndices.begin(),
|
||||
E = ArgIndices.end(); SI != E; ++SI) {
|
||||
// not allowed to dereference ->begin() if size() is 0
|
||||
Params.push_back(
|
||||
GetElementPtrInst::getIndexedType(I->getType(), SI->second));
|
||||
Params.push_back(GetElementPtrInst::getIndexedType(
|
||||
cast<PointerType>(I->getType()->getScalarType())->getElementType(),
|
||||
SI->second));
|
||||
assert(Params.back());
|
||||
}
|
||||
|
||||
|
@ -611,8 +611,10 @@ static bool canReplaceGEPIdxWithZero(InstCombiner &IC, GetElementPtrInst *GEPI,
|
||||
return false;
|
||||
|
||||
SmallVector<Value *, 4> Ops(GEPI->idx_begin(), GEPI->idx_begin() + Idx);
|
||||
Type *AllocTy =
|
||||
GetElementPtrInst::getIndexedType(GEPI->getOperand(0)->getType(), Ops);
|
||||
Type *AllocTy = GetElementPtrInst::getIndexedType(
|
||||
cast<PointerType>(GEPI->getOperand(0)->getType()->getScalarType())
|
||||
->getElementType(),
|
||||
Ops);
|
||||
if (!AllocTy || !AllocTy->isSized())
|
||||
return false;
|
||||
const DataLayout &DL = IC.getDataLayout();
|
||||
|
Loading…
x
Reference in New Issue
Block a user