[llvm-commits] CVS: llvm-poolalloc/lib/PoolAllocate/PointerCompress.cpp
Chris Lattner
lattner at cs.uiuc.edu
Fri Mar 4 17:04:19 PST 2005
Changes in directory llvm-poolalloc/lib/PoolAllocate:
PointerCompress.cpp updated: 1.46 -> 1.47
---
Log message:
Handle programs that have 1 element arrays and 1 element structs like Olden/mst
---
Diffs of the changes: (+19 -8)
PointerCompress.cpp | 27 +++++++++++++++++++--------
1 files changed, 19 insertions(+), 8 deletions(-)
Index: llvm-poolalloc/lib/PoolAllocate/PointerCompress.cpp
diff -u llvm-poolalloc/lib/PoolAllocate/PointerCompress.cpp:1.46 llvm-poolalloc/lib/PoolAllocate/PointerCompress.cpp:1.47
--- llvm-poolalloc/lib/PoolAllocate/PointerCompress.cpp:1.46 Fri Mar 4 16:46:35 2005
+++ llvm-poolalloc/lib/PoolAllocate/PointerCompress.cpp Fri Mar 4 19:04:04 2005
@@ -638,18 +638,25 @@
Value *Idx = GEPI.getOperand(i);
if (const StructType *STy = dyn_cast<StructType>(*GTI)) {
unsigned Field = (unsigned)cast<ConstantUInt>(Idx)->getValue();
+ if (Field) {
+ uint64_t FieldOffs = TD.getStructLayout(cast<StructType>(NTy))
+ ->MemberOffsets[Field];
+ Constant *FieldOffsCst = ConstantUInt::get(SCALARUINTTYPE, FieldOffs);
+ Val = BinaryOperator::createAdd(Val, FieldOffsCst,
+ GEPI.getName(), &GEPI);
+ }
- uint64_t FieldOffs = TD.getStructLayout(cast<StructType>(NTy))
- ->MemberOffsets[Field];
- Constant *FieldOffsCst = ConstantUInt::get(SCALARUINTTYPE, FieldOffs);
- Val = BinaryOperator::createAdd(Val, FieldOffsCst, GEPI.getName(), &GEPI);
-
- NTy = cast<StructType>(NTy)->getElementType(Field);
+ // If this is a one element struct, NTy may not have the structure type.
+ if (STy->getNumElements() > 1 ||
+ (isa<StructType>(NTy) &&
+ cast<StructType>(NTy)->getNumElements() == 1))
+ NTy = cast<StructType>(NTy)->getElementType(Field);
} else {
assert(isa<SequentialType>(*GTI) && "Not struct or sequential?");
+ const SequentialType *STy = cast<SequentialType>(*GTI);
if (!isa<Constant>(Idx) || !cast<Constant>(Idx)->isNullValue()) {
// Add Idx*sizeof(NewElementType) to the index.
- const Type *ElTy = cast<SequentialType>(NTy)->getElementType();
+ const Type *ElTy = STy->getElementType();
if (Idx->getType() != SCALARUINTTYPE)
Idx = new CastInst(Idx, SCALARUINTTYPE, Idx->getName(), &GEPI);
@@ -658,7 +665,11 @@
Idx = BinaryOperator::createMul(Idx, Scale, "fieldidx", &GEPI);
Val = BinaryOperator::createAdd(Val, Idx, GEPI.getName(), &GEPI);
}
- NTy = cast<SequentialType>(NTy)->getElementType();
+
+ // If this is a one element array type, NTy may not reflect the array.
+ if (!isa<ArrayType>(STy) || cast<ArrayType>(STy)->getNumElements() != 1 ||
+ (isa<ArrayType>(NTy) && cast<ArrayType>(NTy)->getNumElements() == 1))
+ NTy = cast<SequentialType>(NTy)->getElementType();
}
}
More information about the llvm-commits
mailing list