diff options
| author | Chris Lattner <sabre@nondot.org> | 2006-11-07 22:42:47 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2006-11-07 22:42:47 +0000 |
| commit | 4967f6ddeaf6c39d8a886f624b19199f5ed8ea01 (patch) | |
| tree | 49c5268f2d5892d5daeb87579da9696a65eb6d42 | |
| parent | 2d7a5d9b5def99c85dc1d61616dffb4e59be84ee (diff) | |
| download | bcm5719-llvm-4967f6ddeaf6c39d8a886f624b19199f5ed8ea01.tar.gz bcm5719-llvm-4967f6ddeaf6c39d8a886f624b19199f5ed8ea01.zip | |
scalarrepl should not split the two elements of the vsiidx array:
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
llvm-svn: 31524
| -rw-r--r-- | llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp b/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp index 3eba5282968..3e141be607c 100644 --- a/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp +++ b/llvm/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; |

