diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-05-14 15:12:37 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-05-14 15:12:37 +0000 |
commit | 31d938a6b1173c642f975d78417459d4d8cd3677 (patch) | |
tree | 18f62b5d9a05732c5bd7870325f3c75c6ca8ffba /utils/TableGen/CodeGenRegisters.cpp | |
parent | b81cbc271faed9fa633920436cd7ae49750a9a42 (diff) |
Record the ad hoc aliasing graph in CodeGenRegister.
The ad hoc aliasing specified in the 'Aliases' list in .td files is
currently only used by computeOverlaps(). It will soon be needed to
build accurate register units as well, so build the undirected graph in
CodeGenRegister::buildObjectGraph() instead.
Aliasing is a symmetric relationship with only one direction specified
in the .td files. Make sure both directions are represented in
getExplicitAliases().
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@156762 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/CodeGenRegisters.cpp')
-rw-r--r-- | utils/TableGen/CodeGenRegisters.cpp | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/utils/TableGen/CodeGenRegisters.cpp b/utils/TableGen/CodeGenRegisters.cpp index 499292a196..797c31a934 100644 --- a/utils/TableGen/CodeGenRegisters.cpp +++ b/utils/TableGen/CodeGenRegisters.cpp @@ -108,6 +108,15 @@ void CodeGenRegister::buildObjectGraph(CodeGenRegBank &RegBank) { // This is used by computeSecondarySubRegs() to find candidates. if (CoveredBySubRegs && !ExplicitSubRegs.empty()) ExplicitSubRegs.front()->LeadingSuperRegs.push_back(this); + + // Add ad hoc alias links. This is a symmetric relationship betwen two + // registers, so build a symmetric graph by adding links in both ends. + std::vector<Record*> Aliases = TheDef->getValueAsListOfDefs("Aliases"); + for (unsigned i = 0, e = Aliases.size(); i != e; ++i) { + CodeGenRegister *Reg = RegBank.getReg(Aliases[i]); + ExplicitAliases.push_back(Reg); + Reg->ExplicitAliases.push_back(this); + } } const std::string &CodeGenRegister::getName() const { @@ -1529,16 +1538,13 @@ computeOverlaps(std::map<const CodeGenRegister*, CodeGenRegister::Set> &Map) { Overlaps.insert(Supers.begin(), Supers.end()); // Form symmetrical relations from the special Aliases[] lists. - std::vector<Record*> RegList = Reg->TheDef->getValueAsListOfDefs("Aliases"); + ArrayRef<CodeGenRegister*> RegList = Reg->getExplicitAliases(); for (unsigned i2 = 0, e2 = RegList.size(); i2 != e2; ++i2) { - CodeGenRegister *Reg2 = getReg(RegList[i2]); - CodeGenRegister::Set &Overlaps2 = Map[Reg2]; + CodeGenRegister *Reg2 = RegList[i2]; const CodeGenRegister::SuperRegList &Supers2 = Reg2->getSuperRegs(); // Reg overlaps Reg2 which implies it overlaps supers(Reg2). Overlaps.insert(Reg2); Overlaps.insert(Supers2.begin(), Supers2.end()); - Overlaps2.insert(Reg); - Overlaps2.insert(Supers.begin(), Supers.end()); } } |