Skip to content

Commit

Permalink
IR: Change PointerType to derive from Type rather than SequentialType.
Browse files Browse the repository at this point in the history
As proposed on llvm-dev:
http://lists.llvm.org/pipermail/llvm-dev/2016-October/106640.html

This is for a couple of reasons:

- Values of type PointerType are unlike the other SequentialTypes (arrays
  and vectors) in that they do not hold values of the element type. By moving
  PointerType we can unify certain aspects of how the other SequentialTypes
  are handled.
- PointerType will have no place in the SequentialType hierarchy once
  pointee types are removed, so this is a necessary step towards removing
  pointee types.

Differential Revision: https://reviews.llvm.org/D26595

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@288462 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
pcc committed Dec 2, 2016
1 parent f5bbb38 commit 9c9ec72
Show file tree
Hide file tree
Showing 11 changed files with 34 additions and 39 deletions.
4 changes: 2 additions & 2 deletions docs/ProgrammersManual.rst
Original file line number Diff line number Diff line change
Expand Up @@ -3278,7 +3278,7 @@ Important Derived Types
* ``unsigned getBitWidth() const``: Get the bit width of an integer type.

``SequentialType``
This is subclassed by ArrayType, PointerType and VectorType.
This is subclassed by ArrayType and VectorType.

* ``const Type * getElementType() const``: Returns the type of each
of the elements in the sequential type.
Expand All @@ -3291,7 +3291,7 @@ Important Derived Types
in the array.

``PointerType``
Subclass of SequentialType for pointer types.
Subclass of Type for pointer types.

``VectorType``
Subclass of SequentialType for vector types. A vector type is similar to an
Expand Down
25 changes: 13 additions & 12 deletions include/llvm/IR/DerivedTypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ unsigned Type::getFunctionNumParams() const {
return cast<FunctionType>(this)->getNumParams();
}

