Simplify the ComputeLinearIndex logic and fix a few bugs.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52516 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Dan Gohman 2008-06-20 00:53:00 +00:00
parent 65c6795af4
commit 8f36f6d117

View File

@ -100,37 +100,31 @@ static unsigned ComputeLinearIndex(const TargetLowering &TLI, const Type *Ty,
const unsigned *IndicesEnd, const unsigned *IndicesEnd,
unsigned CurIndex = 0) { unsigned CurIndex = 0) {
// Base case: We're done. // Base case: We're done.
if (Indices == IndicesEnd) if (Indices && Indices == IndicesEnd)
return CurIndex; return CurIndex;
// Otherwise we need to recurse. A non-negative value is used to
// indicate the final result value; a negative value carries the
// complemented position to continue the search.
CurIndex = ~CurIndex;
// Given a struct type, recursively traverse the elements. // Given a struct type, recursively traverse the elements.
if (const StructType *STy = dyn_cast<StructType>(Ty)) { if (const StructType *STy = dyn_cast<StructType>(Ty)) {
for (StructType::element_iterator EI = STy->element_begin(), for (StructType::element_iterator EB = STy->element_begin(),
EI = EB,
EE = STy->element_end(); EE = STy->element_end();
EI != EE; ++EI) { EI != EE; ++EI) {
CurIndex = ComputeLinearIndex(TLI, *EI, Indices+1, IndicesEnd, if (Indices && *Indices == unsigned(EI - EB))
~CurIndex); return ComputeLinearIndex(TLI, *EI, Indices+1, IndicesEnd, CurIndex);
if ((int)CurIndex >= 0) CurIndex = ComputeLinearIndex(TLI, *EI, 0, 0, CurIndex);
return CurIndex;
} }
} }
// Given an array type, recursively traverse the elements. // Given an array type, recursively traverse the elements.
else if (const ArrayType *ATy = dyn_cast<ArrayType>(Ty)) { else if (const ArrayType *ATy = dyn_cast<ArrayType>(Ty)) {
const Type *EltTy = ATy->getElementType(); const Type *EltTy = ATy->getElementType();
for (unsigned i = 0, e = ATy->getNumElements(); i != e; ++i) { for (unsigned i = 0, e = ATy->getNumElements(); i != e; ++i) {
CurIndex = ComputeLinearIndex(TLI, EltTy, Indices+1, IndicesEnd, if (Indices && *Indices == i)
~CurIndex); return ComputeLinearIndex(TLI, EltTy, Indices+1, IndicesEnd, CurIndex);
if ((int)CurIndex >= 0) CurIndex = ComputeLinearIndex(TLI, EltTy, 0, 0, CurIndex);
return CurIndex;
} }
} }
// We haven't found the type we're looking for, so keep searching. // We haven't found the type we're looking for, so keep searching.
return CurIndex; return CurIndex + 1;
} }
/// ComputeValueVTs - Given an LLVM IR type, compute a sequence of /// ComputeValueVTs - Given an LLVM IR type, compute a sequence of