CodeGenRegisters.cpp revision 31867660cb81ea2b1d1a6ffa7d09c91acb754a8b
1f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen//===- CodeGenRegisters.cpp - Register and RegisterClass Info -------------===//
2f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen//
3f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen//                     The LLVM Compiler Infrastructure
4f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen//
5f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen// This file is distributed under the University of Illinois Open Source
6f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen// License. See LICENSE.TXT for details.
7f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen//
8f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen//===----------------------------------------------------------------------===//
9f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen//
10f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen// This file defines structures to encapsulate information gleaned from the
11f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen// target register and register class definitions.
12f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen//
13f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen//===----------------------------------------------------------------------===//
14f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen
15f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen#include "CodeGenRegisters.h"
16f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen#include "CodeGenTarget.h"
177c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne#include "llvm/TableGen/Error.h"
18b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen#include "llvm/ADT/SmallVector.h"
197dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen#include "llvm/ADT/STLExtras.h"
20f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen#include "llvm/ADT/StringExtras.h"
21f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen
22f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesenusing namespace llvm;
23f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen
24f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen//===----------------------------------------------------------------------===//
25f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen//                              CodeGenRegister
26f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen//===----------------------------------------------------------------------===//
27f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen
28b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund OlesenCodeGenRegister::CodeGenRegister(Record *R, unsigned Enum)
29b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  : TheDef(R),
30b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    EnumValue(Enum),
31b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    CostPerUse(R->getValueAsInt("CostPerUse")),
3231867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen    CoveredBySubRegs(R->getValueAsBit("CoveredBySubRegs")),
33b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    SubRegsComplete(false)
34b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen{}
35f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen
36f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesenconst std::string &CodeGenRegister::getName() const {
37f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen  return TheDef->getName();
38f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen}
39f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen
40b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesennamespace {
41b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  struct Orphan {
42b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    CodeGenRegister *SubReg;
43b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    Record *First, *Second;
44b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    Orphan(CodeGenRegister *r, Record *a, Record *b)
45b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen      : SubReg(r), First(a), Second(b) {}
46b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  };
47b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen}
48b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen
49b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesenconst CodeGenRegister::SubRegMap &
50b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund OlesenCodeGenRegister::getSubRegs(CodeGenRegBank &RegBank) {
51b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  // Only compute this map once.
52b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  if (SubRegsComplete)
53b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    return SubRegs;
54b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  SubRegsComplete = true;
55b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen
56b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  std::vector<Record*> SubList = TheDef->getValueAsListOfDefs("SubRegs");
57b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  std::vector<Record*> Indices = TheDef->getValueAsListOfDefs("SubRegIndices");
58b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  if (SubList.size() != Indices.size())
59b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    throw TGError(TheDef->getLoc(), "Register " + getName() +
60b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen                  " SubRegIndices doesn't match SubRegs");
61b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen
62b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  // First insert the direct subregs and make sure they are fully indexed.
63b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  for (unsigned i = 0, e = SubList.size(); i != e; ++i) {
64b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    CodeGenRegister *SR = RegBank.getReg(SubList[i]);
65b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    if (!SubRegs.insert(std::make_pair(Indices[i], SR)).second)
66b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen      throw TGError(TheDef->getLoc(), "SubRegIndex " + Indices[i]->getName() +
67b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen                    " appears twice in Register " + getName());
68b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  }
69b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen
70b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  // Keep track of inherited subregs and how they can be reached.
71b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  SmallVector<Orphan, 8> Orphans;
72b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen
73b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  // Clone inherited subregs and place duplicate entries on Orphans.
74b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  // Here the order is important - earlier subregs take precedence.
75b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  for (unsigned i = 0, e = SubList.size(); i != e; ++i) {
76b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    CodeGenRegister *SR = RegBank.getReg(SubList[i]);
77b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    const SubRegMap &Map = SR->getSubRegs(RegBank);
78026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen
79026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    // Add this as a super-register of SR now all sub-registers are in the list.
80026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    // This creates a topological ordering, the exact order depends on the
81026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    // order getSubRegs is called on all registers.
82026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    SR->SuperRegs.push_back(this);
83026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen
84b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    for (SubRegMap::const_iterator SI = Map.begin(), SE = Map.end(); SI != SE;
85026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen         ++SI) {
86b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen      if (!SubRegs.insert(*SI).second)
87b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen        Orphans.push_back(Orphan(SI->second, Indices[i], SI->first));
88026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen
89026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen      // Noop sub-register indexes are possible, so avoid duplicates.
90026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen      if (SI->second != SR)
91026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen        SI->second->SuperRegs.push_back(this);
92026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    }
93b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  }
94b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen
95b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  // Process the composites.
9605bce0beee87512e52428d4b80f5a8e79a949576David Greene  ListInit *Comps = TheDef->getValueAsListInit("CompositeIndices");
97b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  for (unsigned i = 0, e = Comps->size(); i != e; ++i) {
9805bce0beee87512e52428d4b80f5a8e79a949576David Greene    DagInit *Pat = dynamic_cast<DagInit*>(Comps->getElement(i));
99b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    if (!Pat)
100b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen      throw TGError(TheDef->getLoc(), "Invalid dag '" +
101b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen                    Comps->getElement(i)->getAsString() +
102b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen                    "' in CompositeIndices");
10305bce0beee87512e52428d4b80f5a8e79a949576David Greene    DefInit *BaseIdxInit = dynamic_cast<DefInit*>(Pat->getOperator());
104b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    if (!BaseIdxInit || !BaseIdxInit->getDef()->isSubClassOf("SubRegIndex"))
105b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen      throw TGError(TheDef->getLoc(), "Invalid SubClassIndex in " +
106b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen                    Pat->getAsString());
107b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen
108b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    // Resolve list of subreg indices into R2.
109b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    CodeGenRegister *R2 = this;
110b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    for (DagInit::const_arg_iterator di = Pat->arg_begin(),
111b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen         de = Pat->arg_end(); di != de; ++di) {
11205bce0beee87512e52428d4b80f5a8e79a949576David Greene      DefInit *IdxInit = dynamic_cast<DefInit*>(*di);
113b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen      if (!IdxInit || !IdxInit->getDef()->isSubClassOf("SubRegIndex"))
114b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen        throw TGError(TheDef->getLoc(), "Invalid SubClassIndex in " +
115b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen                      Pat->getAsString());
116b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen      const SubRegMap &R2Subs = R2->getSubRegs(RegBank);
117b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen      SubRegMap::const_iterator ni = R2Subs.find(IdxInit->getDef());
118b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen      if (ni == R2Subs.end())
119b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen        throw TGError(TheDef->getLoc(), "Composite " + Pat->getAsString() +
120b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen                      " refers to bad index in " + R2->getName());
121b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen      R2 = ni->second;
122b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    }
123b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen
124b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    // Insert composite index. Allow overriding inherited indices etc.
125b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    SubRegs[BaseIdxInit->getDef()] = R2;
126b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen
127b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    // R2 is no longer an orphan.
128b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    for (unsigned j = 0, je = Orphans.size(); j != je; ++j)
129b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen      if (Orphans[j].SubReg == R2)
130b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen          Orphans[j].SubReg = 0;
131b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  }
132b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen
133b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  // Now Orphans contains the inherited subregisters without a direct index.
134b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  // Create inferred indexes for all missing entries.
135b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  for (unsigned i = 0, e = Orphans.size(); i != e; ++i) {
136b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    Orphan &O = Orphans[i];
137b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    if (!O.SubReg)
138b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen      continue;
139b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    SubRegs[RegBank.getCompositeSubRegIndex(O.First, O.Second, true)] =
140b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen      O.SubReg;
141b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  }
142b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  return SubRegs;
143b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen}
144b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen
145026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesenvoid
146026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund OlesenCodeGenRegister::addSubRegsPreOrder(SetVector<CodeGenRegister*> &OSet) const {
147026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen  assert(SubRegsComplete && "Must precompute sub-registers");
148026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen  std::vector<Record*> Indices = TheDef->getValueAsListOfDefs("SubRegIndices");
149026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen  for (unsigned i = 0, e = Indices.size(); i != e; ++i) {
150026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    CodeGenRegister *SR = SubRegs.find(Indices[i])->second;
151026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    if (OSet.insert(SR))
152026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen      SR->addSubRegsPreOrder(OSet);
153026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen  }
154026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen}
155026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen
156f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen//===----------------------------------------------------------------------===//
1574ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen//                               RegisterTuples
1584ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen//===----------------------------------------------------------------------===//
1594ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen
1604ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen// A RegisterTuples def is used to generate pseudo-registers from lists of
1614ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen// sub-registers. We provide a SetTheory expander class that returns the new
1624ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen// registers.
1634ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesennamespace {
1644ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesenstruct TupleExpander : SetTheory::Expander {
1654ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen  void expand(SetTheory &ST, Record *Def, SetTheory::RecSet &Elts) {
1664ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen    std::vector<Record*> Indices = Def->getValueAsListOfDefs("SubRegIndices");
1674ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen    unsigned Dim = Indices.size();
16805bce0beee87512e52428d4b80f5a8e79a949576David Greene    ListInit *SubRegs = Def->getValueAsListInit("SubRegs");
1694ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen    if (Dim != SubRegs->getSize())
1704ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen      throw TGError(Def->getLoc(), "SubRegIndices and SubRegs size mismatch");
1714ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen    if (Dim < 2)
1724ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen      throw TGError(Def->getLoc(), "Tuples must have at least 2 sub-registers");
1734ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen
1744ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen    // Evaluate the sub-register lists to be zipped.
1754ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen    unsigned Length = ~0u;
1764ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen    SmallVector<SetTheory::RecSet, 4> Lists(Dim);
1774ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen    for (unsigned i = 0; i != Dim; ++i) {
1784ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen      ST.evaluate(SubRegs->getElement(i), Lists[i]);
1794ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen      Length = std::min(Length, unsigned(Lists[i].size()));
1804ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen    }
1814ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen
1824ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen    if (Length == 0)
1834ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen      return;
1844ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen
1854ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen    // Precompute some types.
1864ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen    Record *RegisterCl = Def->getRecords().getClass("Register");
18777f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen    RecTy *RegisterRecTy = RecordRecTy::get(RegisterCl);
18805bce0beee87512e52428d4b80f5a8e79a949576David Greene    StringInit *BlankName = StringInit::get("");
1894ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen
1904ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen    // Zip them up.
1914ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen    for (unsigned n = 0; n != Length; ++n) {
1924ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen      std::string Name;
1934ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen      Record *Proto = Lists[0][n];
19405bce0beee87512e52428d4b80f5a8e79a949576David Greene      std::vector<Init*> Tuple;
1954ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen      unsigned CostPerUse = 0;
1964ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen      for (unsigned i = 0; i != Dim; ++i) {
1974ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen        Record *Reg = Lists[i][n];
1984ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen        if (i) Name += '_';
1994ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen        Name += Reg->getName();
20077f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen        Tuple.push_back(DefInit::get(Reg));
2014ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen        CostPerUse = std::max(CostPerUse,
2024ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen                              unsigned(Reg->getValueAsInt("CostPerUse")));
2034ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen      }
2044ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen
2054ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen      // Create a new Record representing the synthesized register. This record
2064ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen      // is only for consumption by CodeGenRegister, it is not added to the
2074ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen      // RecordKeeper.
2084ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen      Record *NewReg = new Record(Name, Def->getLoc(), Def->getRecords());
2094ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen      Elts.insert(NewReg);
2104ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen
2114ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen      // Copy Proto super-classes.
2124ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen      for (unsigned i = 0, e = Proto->getSuperClasses().size(); i != e; ++i)
2134ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen        NewReg->addSuperClass(Proto->getSuperClasses()[i]);
2144ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen
2154ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen      // Copy Proto fields.
2164ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen      for (unsigned i = 0, e = Proto->getValues().size(); i != e; ++i) {
2174ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen        RecordVal RV = Proto->getValues()[i];
2184ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen
21931867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen        // Skip existing fields, like NAME.
22031867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen        if (NewReg->getValue(RV.getNameInit()))
221794481d5ca75c1e614625f8a9487b8fa9db9d4d8Jakob Stoklund Olesen          continue;
222794481d5ca75c1e614625f8a9487b8fa9db9d4d8Jakob Stoklund Olesen
22331867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen        StringRef Field = RV.getName();
22431867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen
2254ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen        // Replace the sub-register list with Tuple.
22631867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen        if (Field == "SubRegs")
227dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene          RV.setValue(ListInit::get(Tuple, RegisterRecTy));
2284ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen
2294ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen        // Provide a blank AsmName. MC hacks are required anyway.
23031867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen        if (Field == "AsmName")
2314ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen          RV.setValue(BlankName);
2324ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen
2334ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen        // CostPerUse is aggregated from all Tuple members.
23431867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen        if (Field == "CostPerUse")
235dcd35c797d458d8b1dbc36cf7f1504166d5b2f16David Greene          RV.setValue(IntInit::get(CostPerUse));
2364ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen
23731867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen        // Composite registers are always covered by sub-registers.
23831867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen        if (Field == "CoveredBySubRegs")
23931867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen          RV.setValue(BitInit::get(true));
24031867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen
2414ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen        // Copy fields from the RegisterTuples def.
24231867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen        if (Field == "SubRegIndices" ||
24331867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen            Field == "CompositeIndices") {
24431867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen          NewReg->addValue(*Def->getValue(Field));
2454ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen          continue;
2464ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen        }
2474ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen
2484ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen        // Some fields get their default uninitialized value.
24931867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen        if (Field == "DwarfNumbers" ||
25031867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen            Field == "DwarfAlias" ||
25131867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen            Field == "Aliases") {
25231867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen          if (const RecordVal *DefRV = RegisterCl->getValue(Field))
2539b718e88642963bfb519c47b70d1daf5d2126325Jakob Stoklund Olesen            NewReg->addValue(*DefRV);
2544ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen          continue;
2554ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen        }
2564ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen
2574ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen        // Everything else is copied from Proto.
2584ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen        NewReg->addValue(RV);
2594ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen      }
2604ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen    }
2614ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen  }
2624ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen};
2634ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen}
2644ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen
2654ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen//===----------------------------------------------------------------------===//
266f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen//                            CodeGenRegisterClass
267f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen//===----------------------------------------------------------------------===//
268f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen
269ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund OlesenCodeGenRegisterClass::CodeGenRegisterClass(CodeGenRegBank &RegBank, Record *R)
2706fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen  : TheDef(R), Name(R->getName()), EnumValue(-1) {
271f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen  // Rename anonymous register classes.
272f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen  if (R->getName().size() > 9 && R->getName()[9] == '.') {
273f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen    static unsigned AnonCounter = 0;
274f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen    R->setName("AnonRegClass_"+utostr(AnonCounter++));
275f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen  }
276f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen
277f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen  std::vector<Record*> TypeList = R->getValueAsListOfDefs("RegTypes");
278f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen  for (unsigned i = 0, e = TypeList.size(); i != e; ++i) {
279f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen    Record *Type = TypeList[i];
280f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen    if (!Type->isSubClassOf("ValueType"))
281f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen      throw "RegTypes list member '" + Type->getName() +
282f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen        "' does not derive from the ValueType class!";
283f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen    VTs.push_back(getValueType(Type));
284f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen  }
285f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen  assert(!VTs.empty() && "RegisterClass must contain at least one ValueType!");
286f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen
287cc0c975b7db95ce6bc865c56a3016bf0d4f83304Jakob Stoklund Olesen  // Allocation order 0 is the full set. AltOrders provides others.
288cc0c975b7db95ce6bc865c56a3016bf0d4f83304Jakob Stoklund Olesen  const SetTheory::RecVec *Elements = RegBank.getSets().expand(R);
289cc0c975b7db95ce6bc865c56a3016bf0d4f83304Jakob Stoklund Olesen  ListInit *AltOrders = R->getValueAsListInit("AltOrders");
290cc0c975b7db95ce6bc865c56a3016bf0d4f83304Jakob Stoklund Olesen  Orders.resize(1 + AltOrders->size());
291cc0c975b7db95ce6bc865c56a3016bf0d4f83304Jakob Stoklund Olesen
292b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen  // Default allocation order always contains all registers.
293cc0c975b7db95ce6bc865c56a3016bf0d4f83304Jakob Stoklund Olesen  for (unsigned i = 0, e = Elements->size(); i != e; ++i) {
294cc0c975b7db95ce6bc865c56a3016bf0d4f83304Jakob Stoklund Olesen    Orders[0].push_back((*Elements)[i]);
29559f26aadce1bb985b9befe841fc106c891e1c728Jakob Stoklund Olesen    Members.insert(RegBank.getReg((*Elements)[i]));
296cc0c975b7db95ce6bc865c56a3016bf0d4f83304Jakob Stoklund Olesen  }
297f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen
298b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen  // Alternative allocation orders may be subsets.
299b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen  SetTheory::RecSet Order;
300cc0c975b7db95ce6bc865c56a3016bf0d4f83304Jakob Stoklund Olesen  for (unsigned i = 0, e = AltOrders->size(); i != e; ++i) {
301cc0c975b7db95ce6bc865c56a3016bf0d4f83304Jakob Stoklund Olesen    RegBank.getSets().evaluate(AltOrders->getElement(i), Order);
302cc0c975b7db95ce6bc865c56a3016bf0d4f83304Jakob Stoklund Olesen    Orders[1 + i].append(Order.begin(), Order.end());
303b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen    // Verify that all altorder members are regclass members.
304b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen    while (!Order.empty()) {
305b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen      CodeGenRegister *Reg = RegBank.getReg(Order.back());
306b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen      Order.pop_back();
307b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen      if (!contains(Reg))
308b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen        throw TGError(R->getLoc(), " AltOrder register " + Reg->getName() +
309b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen                      " is not a class member");
310b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen    }
311b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen  }
312b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen
313f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen  // SubRegClasses is a list<dag> containing (RC, subregindex, ...) dags.
31405bce0beee87512e52428d4b80f5a8e79a949576David Greene  ListInit *SRC = R->getValueAsListInit("SubRegClasses");
315f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen  for (ListInit::const_iterator i = SRC->begin(), e = SRC->end(); i != e; ++i) {
31605bce0beee87512e52428d4b80f5a8e79a949576David Greene    DagInit *DAG = dynamic_cast<DagInit*>(*i);
317f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen    if (!DAG) throw "SubRegClasses must contain DAGs";
31805bce0beee87512e52428d4b80f5a8e79a949576David Greene    DefInit *DAGOp = dynamic_cast<DefInit*>(DAG->getOperator());
319f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen    Record *RCRec;
320f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen    if (!DAGOp || !(RCRec = DAGOp->getDef())->isSubClassOf("RegisterClass"))
321f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen      throw "Operator '" + DAG->getOperator()->getAsString() +
322f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen        "' in SubRegClasses is not a RegisterClass";
323f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen    // Iterate over args, all SubRegIndex instances.
324f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen    for (DagInit::const_arg_iterator ai = DAG->arg_begin(), ae = DAG->arg_end();
325f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen         ai != ae; ++ai) {
32605bce0beee87512e52428d4b80f5a8e79a949576David Greene      DefInit *Idx = dynamic_cast<DefInit*>(*ai);
327f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen      Record *IdxRec;
328f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen      if (!Idx || !(IdxRec = Idx->getDef())->isSubClassOf("SubRegIndex"))
329f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen        throw "Argument '" + (*ai)->getAsString() +
330f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen          "' in SubRegClasses is not a SubRegIndex";
331f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen      if (!SubRegClasses.insert(std::make_pair(IdxRec, RCRec)).second)
332f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen        throw "SubRegIndex '" + IdxRec->getName() + "' mentioned twice";
333f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen    }
334f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen  }
335f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen
336f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen  // Allow targets to override the size in bits of the RegisterClass.
337f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen  unsigned Size = R->getValueAsInt("Size");
338f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen
339f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen  Namespace = R->getValueAsString("Namespace");
340f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen  SpillSize = Size ? Size : EVT(VTs[0]).getSizeInBits();
341f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen  SpillAlignment = R->getValueAsInt("Alignment");
342f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen  CopyCost = R->getValueAsInt("CopyCost");
343f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen  Allocatable = R->getValueAsBit("isAllocatable");
3448dd6f0c8353f80de6526810899f271d539f6929cJakob Stoklund Olesen  AltOrderSelect = R->getValueAsString("AltOrderSelect");
345f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen}
346f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen
347babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen// Create an inferred register class that was missing from the .td files.
348babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen// Most properties will be inherited from the closest super-class after the
349babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen// class structure has been computed.
350babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund OlesenCodeGenRegisterClass::CodeGenRegisterClass(StringRef Name, Key Props)
351babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  : Members(*Props.Members),
352babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    TheDef(0),
353babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    Name(Name),
354babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    EnumValue(-1),
355babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    SpillSize(Props.SpillSize),
356babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    SpillAlignment(Props.SpillAlignment),
357babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    CopyCost(0),
358babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    Allocatable(true) {
359babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen}
360babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
361babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen// Compute inherited propertied for a synthesized register class.
362babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesenvoid CodeGenRegisterClass::inheritProperties(CodeGenRegBank &RegBank) {
363babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  assert(!getDef() && "Only synthesized classes can inherit properties");
364babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  assert(!SuperClasses.empty() && "Synthesized class without super class");
365babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
366babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  // The last super-class is the smallest one.
367babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  CodeGenRegisterClass &Super = *SuperClasses.back();
368babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
369babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  // Most properties are copied directly.
370babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  // Exceptions are members, size, and alignment
371babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  Namespace = Super.Namespace;
372babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  VTs = Super.VTs;
373babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  CopyCost = Super.CopyCost;
374babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  Allocatable = Super.Allocatable;
375babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  AltOrderSelect = Super.AltOrderSelect;
376babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
377babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  // Copy all allocation orders, filter out foreign registers from the larger
378babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  // super-class.
379babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  Orders.resize(Super.Orders.size());
380babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  for (unsigned i = 0, ie = Super.Orders.size(); i != ie; ++i)
381babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    for (unsigned j = 0, je = Super.Orders[i].size(); j != je; ++j)
382babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen      if (contains(RegBank.getReg(Super.Orders[i][j])))
383babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen        Orders[i].push_back(Super.Orders[i][j]);
384babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen}
385babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
386ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesenbool CodeGenRegisterClass::contains(const CodeGenRegister *Reg) const {
387ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen  return Members.count(Reg);
388ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen}
389ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen
390babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesennamespace llvm {
391babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  raw_ostream &operator<<(raw_ostream &OS, const CodeGenRegisterClass::Key &K) {
392babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    OS << "{ S=" << K.SpillSize << ", A=" << K.SpillAlignment;
393babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    for (CodeGenRegister::Set::const_iterator I = K.Members->begin(),
394babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen         E = K.Members->end(); I != E; ++I)
395babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen      OS << ", " << (*I)->getName();
396babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    return OS << " }";
397babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  }
398babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen}
399babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
400babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen// This is a simple lexicographical order that can be used to search for sets.
401babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen// It is not the same as the topological order provided by TopoOrderRC.
402babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesenbool CodeGenRegisterClass::Key::
403babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesenoperator<(const CodeGenRegisterClass::Key &B) const {
404babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  assert(Members && B.Members);
405babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  if (*Members != *B.Members)
406babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    return *Members < *B.Members;
407babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  if (SpillSize != B.SpillSize)
408babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    return SpillSize < B.SpillSize;
409babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  return SpillAlignment < B.SpillAlignment;
410babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen}
411babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
412ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen// Returns true if RC is a strict subclass.
413ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen// RC is a sub-class of this class if it is a valid replacement for any
414ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen// instruction operand where a register of this classis required. It must
415ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen// satisfy these conditions:
416ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen//
417ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen// 1. All RC registers are also in this.
418ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen// 2. The RC spill size must not be smaller than our spill size.
419ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen// 3. RC spill alignment must be compatible with ours.
420ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen//
42152e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesenstatic bool testSubClass(const CodeGenRegisterClass *A,
42252e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen                         const CodeGenRegisterClass *B) {
42352e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen  return A->SpillAlignment && B->SpillAlignment % A->SpillAlignment == 0 &&
42452e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen    A->SpillSize <= B->SpillSize &&
42552e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen    std::includes(A->getMembers().begin(), A->getMembers().end(),
42652e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen                  B->getMembers().begin(), B->getMembers().end(),
427c6596e2edc406298ff65d27633bd898613533c0bJakob Stoklund Olesen                  CodeGenRegister::Less());
428ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen}
429ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen
4307dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen/// Sorting predicate for register classes.  This provides a topological
4317dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen/// ordering that arranges all register classes before their sub-classes.
4327dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen///
4337dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen/// Register classes with the same registers, spill size, and alignment form a
4347dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen/// clique.  They will be ordered alphabetically.
4357dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen///
4367dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesenstatic int TopoOrderRC(const void *PA, const void *PB) {
4377dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen  const CodeGenRegisterClass *A = *(const CodeGenRegisterClass* const*)PA;
4387dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen  const CodeGenRegisterClass *B = *(const CodeGenRegisterClass* const*)PB;
4397dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen  if (A == B)
4407dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen    return 0;
4417dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen
442babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  // Order by descending set size.  Note that the classes' allocation order may
443babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  // not have been computed yet.  The Members set is always vaild.
444babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  if (A->getMembers().size() > B->getMembers().size())
4457dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen    return -1;
446babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  if (A->getMembers().size() < B->getMembers().size())
4477dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen    return 1;
4487dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen
4497dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen  // Order by ascending spill size.
4507dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen  if (A->SpillSize < B->SpillSize)
4517dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen    return -1;
4527dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen  if (A->SpillSize > B->SpillSize)
4537dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen    return 1;
4547dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen
4557dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen  // Order by ascending spill alignment.
4567dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen  if (A->SpillAlignment < B->SpillAlignment)
4577dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen    return -1;
4587dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen  if (A->SpillAlignment > B->SpillAlignment)
4597dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen    return 1;
4607dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen
4617dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen  // Finally order by name as a tie breaker.
4627dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen  return A->getName() < B->getName();
4637dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen}
4647dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen
4656fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesenstd::string CodeGenRegisterClass::getQualifiedName() const {
4666fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen  if (Namespace.empty())
4676fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen    return getName();
4686fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen  else
4696fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen    return Namespace + "::" + getName();
470f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen}
471f1e2b23dfabb74249c2f1828dc902bd4bda52aa8Jakob Stoklund Olesen
472203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen// Compute sub-classes of all register classes.
473203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen// Assume the classes are ordered topologically.
474babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesenvoid CodeGenRegisterClass::computeSubClasses(CodeGenRegBank &RegBank) {
475babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  ArrayRef<CodeGenRegisterClass*> RegClasses = RegBank.getRegClasses();
476babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
477203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen  // Visit backwards so sub-classes are seen first.
478203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen  for (unsigned rci = RegClasses.size(); rci; --rci) {
479203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen    CodeGenRegisterClass &RC = *RegClasses[rci - 1];
480203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen    RC.SubClasses.resize(RegClasses.size());
481203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen    RC.SubClasses.set(RC.EnumValue);
482203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen
483203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen    // Normally, all subclasses have IDs >= rci, unless RC is part of a clique.
484203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen    for (unsigned s = rci; s != RegClasses.size(); ++s) {
485203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen      if (RC.SubClasses.test(s))
486203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen        continue;
487203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen      CodeGenRegisterClass *SubRC = RegClasses[s];
48852e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen      if (!testSubClass(&RC, SubRC))
489203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen        continue;
490203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen      // SubRC is a sub-class. Grap all its sub-classes so we won't have to
491203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen      // check them again.
492203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen      RC.SubClasses |= SubRC->SubClasses;
493203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen    }
494203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen
495203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen    // Sweep up missed clique members.  They will be immediately preceeding RC.
49652e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen    for (unsigned s = rci - 1; s && testSubClass(&RC, RegClasses[s - 1]); --s)
497203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen      RC.SubClasses.set(s - 1);
498203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen  }
499f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen
500f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen  // Compute the SuperClasses lists from the SubClasses vectors.
501f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen  for (unsigned rci = 0; rci != RegClasses.size(); ++rci) {
502f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen    const BitVector &SC = RegClasses[rci]->getSubClasses();
503f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen    for (int s = SC.find_first(); s >= 0; s = SC.find_next(s)) {
504f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen      if (unsigned(s) == rci)
505f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen        continue;
506f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen      RegClasses[s]->SuperClasses.push_back(RegClasses[rci]);
507f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen    }
508f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen  }
509babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
510babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  // With the class hierarchy in place, let synthesized register classes inherit
511babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  // properties from their closest super-class. The iteration order here can
512babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  // propagate properties down multiple levels.
513babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  for (unsigned rci = 0; rci != RegClasses.size(); ++rci)
514babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    if (!RegClasses[rci]->getDef())
515babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen      RegClasses[rci]->inheritProperties(RegBank);
516203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen}
517203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen
518570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesenvoid
519570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund OlesenCodeGenRegisterClass::getSuperRegClasses(Record *SubIdx, BitVector &Out) const {
520570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen  DenseMap<Record*, SmallPtrSet<CodeGenRegisterClass*, 8> >::const_iterator
521570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen    FindI = SuperRegClasses.find(SubIdx);
522570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen  if (FindI == SuperRegClasses.end())
523570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen    return;
524570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen  for (SmallPtrSet<CodeGenRegisterClass*, 8>::const_iterator I =
525570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen       FindI->second.begin(), E = FindI->second.end(); I != E; ++I)
526570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen    Out.set((*I)->EnumValue);
527570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen}
528570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen
529570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen
530dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen//===----------------------------------------------------------------------===//
531dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen//                               CodeGenRegBank
532dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen//===----------------------------------------------------------------------===//
533dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen
534dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund OlesenCodeGenRegBank::CodeGenRegBank(RecordKeeper &Records) : Records(Records) {
5354ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen  // Configure register Sets to understand register classes and tuples.
53659f26aadce1bb985b9befe841fc106c891e1c728Jakob Stoklund Olesen  Sets.addFieldExpander("RegisterClass", "MemberList");
537ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen  Sets.addFieldExpander("CalleeSavedRegs", "SaveList");
5384ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen  Sets.addExpander("RegisterTuples", new TupleExpander());
53959f26aadce1bb985b9befe841fc106c891e1c728Jakob Stoklund Olesen
540b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  // Read in the user-defined (named) sub-register indices.
541b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  // More indices will be synthesized later.
542dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen  SubRegIndices = Records.getAllDerivedDefinitions("SubRegIndex");
543dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen  std::sort(SubRegIndices.begin(), SubRegIndices.end(), LessRecord());
544dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen  NumNamedIndices = SubRegIndices.size();
545b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen
546b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  // Read in the register definitions.
547b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  std::vector<Record*> Regs = Records.getAllDerivedDefinitions("Register");
548b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  std::sort(Regs.begin(), Regs.end(), LessRecord());
549b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  Registers.reserve(Regs.size());
550b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  // Assign the enumeration values.
551b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  for (unsigned i = 0, e = Regs.size(); i != e; ++i)
552abdbc84b4ed4276ed3def50f554e3ba156325717Jakob Stoklund Olesen    getReg(Regs[i]);
5537b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen
5544ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen  // Expand tuples and number the new registers.
5554ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen  std::vector<Record*> Tups =
5564ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen    Records.getAllDerivedDefinitions("RegisterTuples");
5574ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen  for (unsigned i = 0, e = Tups.size(); i != e; ++i) {
5584ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen    const std::vector<Record*> *TupRegs = Sets.expand(Tups[i]);
5594ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen    for (unsigned j = 0, je = TupRegs->size(); j != je; ++j)
5604ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen      getReg((*TupRegs)[j]);
5614ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen  }
5624ce25d5d69704a7a4aa4bcecbe4c7345b50b771aJakob Stoklund Olesen
563babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  // Precompute all sub-register maps now all the registers are known.
564babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  // This will create Composite entries for all inferred sub-register indices.
565babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  for (unsigned i = 0, e = Registers.size(); i != e; ++i)
566babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    Registers[i]->getSubRegs(*this);
567babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
5687b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen  // Read in register class definitions.
5697b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen  std::vector<Record*> RCs = Records.getAllDerivedDefinitions("RegisterClass");
5707b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen  if (RCs.empty())
5717b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    throw std::string("No 'RegisterClass' subclasses defined!");
5727b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen
573babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  // Allocate user-defined register classes.
5747b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen  RegClasses.reserve(RCs.size());
575babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  for (unsigned i = 0, e = RCs.size(); i != e; ++i)
576babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    addToMaps(new CodeGenRegisterClass(*this, RCs[i]));
577babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
578babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  // Infer missing classes to create a full algebra.
579babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  computeInferredRegisterClasses();
580babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
5817dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen  // Order register classes topologically and assign enum values.
5827dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen  array_pod_sort(RegClasses.begin(), RegClasses.end(), TopoOrderRC);
5837dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen  for (unsigned i = 0, e = RegClasses.size(); i != e; ++i)
5847dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen    RegClasses[i]->EnumValue = i;
585babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  CodeGenRegisterClass::computeSubClasses(*this);
586dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen}
587dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen
588b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund OlesenCodeGenRegister *CodeGenRegBank::getReg(Record *Def) {
589abdbc84b4ed4276ed3def50f554e3ba156325717Jakob Stoklund Olesen  CodeGenRegister *&Reg = Def2Reg[Def];
590abdbc84b4ed4276ed3def50f554e3ba156325717Jakob Stoklund Olesen  if (Reg)
591b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    return Reg;
592abdbc84b4ed4276ed3def50f554e3ba156325717Jakob Stoklund Olesen  Reg = new CodeGenRegister(Def, Registers.size() + 1);
593abdbc84b4ed4276ed3def50f554e3ba156325717Jakob Stoklund Olesen  Registers.push_back(Reg);
594abdbc84b4ed4276ed3def50f554e3ba156325717Jakob Stoklund Olesen  return Reg;
595b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen}
596b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen
597babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesenvoid CodeGenRegBank::addToMaps(CodeGenRegisterClass *RC) {
598babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  RegClasses.push_back(RC);
599babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
600babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  if (Record *Def = RC->getDef())
601babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen    Def2RC.insert(std::make_pair(Def, RC));
602babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
603babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  // Duplicate classes are rejected by insert().
604babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  // That's OK, we only care about the properties handled by CGRC::Key.
605babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  CodeGenRegisterClass::Key K(*RC);
606babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  Key2RC.insert(std::make_pair(K, RC));
607babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen}
608babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
6091b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen// Create a synthetic sub-class if it is missing.
6101b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund OlesenCodeGenRegisterClass*
6111b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund OlesenCodeGenRegBank::getOrCreateSubClass(const CodeGenRegisterClass *RC,
6121b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen                                    const CodeGenRegister::Set *Members,
6131b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen                                    StringRef Name) {
6141b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen  // Synthetic sub-class has the same size and alignment as RC.
6151b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen  CodeGenRegisterClass::Key K(Members, RC->SpillSize, RC->SpillAlignment);
6161b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen  RCKeyMap::const_iterator FoundI = Key2RC.find(K);
6171b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen  if (FoundI != Key2RC.end())
6181b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen    return FoundI->second;
6191b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen
6201b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen  // Sub-class doesn't exist, create a new one.
6211b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen  CodeGenRegisterClass *NewRC = new CodeGenRegisterClass(Name, K);
6221b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen  addToMaps(NewRC);
6231b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen  return NewRC;
6241b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen}
6251b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen
6267b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund OlesenCodeGenRegisterClass *CodeGenRegBank::getRegClass(Record *Def) {
6277b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen  if (CodeGenRegisterClass *RC = Def2RC[Def])
6287b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    return RC;
6297b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen
6307b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen  throw TGError(Def->getLoc(), "Not a known RegisterClass!");
6317b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen}
6327b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen
633b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund OlesenRecord *CodeGenRegBank::getCompositeSubRegIndex(Record *A, Record *B,
634b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen                                                bool create) {
635b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  // Look for an existing entry.
636b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  Record *&Comp = Composite[std::make_pair(A, B)];
637b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  if (Comp || !create)
638b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    return Comp;
639b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen
640b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  // None exists, synthesize one.
641dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen  std::string Name = A->getName() + "_then_" + B->getName();
642b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  Comp = new Record(Name, SMLoc(), Records);
643b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  SubRegIndices.push_back(Comp);
644b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  return Comp;
645dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen}
646dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen
647dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesenunsigned CodeGenRegBank::getSubRegIndexNo(Record *idx) {
648dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen  std::vector<Record*>::const_iterator i =
649dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen    std::find(SubRegIndices.begin(), SubRegIndices.end(), idx);
650dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen  assert(i != SubRegIndices.end() && "Not a SubRegIndex");
651dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen  return (i - SubRegIndices.begin()) + 1;
652dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen}
653dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen
654b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesenvoid CodeGenRegBank::computeComposites() {
655b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  for (unsigned i = 0, e = Registers.size(); i != e; ++i) {
656abdbc84b4ed4276ed3def50f554e3ba156325717Jakob Stoklund Olesen    CodeGenRegister *Reg1 = Registers[i];
657026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    const CodeGenRegister::SubRegMap &SRM1 = Reg1->getSubRegs();
658b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    for (CodeGenRegister::SubRegMap::const_iterator i1 = SRM1.begin(),
659b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen         e1 = SRM1.end(); i1 != e1; ++i1) {
660b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen      Record *Idx1 = i1->first;
661b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen      CodeGenRegister *Reg2 = i1->second;
662b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen      // Ignore identity compositions.
663b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen      if (Reg1 == Reg2)
664b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen        continue;
665026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen      const CodeGenRegister::SubRegMap &SRM2 = Reg2->getSubRegs();
666b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen      // Try composing Idx1 with another SubRegIndex.
667b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen      for (CodeGenRegister::SubRegMap::const_iterator i2 = SRM2.begin(),
668b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen           e2 = SRM2.end(); i2 != e2; ++i2) {
669b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen        std::pair<Record*, Record*> IdxPair(Idx1, i2->first);
670b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen        CodeGenRegister *Reg3 = i2->second;
671b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen        // Ignore identity compositions.
672b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen        if (Reg2 == Reg3)
673b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen          continue;
674b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen        // OK Reg1:IdxPair == Reg3. Find the index with Reg:Idx == Reg3.
675b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen        for (CodeGenRegister::SubRegMap::const_iterator i1d = SRM1.begin(),
676b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen             e1d = SRM1.end(); i1d != e1d; ++i1d) {
677b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen          if (i1d->second == Reg3) {
678b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen            std::pair<CompositeMap::iterator, bool> Ins =
679b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen              Composite.insert(std::make_pair(IdxPair, i1d->first));
680b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen            // Conflicting composition? Emit a warning but allow it.
681b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen            if (!Ins.second && Ins.first->second != i1d->first) {
682b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen              errs() << "Warning: SubRegIndex " << getQualifiedName(Idx1)
683b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen                     << " and " << getQualifiedName(IdxPair.second)
684b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen                     << " compose ambiguously as "
685b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen                     << getQualifiedName(Ins.first->second) << " or "
686b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen                     << getQualifiedName(i1d->first) << "\n";
687b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen            }
688b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen          }
689b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen        }
690b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen      }
691b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    }
692b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  }
693b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen
694b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  // We don't care about the difference between (Idx1, Idx2) -> Idx2 and invalid
695b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  // compositions, so remove any mappings of that form.
696b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  for (CompositeMap::iterator i = Composite.begin(), e = Composite.end();
697b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen       i != e;) {
698b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    CompositeMap::iterator j = i;
699b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    ++i;
700b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen    if (j->first.second == j->second)
701b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen      Composite.erase(j);
702b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  }
703b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen}
704b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen
705026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen// Compute sets of overlapping registers.
706026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen//
707026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen// The standard set is all super-registers and all sub-registers, but the
708026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen// target description can add arbitrary overlapping registers via the 'Aliases'
709026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen// field. This complicates things, but we can compute overlapping sets using
710026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen// the following rules:
711026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen//
712026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen// 1. The relation overlap(A, B) is reflexive and symmetric but not transitive.
713026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen//
714026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen// 2. overlap(A, B) implies overlap(A, S) for all S in supers(B).
715026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen//
716026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen// Alternatively:
717026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen//
718026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen//    overlap(A, B) iff there exists:
719026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen//    A' in { A, subregs(A) } and B' in { B, subregs(B) } such that:
720026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen//    A' = B' or A' in aliases(B') or B' in aliases(A').
721026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen//
722026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen// Here subregs(A) is the full flattened sub-register set returned by
723026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen// A.getSubRegs() while aliases(A) is simply the special 'Aliases' field in the
724026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen// description of register A.
725026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen//
726026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen// This also implies that registers with a common sub-register are considered
727026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen// overlapping. This can happen when forming register pairs:
728026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen//
729026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen//    P0 = (R0, R1)
730026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen//    P1 = (R1, R2)
731026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen//    P2 = (R2, R3)
732026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen//
733026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen// In this case, we will infer an overlap between P0 and P1 because of the
734026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen// shared sub-register R1. There is no overlap between P0 and P2.
735026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen//
736026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesenvoid CodeGenRegBank::
737026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund OlesencomputeOverlaps(std::map<const CodeGenRegister*, CodeGenRegister::Set> &Map) {
738026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen  assert(Map.empty());
739026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen
740026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen  // Collect overlaps that don't follow from rule 2.
741026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen  for (unsigned i = 0, e = Registers.size(); i != e; ++i) {
742abdbc84b4ed4276ed3def50f554e3ba156325717Jakob Stoklund Olesen    CodeGenRegister *Reg = Registers[i];
743026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    CodeGenRegister::Set &Overlaps = Map[Reg];
744026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen
745026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    // Reg overlaps itself.
746026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    Overlaps.insert(Reg);
747026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen
748026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    // All super-registers overlap.
749026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    const CodeGenRegister::SuperRegList &Supers = Reg->getSuperRegs();
750026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    Overlaps.insert(Supers.begin(), Supers.end());
751026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen
752026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    // Form symmetrical relations from the special Aliases[] lists.
753026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    std::vector<Record*> RegList = Reg->TheDef->getValueAsListOfDefs("Aliases");
754026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    for (unsigned i2 = 0, e2 = RegList.size(); i2 != e2; ++i2) {
755026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen      CodeGenRegister *Reg2 = getReg(RegList[i2]);
756026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen      CodeGenRegister::Set &Overlaps2 = Map[Reg2];
757026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen      const CodeGenRegister::SuperRegList &Supers2 = Reg2->getSuperRegs();
758026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen      // Reg overlaps Reg2 which implies it overlaps supers(Reg2).
759026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen      Overlaps.insert(Reg2);
760026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen      Overlaps.insert(Supers2.begin(), Supers2.end());
761026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen      Overlaps2.insert(Reg);
762026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen      Overlaps2.insert(Supers.begin(), Supers.end());
763026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    }
764026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen  }
765026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen
766026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen  // Apply rule 2. and inherit all sub-register overlaps.
767026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen  for (unsigned i = 0, e = Registers.size(); i != e; ++i) {
768abdbc84b4ed4276ed3def50f554e3ba156325717Jakob Stoklund Olesen    CodeGenRegister *Reg = Registers[i];
769026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    CodeGenRegister::Set &Overlaps = Map[Reg];
770026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    const CodeGenRegister::SubRegMap &SRM = Reg->getSubRegs();
771026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    for (CodeGenRegister::SubRegMap::const_iterator i2 = SRM.begin(),
772026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen         e2 = SRM.end(); i2 != e2; ++i2) {
773026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen      CodeGenRegister::Set &Overlaps2 = Map[i2->second];
774026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen      Overlaps.insert(Overlaps2.begin(), Overlaps2.end());
775026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen    }
776026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen  }
777026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen}
778026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen
779b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesenvoid CodeGenRegBank::computeDerivedInfo() {
780b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen  computeComposites();
781b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen}
782b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen
7837e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen//
7847e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen// Synthesize missing register class intersections.
7857e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen//
7867e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen// Make sure that sub-classes of RC exists such that getCommonSubClass(RC, X)
7877e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen// returns a maximal register class for all X.
7887e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen//
7897e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesenvoid CodeGenRegBank::inferCommonSubClass(CodeGenRegisterClass *RC) {
7907e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen  for (unsigned rci = 0, rce = RegClasses.size(); rci != rce; ++rci) {
7917e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen    CodeGenRegisterClass *RC1 = RC;
7927e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen    CodeGenRegisterClass *RC2 = RegClasses[rci];
7937e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen    if (RC1 == RC2)
7947e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen      continue;
7957e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen
7967e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen    // Compute the set intersection of RC1 and RC2.
7977e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen    const CodeGenRegister::Set &Memb1 = RC1->getMembers();
7987e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen    const CodeGenRegister::Set &Memb2 = RC2->getMembers();
7997e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen    CodeGenRegister::Set Intersection;
8007e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen    std::set_intersection(Memb1.begin(), Memb1.end(),
8017e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen                          Memb2.begin(), Memb2.end(),
802d4c826f64866295fcbfa472d812bd3ec3a5e4c9fJakob Stoklund Olesen                          std::inserter(Intersection, Intersection.begin()),
803d4c826f64866295fcbfa472d812bd3ec3a5e4c9fJakob Stoklund Olesen                          CodeGenRegister::Less());
8047e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen
8057e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen    // Skip disjoint class pairs.
8067e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen    if (Intersection.empty())
8077e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen      continue;
8087e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen
8097e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen    // If RC1 and RC2 have different spill sizes or alignments, use the
8107e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen    // larger size for sub-classing.  If they are equal, prefer RC1.
8117e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen    if (RC2->SpillSize > RC1->SpillSize ||
8127e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen        (RC2->SpillSize == RC1->SpillSize &&
8137e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen         RC2->SpillAlignment > RC1->SpillAlignment))
8147e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen      std::swap(RC1, RC2);
8157e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen
8167e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen    getOrCreateSubClass(RC1, &Intersection,
8177e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen                        RC1->getName() + "_and_" + RC2->getName());
8187e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen  }
8197e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen}
8207e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen
821fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen//
822fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen// Synthesize missing sub-classes for getSubClassWithSubReg().
823fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen//
824fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen// Make sure that the set of registers in RC with a given SubIdx sub-register
825fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen// form a register class.  Update RC->SubClassWithSubReg.
826fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen//
827fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesenvoid CodeGenRegBank::inferSubClassWithSubReg(CodeGenRegisterClass *RC) {
828fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen  // Map SubRegIndex to set of registers in RC supporting that SubRegIndex.
829fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen  typedef std::map<Record*, CodeGenRegister::Set, LessRecord> SubReg2SetMap;
830fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen
831fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen  // Compute the set of registers supporting each SubRegIndex.
832fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen  SubReg2SetMap SRSets;
833fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen  for (CodeGenRegister::Set::const_iterator RI = RC->getMembers().begin(),
834fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen       RE = RC->getMembers().end(); RI != RE; ++RI) {
835fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen    const CodeGenRegister::SubRegMap &SRM = (*RI)->getSubRegs();
836fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen    for (CodeGenRegister::SubRegMap::const_iterator I = SRM.begin(),
837fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen         E = SRM.end(); I != E; ++I)
838fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen      SRSets[I->first].insert(*RI);
839fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen  }
840fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen
841fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen  // Find matching classes for all SRSets entries.  Iterate in SubRegIndex
842fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen  // numerical order to visit synthetic indices last.
843fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen  for (unsigned sri = 0, sre = SubRegIndices.size(); sri != sre; ++sri) {
844fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen    Record *SubIdx = SubRegIndices[sri];
845fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen    SubReg2SetMap::const_iterator I = SRSets.find(SubIdx);
846fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen    // Unsupported SubRegIndex. Skip it.
847fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen    if (I == SRSets.end())
848fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen      continue;
849fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen    // In most cases, all RC registers support the SubRegIndex.
850fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen    if (I->second.size() == RC->getMembers().size()) {
851fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen      RC->setSubClassWithSubReg(SubIdx, RC);
852fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen      continue;
853fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen    }
854fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen    // This is a real subset.  See if we have a matching class.
855fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen    CodeGenRegisterClass *SubRC =
856fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen      getOrCreateSubClass(RC, &I->second,
857fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen                          RC->getName() + "_with_" + I->first->getName());
858fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen    RC->setSubClassWithSubReg(SubIdx, SubRC);
859fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen  }
860fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen}
861fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen
862fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen//
863a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen// Synthesize missing sub-classes of RC for getMatchingSuperRegClass().
864a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen//
865a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen// Create sub-classes of RC such that getMatchingSuperRegClass(RC, SubIdx, X)
866a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen// has a maximal result for any SubIdx and any X >= FirstSubRegRC.
867a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen//
868a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen
869a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesenvoid CodeGenRegBank::inferMatchingSuperRegClass(CodeGenRegisterClass *RC,
870a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen                                                unsigned FirstSubRegRC) {
871a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen  SmallVector<std::pair<const CodeGenRegister*,
872a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen                        const CodeGenRegister*>, 16> SSPairs;
873a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen
874a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen  // Iterate in SubRegIndex numerical order to visit synthetic indices last.
875a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen  for (unsigned sri = 0, sre = SubRegIndices.size(); sri != sre; ++sri) {
876a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen    Record *SubIdx = SubRegIndices[sri];
877a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen    // Skip indexes that aren't fully supported by RC's registers. This was
878a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen    // computed by inferSubClassWithSubReg() above which should have been
879a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen    // called first.
880a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen    if (RC->getSubClassWithSubReg(SubIdx) != RC)
881a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen      continue;
882a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen
883a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen    // Build list of (Super, Sub) pairs for this SubIdx.
884a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen    SSPairs.clear();
885a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen    for (CodeGenRegister::Set::const_iterator RI = RC->getMembers().begin(),
886a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen         RE = RC->getMembers().end(); RI != RE; ++RI) {
887a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen      const CodeGenRegister *Super = *RI;
888a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen      const CodeGenRegister *Sub = Super->getSubRegs().find(SubIdx)->second;
889a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen      assert(Sub && "Missing sub-register");
890a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen      SSPairs.push_back(std::make_pair(Super, Sub));
891a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen    }
892a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen
893a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen    // Iterate over sub-register class candidates.  Ignore classes created by
894a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen    // this loop. They will never be useful.
895a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen    for (unsigned rci = FirstSubRegRC, rce = RegClasses.size(); rci != rce;
896a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen         ++rci) {
897a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen      CodeGenRegisterClass *SubRC = RegClasses[rci];
898a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen      // Compute the subset of RC that maps into SubRC.
899a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen      CodeGenRegister::Set SubSet;
900a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen      for (unsigned i = 0, e = SSPairs.size(); i != e; ++i)
901a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen        if (SubRC->contains(SSPairs[i].second))
902a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen          SubSet.insert(SSPairs[i].first);
903a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen      if (SubSet.empty())
904a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen        continue;
905a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen      // RC injects completely into SubRC.
906570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen      if (SubSet.size() == SSPairs.size()) {
907570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen        SubRC->addSuperRegClass(SubIdx, RC);
908a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen        continue;
909570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen      }
910a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen      // Only a subset of RC maps into SubRC. Make sure it is represented by a
911a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen      // class.
912a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen      getOrCreateSubClass(RC, &SubSet, RC->getName() +
913a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen                          "_with_" + SubIdx->getName() +
914a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen                          "_in_" + SubRC->getName());
915a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen    }
916a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen  }
917a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen}
918a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen
919a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen
920a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen//
921babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen// Infer missing register classes.
922babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen//
923babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesenvoid CodeGenRegBank::computeInferredRegisterClasses() {
924babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  // When this function is called, the register classes have not been sorted
925babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  // and assigned EnumValues yet.  That means getSubClasses(),
926babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  // getSuperClasses(), and hasSubClass() functions are defunct.
927a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen  unsigned FirstNewRC = RegClasses.size();
928babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
929babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  // Visit all register classes, including the ones being added by the loop.
930babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  for (unsigned rci = 0; rci != RegClasses.size(); ++rci) {
931fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen    CodeGenRegisterClass *RC = RegClasses[rci];
932babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
933fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen    // Synthesize answers for getSubClassWithSubReg().
934fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen    inferSubClassWithSubReg(RC);
9357e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen
9367e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen    // Synthesize answers for getCommonSubClass().
937fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen    inferCommonSubClass(RC);
938a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen
939a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen    // Synthesize answers for getMatchingSuperRegClass().
940a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen    inferMatchingSuperRegClass(RC);
941a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen
942a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen    // New register classes are created while this loop is running, and we need
943a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen    // to visit all of them.  I  particular, inferMatchingSuperRegClass needs
944a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen    // to match old super-register classes with sub-register classes created
945a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen    // after inferMatchingSuperRegClass was called.  At this point,
946a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen    // inferMatchingSuperRegClass has checked SuperRC = [0..rci] with SubRC =
947a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen    // [0..FirstNewRC).  We need to cover SubRC = [FirstNewRC..rci].
948a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen    if (rci + 1 == FirstNewRC) {
949a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen      unsigned NextNewRC = RegClasses.size();
950a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen      for (unsigned rci2 = 0; rci2 != FirstNewRC; ++rci2)
951a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen        inferMatchingSuperRegClass(RegClasses[rci2], FirstNewRC);
952a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen      FirstNewRC = NextNewRC;
953a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen    }
954babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen  }
955babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen}
956babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen
9577b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen/// getRegisterClassForRegister - Find the register class that contains the
9587b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen/// specified physical register.  If the register is not in a register class,
9597b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen/// return null. If the register is in multiple classes, and the classes have a
9607b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen/// superset-subset relationship and the same set of types, return the
9617b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen/// superclass.  Otherwise return null.
9627b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesenconst CodeGenRegisterClass*
9637b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund OlesenCodeGenRegBank::getRegClassForRegister(Record *R) {
964ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen  const CodeGenRegister *Reg = getReg(R);
96529f018cee616e4082e5005bc9adee4dc777e621cJakob Stoklund Olesen  ArrayRef<CodeGenRegisterClass*> RCs = getRegClasses();
9667b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen  const CodeGenRegisterClass *FoundRC = 0;
9677b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen  for (unsigned i = 0, e = RCs.size(); i != e; ++i) {
96829f018cee616e4082e5005bc9adee4dc777e621cJakob Stoklund Olesen    const CodeGenRegisterClass &RC = *RCs[i];
969ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen    if (!RC.contains(Reg))
9707b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen      continue;
9717b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen
9727b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    // If this is the first class that contains the register,
9737b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    // make a note of it and go on to the next class.
9747b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    if (!FoundRC) {
9757b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen      FoundRC = &RC;
9767b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen      continue;
9777b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    }
9787b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen
9797b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    // If a register's classes have different types, return null.
9807b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    if (RC.getValueTypes() != FoundRC->getValueTypes())
9817b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen      return 0;
9827b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen
9837b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    // Check to see if the previously found class that contains
9847b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    // the register is a subclass of the current class. If so,
9857b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    // prefer the superclass.
986ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen    if (RC.hasSubClass(FoundRC)) {
9877b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen      FoundRC = &RC;
9887b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen      continue;
9897b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    }
9907b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen
9917b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    // Check to see if the previously found class that contains
9927b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    // the register is a superclass of the current class. If so,
9937b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    // prefer the superclass.
994ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen    if (FoundRC->hasSubClass(&RC))
9957b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen      continue;
9967b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen
9977b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    // Multiple classes, and neither is a superclass of the other.
9987b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    // Return null.
9997b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen    return 0;
10007b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen  }
10017b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen  return FoundRC;
10027b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen}
1003ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen
1004ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund OlesenBitVector CodeGenRegBank::computeCoveredRegisters(ArrayRef<Record*> Regs) {
1005ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen  SetVector<CodeGenRegister*> Set;
1006ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen
1007ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen  // First add Regs with all sub-registers.
1008ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen  for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
1009ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen    CodeGenRegister *Reg = getReg(Regs[i]);
1010ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen    if (Set.insert(Reg))
1011ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen      // Reg is new, add all sub-registers.
1012ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen      // The pre-ordering is not important here.
1013ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen      Reg->addSubRegsPreOrder(Set);
1014ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen  }
1015ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen
1016ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen  // Second, find all super-registers that are completely covered by the set.
101731867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen  for (unsigned i = 0; i != Set.size(); ++i) {
101831867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen    const CodeGenRegister::SuperRegList &SR = Set[i]->getSuperRegs();
101931867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen    for (unsigned j = 0, e = SR.size(); j != e; ++j) {
102031867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen      CodeGenRegister *Super = SR[j];
102131867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen      if (!Super->CoveredBySubRegs || Set.count(Super))
102231867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen        continue;
102331867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen      // This new super-register is covered by its sub-registers.
102431867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen      bool AllSubsInSet = true;
102531867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen      const CodeGenRegister::SubRegMap &SRM = Super->getSubRegs();
102631867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen      for (CodeGenRegister::SubRegMap::const_iterator I = SRM.begin(),
102731867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen             E = SRM.end(); I != E; ++I)
102831867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen        if (!Set.count(I->second)) {
102931867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen          AllSubsInSet = false;
103031867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen          break;
103131867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen        }
103231867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen      // All sub-registers in Set, add Super as well.
103331867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen      // We will visit Super later to recheck its super-registers.
103431867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen      if (AllSubsInSet)
103531867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen        Set.insert(Super);
103631867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen    }
103731867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen  }
1038ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen
1039ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen  // Convert to BitVector.
1040ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen  BitVector BV(Registers.size() + 1);
1041ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen  for (unsigned i = 0, e = Set.size(); i != e; ++i)
1042ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen    BV.set(Set[i]->EnumValue);
1043ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen  return BV;
1044ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen}
1045