getCommonSubClass() - Calculate the largest common sub-class of two register

classes.

This is implemented as a function rather than a method on TargetRegisterClass
because it is symmetric in its arguments.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@70512 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jakob Stoklund Olesen
2009-04-30 21:23:32 +00:00
parent 7afcc6aa27
commit ba67d87fe4
2 changed files with 46 additions and 0 deletions

View File

@@ -100,3 +100,45 @@ TargetRegisterInfo::getInitialFrameState(std::vector<MachineMove> &Moves) const
// Default is to do nothing.
}
const TargetRegisterClass *
llvm::getCommonSubClass(const TargetRegisterClass *A,
const TargetRegisterClass *B) {
// First take care of the trivial cases
if (A == B)
return A;
if (!A || !B)
return 0;
// If B is a subclass of A, it will be handled in the loop below
if (B->hasSubClass(A))
return A;
const TargetRegisterClass *Best = 0;
for (TargetRegisterClass::sc_iterator I = A->subclasses_begin();
const TargetRegisterClass *X = *I; ++I) {
if (X == B)
return B; // B is a subclass of A
// X must be a common subclass of A and B
if (!B->hasSubClass(X))
continue;
// A superclass is definitely better.
if (!Best || Best->hasSuperClass(X)) {
Best = X;
continue;
}
// A subclass is definitely worse
if (Best->hasSubClass(X))
continue;
// Best and *I have no super/sub class relation - pick the larger class, or
// the smaller spill size.
int nb = std::distance(Best->begin(), Best->end());
int ni = std::distance(X->begin(), X->end());
if (ni>nb || (ni==nb && X->getSize() < Best->getSize()))
Best = X;
}
return Best;
}