diff options
author | Pete Cooper <peter_cooper@apple.com> | 2012-06-14 16:38:13 +0000 |
---|---|---|
committer | Pete Cooper <peter_cooper@apple.com> | 2012-06-14 16:38:13 +0000 |
commit | 77fdd3ad4afb2a8cd99a1dc7f24faa0e900a1aaf (patch) | |
tree | dbc5e1a4eb64e5856e480a89f4f8bcd1e64906c0 /lib/Transforms/Scalar/ScalarReplAggregates.cpp | |
parent | b5a1bf4780b78b301fd21dbd865db45ee33cd204 (diff) | |
download | llvm-77fdd3ad4afb2a8cd99a1dc7f24faa0e900a1aaf.tar.gz llvm-77fdd3ad4afb2a8cd99a1dc7f24faa0e900a1aaf.tar.bz2 llvm-77fdd3ad4afb2a8cd99a1dc7f24faa0e900a1aaf.tar.xz |
Recommit r158407: Allow SROA to look at a vector type and see if the offset is out of range to be replaced with a scalar access. Now with additional fix and test for indexing into a vector inside a struct
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@158454 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar/ScalarReplAggregates.cpp')
-rw-r--r-- | lib/Transforms/Scalar/ScalarReplAggregates.cpp | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/lib/Transforms/Scalar/ScalarReplAggregates.cpp b/lib/Transforms/Scalar/ScalarReplAggregates.cpp index 113397fc11..a6c3a5e3e9 100644 --- a/lib/Transforms/Scalar/ScalarReplAggregates.cpp +++ b/lib/Transforms/Scalar/ScalarReplAggregates.cpp @@ -1764,6 +1764,12 @@ bool SROA::TypeHasComponent(Type *T, uint64_t Offset, uint64_t Size) { if (Offset >= AT->getNumElements() * EltSize) return false; Offset %= EltSize; + } else if (VectorType *VT = dyn_cast<VectorType>(T)) { + EltTy = VT->getElementType(); + EltSize = TD->getTypeAllocSize(EltTy); + if (Offset >= VT->getNumElements() * EltSize) + return false; + Offset %= EltSize; } else { return false; } @@ -1931,9 +1937,16 @@ uint64_t SROA::FindElementAndOffset(Type *&T, uint64_t &Offset, Offset -= Layout->getElementOffset(Idx); IdxTy = Type::getInt32Ty(T->getContext()); return Idx; + } else if (ArrayType *AT = dyn_cast<ArrayType>(T)) { + T = AT->getElementType(); + uint64_t EltSize = TD->getTypeAllocSize(T); + Idx = Offset / EltSize; + Offset -= Idx * EltSize; + IdxTy = Type::getInt64Ty(T->getContext()); + return Idx; } - ArrayType *AT = cast<ArrayType>(T); - T = AT->getElementType(); + VectorType *VT = cast<VectorType>(T); + T = VT->getElementType(); uint64_t EltSize = TD->getTypeAllocSize(T); Idx = Offset / EltSize; Offset -= Idx * EltSize; |