diff options
author | Mehdi Amini <mehdi.amini@apple.com> | 2015-01-14 05:33:01 +0000 |
---|---|---|
committer | Mehdi Amini <mehdi.amini@apple.com> | 2015-01-14 05:33:01 +0000 |
commit | 8923cc5470a1a6c728c800a409d1c6c86d52825a (patch) | |
tree | 56089b2fdf800645dc970b329c3a6932f1fcd790 /llvm/lib | |
parent | eeea8970b4b12b5493d603ceff960e4b19296c1f (diff) | |
download | llvm-8923cc5470a1a6c728c800a409d1c6c86d52825a.zip llvm-8923cc5470a1a6c728c800a409d1c6c86d52825a.tar.gz llvm-8923cc5470a1a6c728c800a409d1c6c86d52825a.tar.bz2 |
Fold a loop for array processing in ComputeLinearIndex
When processing an array, every Elt has the same layout, it is
useless to recursively call each ComputeLinearIndex on each element.
Just do it once and multiply by the number of elements.
Differential Revision: http://reviews.llvm.org/D6832
llvm-svn: 225949
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/CodeGen/Analysis.cpp | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/llvm/lib/CodeGen/Analysis.cpp b/llvm/lib/CodeGen/Analysis.cpp index 9a3b790..06826b6 100644 --- a/llvm/lib/CodeGen/Analysis.cpp +++ b/llvm/lib/CodeGen/Analysis.cpp @@ -30,10 +30,9 @@ using namespace llvm; -/// ComputeLinearIndex - Given an LLVM IR aggregate type and a sequence -/// of insertvalue or extractvalue indices that identify a member, return -/// the linearized index of the start of the member. -/// +/// Compute the linearized index of a member in a nested aggregate/struct/array +/// by recursing and accumulating CurIndex as long as there are indices in the +/// index list. unsigned llvm::ComputeLinearIndex(Type *Ty, const unsigned *Indices, const unsigned *IndicesEnd, @@ -57,11 +56,17 @@ unsigned llvm::ComputeLinearIndex(Type *Ty, // Given an array type, recursively traverse the elements. else if (ArrayType *ATy = dyn_cast<ArrayType>(Ty)) { Type *EltTy = ATy->getElementType(); - for (unsigned i = 0, e = ATy->getNumElements(); i != e; ++i) { - if (Indices && *Indices == i) - return ComputeLinearIndex(EltTy, Indices+1, IndicesEnd, CurIndex); - CurIndex = ComputeLinearIndex(EltTy, nullptr, nullptr, CurIndex); + unsigned NumElts = ATy->getNumElements(); + // Compute the Linear offset when jumping one element of the array + unsigned EltLinearOffset = ComputeLinearIndex(EltTy, nullptr, nullptr, 0); + if (Indices && *Indices < NumElts) { + // If the indice is inside the array, compute the index to the requested + // elt and recurse inside the element with the end of the indices list + CurIndex += EltLinearOffset* *Indices; + return ComputeLinearIndex(EltTy, Indices+1, IndicesEnd, CurIndex); } + // Out of bound? Assert instead? + CurIndex += EltLinearOffset*NumElts; return CurIndex; } // We haven't found the type we're looking for, so keep searching. |