Modify getRegisterValueType() to allow for a register being in mutliple

register classes. Before, MVT::Other would be returned anytime a reg was
in multiple register classes. Now, MVT::Other is only returned if the types
for those register classes differ.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@67714 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jim Grosbach 2009-03-25 23:28:33 +00:00
parent e597282fe5
commit 54f302272c

View File

@ -175,12 +175,33 @@ struct PatternSortingPredicate {
}
};
/// getRegisterValueType - Look up and return the first ValueType of specified
/// RegisterClass record
/// getRegisterValueType - Look up and return the ValueType of the specified
/// register. If the register is a member of multiple register classes which
/// have different associated types, return MVT::Other.
static MVT::SimpleValueType getRegisterValueType(Record *R, const CodeGenTarget &T) {
if (const CodeGenRegisterClass *RC = T.getRegisterClassForRegister(R))
return RC->getValueTypeNum(0);
return MVT::Other;
int FoundRC = 0;
MVT::SimpleValueType VT = MVT::Other;
const std::vector<CodeGenRegisterClass> &RCs = T.getRegisterClasses();
std::vector<CodeGenRegisterClass>::const_iterator RC;
std::vector<Record*>::const_iterator Element;
for (RC = RCs.begin() ; RC != RCs.end() ; RC++) {
Element = find((*RC).Elements.begin(), (*RC).Elements.end(), R);
if (Element != (*RC).Elements.end()) {
if (!FoundRC) {
FoundRC = 1;
VT = (*RC).getValueTypeNum(0);
} else {
// In multiple RC's
if (VT != (*RC).getValueTypeNum(0)) {
// Types of the RC's do not agree. Return MVT::Other. The
// target is responsible for handling this.
return MVT::Other;
}
}
}
}
return VT;
}