diff options
-rw-r--r-- | lib/Transforms/Scalar/ScalarReplAggregates.cpp | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/lib/Transforms/Scalar/ScalarReplAggregates.cpp b/lib/Transforms/Scalar/ScalarReplAggregates.cpp index 3eba528296..3e141be607 100644 --- a/lib/Transforms/Scalar/ScalarReplAggregates.cpp +++ b/lib/Transforms/Scalar/ScalarReplAggregates.cpp @@ -316,9 +316,13 @@ int SROA::isSafeUseOfAllocation(Instruction *User) { // // Scalar replacing *just* the outer index of the array is probably not // going to be a win anyway, so just give up. - for (++I; I != E && isa<ArrayType>(*I); ++I) { - const ArrayType *SubArrayTy = cast<ArrayType>(*I); - uint64_t NumElements = SubArrayTy->getNumElements(); + for (++I; I != E && (isa<ArrayType>(*I) || isa<PackedType>(*I)); ++I) { + uint64_t NumElements; + if (const ArrayType *SubArrayTy = dyn_cast<ArrayType>(*I)) + NumElements = SubArrayTy->getNumElements(); + else + NumElements = cast<PackedType>(*I)->getNumElements(); + if (!isa<ConstantInt>(I.getOperand())) return 0; if (cast<ConstantInt>(I.getOperand())->getZExtValue() >= NumElements) return 0; |