[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