mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-24 20:44:51 +00:00
Simplify the ComputeLinearIndex logic and fix a few bugs.
llvm-svn: 52516
This commit is contained in:
parent
d61d67b75c
commit
826ad19523
@ -100,37 +100,31 @@ static unsigned ComputeLinearIndex(const TargetLowering &TLI, const Type *Ty,
|
||||
const unsigned *IndicesEnd,
|
||||
unsigned CurIndex = 0) {
|
||||
// Base case: We're done.
|
||||
if (Indices == IndicesEnd)
|
||||
if (Indices && Indices == IndicesEnd)
|
||||
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.
|
||||
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();
|
||||
EI != EE; ++EI) {
|
||||
CurIndex = ComputeLinearIndex(TLI, *EI, Indices+1, IndicesEnd,
|
||||
~CurIndex);
|
||||
if ((int)CurIndex >= 0)
|
||||
return CurIndex;
|
||||
if (Indices && *Indices == unsigned(EI - EB))
|
||||
return ComputeLinearIndex(TLI, *EI, Indices+1, IndicesEnd, CurIndex);
|
||||
CurIndex = ComputeLinearIndex(TLI, *EI, 0, 0, CurIndex);
|
||||
}
|
||||
}
|
||||
// Given an array type, recursively traverse the elements.
|
||||
else if (const ArrayType *ATy = dyn_cast<ArrayType>(Ty)) {
|
||||
const Type *EltTy = ATy->getElementType();
|
||||
for (unsigned i = 0, e = ATy->getNumElements(); i != e; ++i) {
|
||||
CurIndex = ComputeLinearIndex(TLI, EltTy, Indices+1, IndicesEnd,
|
||||
~CurIndex);
|
||||
if ((int)CurIndex >= 0)
|
||||
return CurIndex;
|
||||
if (Indices && *Indices == i)
|
||||
return ComputeLinearIndex(TLI, EltTy, Indices+1, IndicesEnd, CurIndex);
|
||||
CurIndex = ComputeLinearIndex(TLI, EltTy, 0, 0, CurIndex);
|
||||
}
|
||||
}
|
||||
// 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
|
||||
|
Loading…
Reference in New Issue
Block a user