scalarrepl should not split the two elements of the vsiidx array:
authorChris Lattner <sabre@nondot.org>
Tue, 7 Nov 2006 22:42:47 +0000 (22:42 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 7 Nov 2006 22:42:47 +0000 (22:42 +0000)
int func(vFloat v0, vFloat v1) {
        int ii;
        vSInt32 vsiidx[2];
        vsiidx[0] = _mm_cvttps_epi32(v0);
        vsiidx[1] = _mm_cvttps_epi32(v1);
        ii = ((int *) vsiidx)[4];
        return ii;
}

This fixes Transforms/ScalarRepl/2006-11-07-InvalidArrayPromote.ll

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

lib/Transforms/Scalar/ScalarReplAggregates.cpp

index 3eba5282968f01b61ea237abde321b4f97eec524..3e141be607cbb6546fcbe479b1bc82070ec3581e 100644 (file)
@@ -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;