From 31d938a6b1173c642f975d78417459d4d8cd3677 Mon Sep 17 00:00:00 2001 From: Jakob Stoklund Olesen Date: Mon, 14 May 2012 15:12:37 +0000 Subject: 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 --- utils/TableGen/CodeGenRegisters.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'utils/TableGen/CodeGenRegisters.cpp') 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 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 &Map) { Overlaps.insert(Supers.begin(), Supers.end()); // Form symmetrical relations from the special Aliases[] lists. - std::vector RegList = Reg->TheDef->getValueAsListOfDefs("Aliases"); + ArrayRef 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()); } } -- cgit v1.2.3