mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-24 06:30:19 +00:00
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:
parent
65c6795af4
commit
8f36f6d117
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user