ConstantFoldLoadThroughGEPConstantExpr wasn't handling pointers to
authorRobert Bocchino <bocchino@illinois.edu>
Thu, 19 Jan 2006 23:53:23 +0000 (23:53 +0000)
committerRobert Bocchino <bocchino@illinois.edu>
Thu, 19 Jan 2006 23:53:23 +0000 (23:53 +0000)
packed types correctly.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25470 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Utils/Local.cpp

index f2598c16ce4d91dc3f3cb8ff1071159e5eeefab8..9685e94cc194e64716c03f84643a656869eb4a31 100644 (file)
@@ -267,16 +267,29 @@ Constant *llvm::ConstantFoldLoadThroughGEPConstantExpr(Constant *C,
         return 0;
       }
     } else if (ConstantInt *CI = dyn_cast<ConstantInt>(I.getOperand())) {
-      const ArrayType *ATy = cast<ArrayType>(*I);
-      if ((uint64_t)CI->getRawValue() >= ATy->getNumElements()) return 0;
-      if (ConstantArray *CA = dyn_cast<ConstantArray>(C))
-        C = CA->getOperand((unsigned)CI->getRawValue());
-      else if (isa<ConstantAggregateZero>(C))
-        C = Constant::getNullValue(ATy->getElementType());
-      else if (isa<UndefValue>(C))
-        C = UndefValue::get(ATy->getElementType());
-      else
+      if (const ArrayType *ATy = dyn_cast<ArrayType>(*I)) {
+        if ((uint64_t)CI->getRawValue() >= ATy->getNumElements()) return 0;
+        if (ConstantArray *CA = dyn_cast<ConstantArray>(C))
+          C = CA->getOperand((unsigned)CI->getRawValue());
+        else if (isa<ConstantAggregateZero>(C))
+          C = Constant::getNullValue(ATy->getElementType());
+        else if (isa<UndefValue>(C))
+          C = UndefValue::get(ATy->getElementType());
+        else
+          return 0;
+      } else if (const PackedType *PTy = dyn_cast<PackedType>(*I)) {
+        if ((uint64_t)CI->getRawValue() >= PTy->getNumElements()) return 0;
+        if (ConstantPacked *CP = dyn_cast<ConstantPacked>(C))
+          C = CP->getOperand((unsigned)CI->getRawValue());
+        else if (isa<ConstantAggregateZero>(C))
+          C = Constant::getNullValue(PTy->getElementType());
+        else if (isa<UndefValue>(C))
+          C = UndefValue::get(PTy->getElementType());
+        else
+          return 0;
+      } else {
         return 0;
+      }
     } else {
       return 0;
     }