diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-12-19 16:53:34 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-12-19 16:53:34 +0000 |
commit | 570f9a972e02830d1ca223743dd6b4cc4fdf9549 (patch) | |
tree | ff67aae70fb2690c391b75f7ec47ff5a4fc5c55c /utils/TableGen/CodeGenRegisters.cpp | |
parent | a9f65b9a1f57dcf546399ac32bf89d71d20df5b9 (diff) | |
download | llvm-570f9a972e02830d1ca223743dd6b4cc4fdf9549.tar.gz llvm-570f9a972e02830d1ca223743dd6b4cc4fdf9549.tar.bz2 llvm-570f9a972e02830d1ca223743dd6b4cc4fdf9549.tar.xz |
Emit a getMatchingSuperRegClass() implementation for every target.
Use information computed while inferring new register classes to emit
accurate, table-driven implementations of getMatchingSuperRegClass().
Delete the old manual, error-prone implementations in the targets.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@146873 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/CodeGenRegisters.cpp')
-rw-r--r-- | utils/TableGen/CodeGenRegisters.cpp | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/utils/TableGen/CodeGenRegisters.cpp b/utils/TableGen/CodeGenRegisters.cpp index 8ff24fd361..e0239912dc 100644 --- a/utils/TableGen/CodeGenRegisters.cpp +++ b/utils/TableGen/CodeGenRegisters.cpp @@ -504,6 +504,18 @@ void CodeGenRegisterClass::computeSubClasses(CodeGenRegBank &RegBank) { RegClasses[rci]->inheritProperties(RegBank); } +void +CodeGenRegisterClass::getSuperRegClasses(Record *SubIdx, BitVector &Out) const { + DenseMap<Record*, SmallPtrSet<CodeGenRegisterClass*, 8> >::const_iterator + FindI = SuperRegClasses.find(SubIdx); + if (FindI == SuperRegClasses.end()) + return; + for (SmallPtrSet<CodeGenRegisterClass*, 8>::const_iterator I = + FindI->second.begin(), E = FindI->second.end(); I != E; ++I) + Out.set((*I)->EnumValue); +} + + //===----------------------------------------------------------------------===// // CodeGenRegBank //===----------------------------------------------------------------------===// @@ -879,8 +891,10 @@ void CodeGenRegBank::inferMatchingSuperRegClass(CodeGenRegisterClass *RC, if (SubSet.empty()) continue; // RC injects completely into SubRC. - if (SubSet.size() == SSPairs.size()) + if (SubSet.size() == SSPairs.size()) { + SubRC->addSuperRegClass(SubIdx, RC); continue; + } // Only a subset of RC maps into SubRC. Make sure it is represented by a // class. getOrCreateSubClass(RC, &SubSet, RC->getName() + |