mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-14 17:34:41 +00:00
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:
parent
7afcc6aa27
commit
ba67d87fe4
@ -254,6 +254,10 @@ public:
|
||||
int getCopyCost() const { return CopyCost; }
|
||||
};
|
||||
|
||||
/// getCommonSubClass - find the largest common subclass of A and B. Return NULL
|
||||
/// if there is no common subclass.
|
||||
const TargetRegisterClass *getCommonSubClass(const TargetRegisterClass *A,
|
||||
const TargetRegisterClass *B);
|
||||
|
||||
/// TargetRegisterInfo base class - We assume that the target defines a static
|
||||
/// array of TargetRegisterDesc objects that represent all of the machine
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user