/// Common super class of ArrayType, StructType, PointerType and VectorType.
/// Common super class of ArrayType, StructType and VectorType.
class CompositeType : public Type {
protected:
explicit CompositeType(LLVMContext &C, TypeID tid) : Type(C, tid) {}
Expand All @@ -169,7 +169,6 @@ class CompositeType : public Type {
static inline bool classof(const Type *T) {
return T->getTypeID() == ArrayTyID ||
T->getTypeID() == StructTyID ||
T->getTypeID() == PointerTyID ||
T->getTypeID() == VectorTyID;
}
};
Expand Down Expand Up @@ -306,12 +305,12 @@ Type *Type::getStructElementType(unsigned N) const {
return cast<StructType>(this)->getElementType(N);
}

/// This is the superclass of the array, pointer and vector type classes.
/// All of these represent "arrays" in memory. The array type represents a
/// specifically sized array, pointer types are unsized/unknown size arrays,
/// vector types represent specifically sized arrays that allow for use of SIMD
/// instructions. SequentialType holds the common features of all, which stem
/// from the fact that all three lay their components out in memory identically.
/// This is the superclass of the array and vector type classes. Both of these
/// represent "arrays" in memory. The array type represents a specifically sized
/// array, and the vector type represents a specifically sized array that allows
/// for use of SIMD instructions. SequentialType holds the common features of
/// both, which stem from the fact that both lay their components out in memory
/// identically.
class SequentialType : public CompositeType {
Type *ContainedType; ///< Storage for the single contained type.
SequentialType(const SequentialType &) = delete;
Expand All @@ -329,9 +328,7 @@ class SequentialType : public CompositeType {

/// Methods for support type inquiry through isa, cast, and dyn_cast.
static inline bool classof(const Type *T) {
return T->getTypeID() == ArrayTyID ||
T->getTypeID() == PointerTyID ||
T->getTypeID() == VectorTyID;
return T->getTypeID() == ArrayTyID || T->getTypeID() == VectorTyID;
}
};

Expand Down Expand Up @@ -441,11 +438,13 @@ unsigned Type::getVectorNumElements() const {
}

/// Class to represent pointers.
class PointerType : public SequentialType {
class PointerType : public Type {
PointerType(const PointerType &) = delete;
const PointerType &operator=(const PointerType &) = delete;
explicit PointerType(Type *ElType, unsigned AddrSpace);

Type *PointeeTy;

public:
/// This constructs a pointer to an object of the specified type in a numbered
/// address space.
Expand All @@ -457,6 +456,8 @@ class PointerType : public SequentialType {
return PointerType::get(ElementType, 0);
}

Type *getElementType() const { return PointeeTy; }

/// Return true if the specified type is valid as a element type.
static bool isValidElementType(Type *ElemTy);

Expand Down
5 changes: 0 additions & 5 deletions include/llvm/IR/Instructions.h
Original file line number Diff line number Diff line change
Expand Up @@ -898,11 +898,6 @@ class GetElementPtrInst : public Instruction {
/// Transparently provide more efficient getOperand methods.
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);

// getType - Overload to return most specific sequential type.
SequentialType *getType() const {
return cast<SequentialType>(Instruction::getType());
}

Type *getSourceElementType() const { return SourceElementType; }

void setSourceElementType(Type *Ty) { SourceElementType = Ty; }
Expand Down
2 changes: 1 addition & 1 deletion include/llvm/IR/Type.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ class Type {
Type * const *ContainedTys;

static bool isSequentialType(TypeID TyID) {
return TyID == ArrayTyID || TyID == PointerTyID || TyID == VectorTyID;
return TyID == ArrayTyID || TyID == VectorTyID;
}

public:
Expand Down
4 changes: 2 additions & 2 deletions lib/Analysis/ScalarEvolution.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3057,9 +3057,9 @@ ScalarEvolution::getGEPExpr(GEPOperator *GEP,
: SCEV::FlagAnyWrap;

const SCEV *TotalOffset = getZero(IntPtrTy);
// The address space is unimportant. The first thing we do on CurTy is getting
// The array size is unimportant. The first thing we do on CurTy is getting
// its element type.
Type *CurTy = PointerType::getUnqual(GEP->getSourceElementType());
Type *CurTy = ArrayType::get(GEP->getSourceElementType(), 0);
for (const SCEV *IndexExpr : IndexExprs) {
// Compute the (potentially symbolic) offset in bytes for this index.
if (StructType *STy = dyn_cast<StructType>(CurTy)) {
Expand Down
8 changes: 1 addition & 7 deletions lib/IR/ConstantFold.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,6 @@ static Constant *FoldBitCast(Constant *V, Type *DestTy) {
IdxList.push_back(Zero);
} else if (SequentialType *STy =
dyn_cast<SequentialType>(ElTy)) {
if (ElTy->isPointerTy()) break; // Can't index into pointers!
ElTy = STy->getElementType();
IdxList.push_back(Zero);
} else {
Expand Down Expand Up @@ -2206,11 +2205,6 @@ Constant *llvm::ConstantFoldGetElementPtr(Type *PointeeTy, Constant *C,
continue;
}
auto *STy = cast<SequentialType>(Ty);
if (isa<PointerType>(STy)) {
// We don't know if it's in range or not.
Unknown = true;
continue;
}
if (isa<VectorType>(STy)) {
// There can be awkward padding in after a non-power of two vector.
Unknown = true;
Expand All @@ -2222,7 +2216,7 @@ Constant *llvm::ConstantFoldGetElementPtr(Type *PointeeTy, Constant *C,
CI))
// It's in range, skip to the next index.
continue;
if (!isa<SequentialType>(Prev)) {
if (isa<StructType>(Prev)) {
// It's out of range, but the prior dimension is a struct
// so we can't do anything about it.
Unknown = true;
Expand Down
7 changes: 5 additions & 2 deletions lib/IR/Core.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -578,8 +578,11 @@ LLVMTypeRef LLVMVectorType(LLVMTypeRef ElementType, unsigned ElementCount) {
return wrap(VectorType::get(unwrap(ElementType), ElementCount));
}

LLVMTypeRef LLVMGetElementType(LLVMTypeRef Ty) {
return wrap(unwrap<SequentialType>(Ty)->getElementType());
LLVMTypeRef LLVMGetElementType(LLVMTypeRef WrappedTy) {
auto *Ty = unwrap<Type>(WrappedTy);
if (auto *PTy = dyn_cast<PointerType>(Ty))
return wrap(PTy->getElementType());
return wrap(cast<SequentialType>(Ty)->getElementType());
}

unsigned LLVMGetArrayLength(LLVMTypeRef ArrayTy) {
Expand Down
4 changes: 3 additions & 1 deletion lib/IR/Type.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -673,7 +673,9 @@ PointerType *PointerType::get(Type *EltTy, unsigned AddressSpace) {


PointerType::PointerType(Type *E, unsigned AddrSpace)
: SequentialType(PointerTyID, E) {
: Type(E->getContext(), PointerTyID), PointeeTy(E) {
ContainedTys = &PointeeTy;
NumContainedTys = 1;
setSubclassData(AddrSpace);
}

Expand Down
2 changes: 2 additions & 0 deletions lib/Target/Hexagon/HexagonCommonGEP.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,8 @@ namespace {


Type *next_type(Type *Ty, Value *Idx) {
if (auto *PTy = dyn_cast<PointerType>(Ty))
return PTy->getElementType();
// Advance the type.
if (!Ty->isStructTy()) {
Type *NexTy = cast<SequentialType>(Ty)->getElementType();
Expand Down
8 changes: 5 additions & 3 deletions lib/Transforms/IPO/ArgumentPromotion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -176,8 +176,7 @@ static bool isDenselyPacked(Type *type, const DataLayout &DL) {

// For homogenous sequential types, check for padding within members.
if (SequentialType *seqTy = dyn_cast<SequentialType>(type))
return isa<PointerType>(seqTy) ||
isDenselyPacked(seqTy->getElementType(), DL);
return isDenselyPacked(seqTy->getElementType(), DL);

// Check for padding within and between elements of a struct.
StructType *StructTy = cast<StructType>(type);
Expand Down Expand Up @@ -835,7 +834,10 @@ DoPromotion(Function *F, SmallPtrSetImpl<Argument *> &ArgsToPromote,
Type::getInt64Ty(F->getContext()));
Ops.push_back(ConstantInt::get(IdxTy, II));
// Keep track of the type we're currently indexing.
ElTy = cast<CompositeType>(ElTy)->getTypeAtIndex(II);
if (auto *ElPTy = dyn_cast<PointerType>(ElTy))
ElTy = ElPTy->getElementType();
else
ElTy = cast<CompositeType>(ElTy)->getTypeAtIndex(II);
}
// And create a GEP to extract those indices.
V = GetElementPtrInst::Create(ArgIndex.first, V, Ops,
Expand Down
4 changes: 0 additions & 4 deletions lib/Transforms/Scalar/SROA.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3219,10 +3219,6 @@ static Type *getTypePartition(const DataLayout &DL, Type *Ty, uint64_t Offset,
return nullptr;

if (SequentialType *SeqTy = dyn_cast<SequentialType>(Ty)) {
// We can't partition pointers...
if (SeqTy->isPointerTy())
return nullptr;

Type *ElementTy = SeqTy->getElementType();
uint64_t ElementSize = DL.getTypeAllocSize(ElementTy);
uint64_t NumSkippedElements = Offset / ElementSize;
Expand Down

0 comments on commit 9c9ec72

Please sign in to comment.