From d92515034fc4157850b981f696702cc2f35733f0 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 7 Nov 2006 22:42:47 +0000 Subject: [PATCH] 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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31524 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/ScalarReplAggregates.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/Transforms/Scalar/ScalarReplAggregates.cpp b/lib/Transforms/Scalar/ScalarReplAggregates.cpp index 3eba5282968..3e141be607c 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(*I); ++I) { - const ArrayType *SubArrayTy = cast(*I); - uint64_t NumElements = SubArrayTy->getNumElements(); + for (++I; I != E && (isa(*I) || isa(*I)); ++I) { + uint64_t NumElements; + if (const ArrayType *SubArrayTy = dyn_cast(*I)) + NumElements = SubArrayTy->getNumElements(); + else + NumElements = cast(*I)->getNumElements(); + if (!isa(I.getOperand())) return 0; if (cast(I.getOperand())->getZExtValue() >= NumElements) return 0;