Check to make sure types are sized before calling getTypeSize on them.
authorChris Lattner <sabre@nondot.org>
Tue, 6 Jul 2004 19:28:42 +0000 (19:28 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 6 Jul 2004 19:28:42 +0000 (19:28 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@14649 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InstructionCombining.cpp

index 4f6724ff52f9d3d1c88bd6aff2319c53a9d646ee..d43011da5bcbe9699c14d332df5ac9c74013ff33 100644 (file)
@@ -2098,22 +2098,24 @@ Instruction *InstCombiner::visitCastInst(CastInst &CI) {
       if (const PointerType *PTy = dyn_cast<PointerType>(CI.getType())) {
         // Get the type really allocated and the type casted to...
         const Type *AllocElTy = AI->getAllocatedType();
-        unsigned AllocElTySize = TD->getTypeSize(AllocElTy);
         const Type *CastElTy = PTy->getElementType();
-        unsigned CastElTySize = TD->getTypeSize(CastElTy);
+        if (AllocElTy->isSized() && CastElTy->isSized()) {
+          unsigned AllocElTySize = TD->getTypeSize(AllocElTy);
+          unsigned CastElTySize = TD->getTypeSize(CastElTy);
 
-        // If the allocation is for an even multiple of the cast type size
-        if (CastElTySize && (AllocElTySize % CastElTySize == 0)) {
-          Value *Amt = ConstantUInt::get(Type::UIntTy, 
+          // If the allocation is for an even multiple of the cast type size
+          if (CastElTySize && (AllocElTySize % CastElTySize == 0)) {
+            Value *Amt = ConstantUInt::get(Type::UIntTy, 
                                          AllocElTySize/CastElTySize);
-          std::string Name = AI->getName(); AI->setName("");
-          AllocationInst *New;
-          if (isa<MallocInst>(AI))
-            New = new MallocInst(CastElTy, Amt, Name);
-          else
-            New = new AllocaInst(CastElTy, Amt, Name);
-          InsertNewInstBefore(New, *AI);
-          return ReplaceInstUsesWith(CI, New);
+            std::string Name = AI->getName(); AI->setName("");
+            AllocationInst *New;
+            if (isa<MallocInst>(AI))
+              New = new MallocInst(CastElTy, Amt, Name);
+            else
+              New = new AllocaInst(CastElTy, Amt, Name);
+            InsertNewInstBefore(New, *AI);
+            return ReplaceInstUsesWith(CI, New);
+          }
         }
       }