109467b48Spatrick //===- CodeGenRegisters.cpp - Register and RegisterClass Info -------------===//
209467b48Spatrick //
309467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
409467b48Spatrick // See https://llvm.org/LICENSE.txt for license information.
509467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
609467b48Spatrick //
709467b48Spatrick //===----------------------------------------------------------------------===//
809467b48Spatrick //
909467b48Spatrick // This file defines structures to encapsulate information gleaned from the
1009467b48Spatrick // target register and register class definitions.
1109467b48Spatrick //
1209467b48Spatrick //===----------------------------------------------------------------------===//
1309467b48Spatrick
1409467b48Spatrick #include "CodeGenRegisters.h"
1509467b48Spatrick #include "llvm/ADT/ArrayRef.h"
1609467b48Spatrick #include "llvm/ADT/BitVector.h"
1709467b48Spatrick #include "llvm/ADT/DenseMap.h"
1809467b48Spatrick #include "llvm/ADT/IntEqClasses.h"
19*d415bd75Srobert #include "llvm/ADT/STLExtras.h"
2009467b48Spatrick #include "llvm/ADT/SetVector.h"
2109467b48Spatrick #include "llvm/ADT/SmallPtrSet.h"
2209467b48Spatrick #include "llvm/ADT/SmallSet.h"
2309467b48Spatrick #include "llvm/ADT/SmallVector.h"
2409467b48Spatrick #include "llvm/ADT/StringRef.h"
2509467b48Spatrick #include "llvm/ADT/Twine.h"
2609467b48Spatrick #include "llvm/Support/Debug.h"
2709467b48Spatrick #include "llvm/Support/raw_ostream.h"
2809467b48Spatrick #include "llvm/TableGen/Error.h"
2909467b48Spatrick #include "llvm/TableGen/Record.h"
3009467b48Spatrick #include <algorithm>
3109467b48Spatrick #include <cassert>
3209467b48Spatrick #include <cstdint>
3309467b48Spatrick #include <iterator>
3409467b48Spatrick #include <map>
3509467b48Spatrick #include <queue>
3609467b48Spatrick #include <set>
3709467b48Spatrick #include <string>
3809467b48Spatrick #include <tuple>
3909467b48Spatrick #include <utility>
4009467b48Spatrick #include <vector>
4109467b48Spatrick
4209467b48Spatrick using namespace llvm;
4309467b48Spatrick
4409467b48Spatrick #define DEBUG_TYPE "regalloc-emitter"
4509467b48Spatrick
4609467b48Spatrick //===----------------------------------------------------------------------===//
4709467b48Spatrick // CodeGenSubRegIndex
4809467b48Spatrick //===----------------------------------------------------------------------===//
4909467b48Spatrick
CodeGenSubRegIndex(Record * R,unsigned Enum)5009467b48Spatrick CodeGenSubRegIndex::CodeGenSubRegIndex(Record *R, unsigned Enum)
5109467b48Spatrick : TheDef(R), EnumValue(Enum), AllSuperRegsCovered(true), Artificial(true) {
52097a140dSpatrick Name = std::string(R->getName());
5309467b48Spatrick if (R->getValue("Namespace"))
54097a140dSpatrick Namespace = std::string(R->getValueAsString("Namespace"));
5509467b48Spatrick Size = R->getValueAsInt("Size");
5609467b48Spatrick Offset = R->getValueAsInt("Offset");
5709467b48Spatrick }
5809467b48Spatrick
CodeGenSubRegIndex(StringRef N,StringRef Nspace,unsigned Enum)5909467b48Spatrick CodeGenSubRegIndex::CodeGenSubRegIndex(StringRef N, StringRef Nspace,
6009467b48Spatrick unsigned Enum)
61097a140dSpatrick : TheDef(nullptr), Name(std::string(N)), Namespace(std::string(Nspace)),
62097a140dSpatrick Size(-1), Offset(-1), EnumValue(Enum), AllSuperRegsCovered(true),
63097a140dSpatrick Artificial(true) {}
6409467b48Spatrick
getQualifiedName() const6509467b48Spatrick std::string CodeGenSubRegIndex::getQualifiedName() const {
6609467b48Spatrick std::string N = getNamespace();
6709467b48Spatrick if (!N.empty())
6809467b48Spatrick N += "::";
6909467b48Spatrick N += getName();
7009467b48Spatrick return N;
7109467b48Spatrick }
7209467b48Spatrick
updateComponents(CodeGenRegBank & RegBank)7309467b48Spatrick void CodeGenSubRegIndex::updateComponents(CodeGenRegBank &RegBank) {
7409467b48Spatrick if (!TheDef)
7509467b48Spatrick return;
7609467b48Spatrick
7709467b48Spatrick std::vector<Record*> Comps = TheDef->getValueAsListOfDefs("ComposedOf");
7809467b48Spatrick if (!Comps.empty()) {
7909467b48Spatrick if (Comps.size() != 2)
8009467b48Spatrick PrintFatalError(TheDef->getLoc(),
8109467b48Spatrick "ComposedOf must have exactly two entries");
8209467b48Spatrick CodeGenSubRegIndex *A = RegBank.getSubRegIdx(Comps[0]);
8309467b48Spatrick CodeGenSubRegIndex *B = RegBank.getSubRegIdx(Comps[1]);
8409467b48Spatrick CodeGenSubRegIndex *X = A->addComposite(B, this);
8509467b48Spatrick if (X)
8609467b48Spatrick PrintFatalError(TheDef->getLoc(), "Ambiguous ComposedOf entries");
8709467b48Spatrick }
8809467b48Spatrick
8909467b48Spatrick std::vector<Record*> Parts =
9009467b48Spatrick TheDef->getValueAsListOfDefs("CoveringSubRegIndices");
9109467b48Spatrick if (!Parts.empty()) {
9209467b48Spatrick if (Parts.size() < 2)
9309467b48Spatrick PrintFatalError(TheDef->getLoc(),
9409467b48Spatrick "CoveredBySubRegs must have two or more entries");
9509467b48Spatrick SmallVector<CodeGenSubRegIndex*, 8> IdxParts;
9609467b48Spatrick for (Record *Part : Parts)
9709467b48Spatrick IdxParts.push_back(RegBank.getSubRegIdx(Part));
9809467b48Spatrick setConcatenationOf(IdxParts);
9909467b48Spatrick }
10009467b48Spatrick }
10109467b48Spatrick
computeLaneMask() const10209467b48Spatrick LaneBitmask CodeGenSubRegIndex::computeLaneMask() const {
10309467b48Spatrick // Already computed?
10409467b48Spatrick if (LaneMask.any())
10509467b48Spatrick return LaneMask;
10609467b48Spatrick
10709467b48Spatrick // Recursion guard, shouldn't be required.
10809467b48Spatrick LaneMask = LaneBitmask::getAll();
10909467b48Spatrick
11009467b48Spatrick // The lane mask is simply the union of all sub-indices.
11109467b48Spatrick LaneBitmask M;
11209467b48Spatrick for (const auto &C : Composed)
11309467b48Spatrick M |= C.second->computeLaneMask();
11409467b48Spatrick assert(M.any() && "Missing lane mask, sub-register cycle?");
11509467b48Spatrick LaneMask = M;
11609467b48Spatrick return LaneMask;
11709467b48Spatrick }
11809467b48Spatrick
setConcatenationOf(ArrayRef<CodeGenSubRegIndex * > Parts)11909467b48Spatrick void CodeGenSubRegIndex::setConcatenationOf(
12009467b48Spatrick ArrayRef<CodeGenSubRegIndex*> Parts) {
12109467b48Spatrick if (ConcatenationOf.empty())
12209467b48Spatrick ConcatenationOf.assign(Parts.begin(), Parts.end());
12309467b48Spatrick else
12409467b48Spatrick assert(std::equal(Parts.begin(), Parts.end(),
12509467b48Spatrick ConcatenationOf.begin()) && "parts consistent");
12609467b48Spatrick }
12709467b48Spatrick
computeConcatTransitiveClosure()12809467b48Spatrick void CodeGenSubRegIndex::computeConcatTransitiveClosure() {
12909467b48Spatrick for (SmallVectorImpl<CodeGenSubRegIndex*>::iterator
13009467b48Spatrick I = ConcatenationOf.begin(); I != ConcatenationOf.end(); /*empty*/) {
13109467b48Spatrick CodeGenSubRegIndex *SubIdx = *I;
13209467b48Spatrick SubIdx->computeConcatTransitiveClosure();
13309467b48Spatrick #ifndef NDEBUG
13409467b48Spatrick for (CodeGenSubRegIndex *SRI : SubIdx->ConcatenationOf)
13509467b48Spatrick assert(SRI->ConcatenationOf.empty() && "No transitive closure?");
13609467b48Spatrick #endif
13709467b48Spatrick
13809467b48Spatrick if (SubIdx->ConcatenationOf.empty()) {
13909467b48Spatrick ++I;
14009467b48Spatrick } else {
14109467b48Spatrick I = ConcatenationOf.erase(I);
14209467b48Spatrick I = ConcatenationOf.insert(I, SubIdx->ConcatenationOf.begin(),
14309467b48Spatrick SubIdx->ConcatenationOf.end());
14409467b48Spatrick I += SubIdx->ConcatenationOf.size();
14509467b48Spatrick }
14609467b48Spatrick }
14709467b48Spatrick }
14809467b48Spatrick
14909467b48Spatrick //===----------------------------------------------------------------------===//
15009467b48Spatrick // CodeGenRegister
15109467b48Spatrick //===----------------------------------------------------------------------===//
15209467b48Spatrick
CodeGenRegister(Record * R,unsigned Enum)15309467b48Spatrick CodeGenRegister::CodeGenRegister(Record *R, unsigned Enum)
15473471bf0Spatrick : TheDef(R), EnumValue(Enum),
15573471bf0Spatrick CostPerUse(R->getValueAsListOfInts("CostPerUse")),
15609467b48Spatrick CoveredBySubRegs(R->getValueAsBit("CoveredBySubRegs")),
157*d415bd75Srobert HasDisjunctSubRegs(false), Constant(R->getValueAsBit("isConstant")),
158*d415bd75Srobert SubRegsComplete(false), SuperRegsComplete(false), TopoSig(~0u) {
15909467b48Spatrick Artificial = R->getValueAsBit("isArtificial");
16009467b48Spatrick }
16109467b48Spatrick
buildObjectGraph(CodeGenRegBank & RegBank)16209467b48Spatrick void CodeGenRegister::buildObjectGraph(CodeGenRegBank &RegBank) {
16309467b48Spatrick std::vector<Record*> SRIs = TheDef->getValueAsListOfDefs("SubRegIndices");
16409467b48Spatrick std::vector<Record*> SRs = TheDef->getValueAsListOfDefs("SubRegs");
16509467b48Spatrick
16609467b48Spatrick if (SRIs.size() != SRs.size())
16709467b48Spatrick PrintFatalError(TheDef->getLoc(),
16809467b48Spatrick "SubRegs and SubRegIndices must have the same size");
16909467b48Spatrick
17009467b48Spatrick for (unsigned i = 0, e = SRIs.size(); i != e; ++i) {
17109467b48Spatrick ExplicitSubRegIndices.push_back(RegBank.getSubRegIdx(SRIs[i]));
17209467b48Spatrick ExplicitSubRegs.push_back(RegBank.getReg(SRs[i]));
17309467b48Spatrick }
17409467b48Spatrick
17509467b48Spatrick // Also compute leading super-registers. Each register has a list of
17609467b48Spatrick // covered-by-subregs super-registers where it appears as the first explicit
17709467b48Spatrick // sub-register.
17809467b48Spatrick //
17909467b48Spatrick // This is used by computeSecondarySubRegs() to find candidates.
18009467b48Spatrick if (CoveredBySubRegs && !ExplicitSubRegs.empty())
18109467b48Spatrick ExplicitSubRegs.front()->LeadingSuperRegs.push_back(this);
18209467b48Spatrick
18309467b48Spatrick // Add ad hoc alias links. This is a symmetric relationship between two
18409467b48Spatrick // registers, so build a symmetric graph by adding links in both ends.
18509467b48Spatrick std::vector<Record*> Aliases = TheDef->getValueAsListOfDefs("Aliases");
18609467b48Spatrick for (Record *Alias : Aliases) {
18709467b48Spatrick CodeGenRegister *Reg = RegBank.getReg(Alias);
18809467b48Spatrick ExplicitAliases.push_back(Reg);
18909467b48Spatrick Reg->ExplicitAliases.push_back(this);
19009467b48Spatrick }
19109467b48Spatrick }
19209467b48Spatrick
getName() const19373471bf0Spatrick StringRef CodeGenRegister::getName() const {
19409467b48Spatrick assert(TheDef && "no def");
19509467b48Spatrick return TheDef->getName();
19609467b48Spatrick }
19709467b48Spatrick
19809467b48Spatrick namespace {
19909467b48Spatrick
20009467b48Spatrick // Iterate over all register units in a set of registers.
20109467b48Spatrick class RegUnitIterator {
20209467b48Spatrick CodeGenRegister::Vec::const_iterator RegI, RegE;
20309467b48Spatrick CodeGenRegister::RegUnitList::iterator UnitI, UnitE;
204*d415bd75Srobert static CodeGenRegister::RegUnitList Sentinel;
20509467b48Spatrick
20609467b48Spatrick public:
RegUnitIterator(const CodeGenRegister::Vec & Regs)20709467b48Spatrick RegUnitIterator(const CodeGenRegister::Vec &Regs):
20809467b48Spatrick RegI(Regs.begin()), RegE(Regs.end()) {
20909467b48Spatrick
210*d415bd75Srobert if (RegI == RegE) {
211*d415bd75Srobert UnitI = Sentinel.end();
212*d415bd75Srobert UnitE = Sentinel.end();
213*d415bd75Srobert } else {
21409467b48Spatrick UnitI = (*RegI)->getRegUnits().begin();
21509467b48Spatrick UnitE = (*RegI)->getRegUnits().end();
21609467b48Spatrick advance();
21709467b48Spatrick }
21809467b48Spatrick }
21909467b48Spatrick
isValid() const22009467b48Spatrick bool isValid() const { return UnitI != UnitE; }
22109467b48Spatrick
operator *() const22209467b48Spatrick unsigned operator* () const { assert(isValid()); return *UnitI; }
22309467b48Spatrick
getReg() const22409467b48Spatrick const CodeGenRegister *getReg() const { assert(isValid()); return *RegI; }
22509467b48Spatrick
22609467b48Spatrick /// Preincrement. Move to the next unit.
operator ++()22709467b48Spatrick void operator++() {
22809467b48Spatrick assert(isValid() && "Cannot advance beyond the last operand");
22909467b48Spatrick ++UnitI;
23009467b48Spatrick advance();
23109467b48Spatrick }
23209467b48Spatrick
23309467b48Spatrick protected:
advance()23409467b48Spatrick void advance() {
23509467b48Spatrick while (UnitI == UnitE) {
23609467b48Spatrick if (++RegI == RegE)
23709467b48Spatrick break;
23809467b48Spatrick UnitI = (*RegI)->getRegUnits().begin();
23909467b48Spatrick UnitE = (*RegI)->getRegUnits().end();
24009467b48Spatrick }
24109467b48Spatrick }
24209467b48Spatrick };
24309467b48Spatrick
244*d415bd75Srobert CodeGenRegister::RegUnitList RegUnitIterator::Sentinel;
245*d415bd75Srobert
24609467b48Spatrick } // end anonymous namespace
24709467b48Spatrick
24809467b48Spatrick // Return true of this unit appears in RegUnits.
hasRegUnit(CodeGenRegister::RegUnitList & RegUnits,unsigned Unit)24909467b48Spatrick static bool hasRegUnit(CodeGenRegister::RegUnitList &RegUnits, unsigned Unit) {
25009467b48Spatrick return RegUnits.test(Unit);
25109467b48Spatrick }
25209467b48Spatrick
25309467b48Spatrick // Inherit register units from subregisters.
25409467b48Spatrick // Return true if the RegUnits changed.
inheritRegUnits(CodeGenRegBank & RegBank)25509467b48Spatrick bool CodeGenRegister::inheritRegUnits(CodeGenRegBank &RegBank) {
25609467b48Spatrick bool changed = false;
25709467b48Spatrick for (const auto &SubReg : SubRegs) {
25809467b48Spatrick CodeGenRegister *SR = SubReg.second;
25909467b48Spatrick // Merge the subregister's units into this register's RegUnits.
26009467b48Spatrick changed |= (RegUnits |= SR->RegUnits);
26109467b48Spatrick }
26209467b48Spatrick
26309467b48Spatrick return changed;
26409467b48Spatrick }
26509467b48Spatrick
26609467b48Spatrick const CodeGenRegister::SubRegMap &
computeSubRegs(CodeGenRegBank & RegBank)26709467b48Spatrick CodeGenRegister::computeSubRegs(CodeGenRegBank &RegBank) {
26809467b48Spatrick // Only compute this map once.
26909467b48Spatrick if (SubRegsComplete)
27009467b48Spatrick return SubRegs;
27109467b48Spatrick SubRegsComplete = true;
27209467b48Spatrick
27309467b48Spatrick HasDisjunctSubRegs = ExplicitSubRegs.size() > 1;
27409467b48Spatrick
27509467b48Spatrick // First insert the explicit subregs and make sure they are fully indexed.
27609467b48Spatrick for (unsigned i = 0, e = ExplicitSubRegs.size(); i != e; ++i) {
27709467b48Spatrick CodeGenRegister *SR = ExplicitSubRegs[i];
27809467b48Spatrick CodeGenSubRegIndex *Idx = ExplicitSubRegIndices[i];
27909467b48Spatrick if (!SR->Artificial)
28009467b48Spatrick Idx->Artificial = false;
28109467b48Spatrick if (!SubRegs.insert(std::make_pair(Idx, SR)).second)
28209467b48Spatrick PrintFatalError(TheDef->getLoc(), "SubRegIndex " + Idx->getName() +
28309467b48Spatrick " appears twice in Register " + getName());
28409467b48Spatrick // Map explicit sub-registers first, so the names take precedence.
28509467b48Spatrick // The inherited sub-registers are mapped below.
28609467b48Spatrick SubReg2Idx.insert(std::make_pair(SR, Idx));
28709467b48Spatrick }
28809467b48Spatrick
28909467b48Spatrick // Keep track of inherited subregs and how they can be reached.
29009467b48Spatrick SmallPtrSet<CodeGenRegister*, 8> Orphans;
29109467b48Spatrick
29209467b48Spatrick // Clone inherited subregs and place duplicate entries in Orphans.
29309467b48Spatrick // Here the order is important - earlier subregs take precedence.
29409467b48Spatrick for (CodeGenRegister *ESR : ExplicitSubRegs) {
29509467b48Spatrick const SubRegMap &Map = ESR->computeSubRegs(RegBank);
29609467b48Spatrick HasDisjunctSubRegs |= ESR->HasDisjunctSubRegs;
29709467b48Spatrick
29809467b48Spatrick for (const auto &SR : Map) {
29909467b48Spatrick if (!SubRegs.insert(SR).second)
30009467b48Spatrick Orphans.insert(SR.second);
30109467b48Spatrick }
30209467b48Spatrick }
30309467b48Spatrick
30409467b48Spatrick // Expand any composed subreg indices.
30509467b48Spatrick // If dsub_2 has ComposedOf = [qsub_1, dsub_0], and this register has a
30609467b48Spatrick // qsub_1 subreg, add a dsub_2 subreg. Keep growing Indices and process
30709467b48Spatrick // expanded subreg indices recursively.
30809467b48Spatrick SmallVector<CodeGenSubRegIndex*, 8> Indices = ExplicitSubRegIndices;
30909467b48Spatrick for (unsigned i = 0; i != Indices.size(); ++i) {
31009467b48Spatrick CodeGenSubRegIndex *Idx = Indices[i];
31109467b48Spatrick const CodeGenSubRegIndex::CompMap &Comps = Idx->getComposites();
31209467b48Spatrick CodeGenRegister *SR = SubRegs[Idx];
31309467b48Spatrick const SubRegMap &Map = SR->computeSubRegs(RegBank);
31409467b48Spatrick
31509467b48Spatrick // Look at the possible compositions of Idx.
31609467b48Spatrick // They may not all be supported by SR.
31773471bf0Spatrick for (auto Comp : Comps) {
31873471bf0Spatrick SubRegMap::const_iterator SRI = Map.find(Comp.first);
31909467b48Spatrick if (SRI == Map.end())
32009467b48Spatrick continue; // Idx + I->first doesn't exist in SR.
32109467b48Spatrick // Add I->second as a name for the subreg SRI->second, assuming it is
32209467b48Spatrick // orphaned, and the name isn't already used for something else.
32373471bf0Spatrick if (SubRegs.count(Comp.second) || !Orphans.erase(SRI->second))
32409467b48Spatrick continue;
32509467b48Spatrick // We found a new name for the orphaned sub-register.
32673471bf0Spatrick SubRegs.insert(std::make_pair(Comp.second, SRI->second));
32773471bf0Spatrick Indices.push_back(Comp.second);
32809467b48Spatrick }
32909467b48Spatrick }
33009467b48Spatrick
33109467b48Spatrick // Now Orphans contains the inherited subregisters without a direct index.
33209467b48Spatrick // Create inferred indexes for all missing entries.
33309467b48Spatrick // Work backwards in the Indices vector in order to compose subregs bottom-up.
33409467b48Spatrick // Consider this subreg sequence:
33509467b48Spatrick //
33609467b48Spatrick // qsub_1 -> dsub_0 -> ssub_0
33709467b48Spatrick //
33809467b48Spatrick // The qsub_1 -> dsub_0 composition becomes dsub_2, so the ssub_0 register
33909467b48Spatrick // can be reached in two different ways:
34009467b48Spatrick //
34109467b48Spatrick // qsub_1 -> ssub_0
34209467b48Spatrick // dsub_2 -> ssub_0
34309467b48Spatrick //
34409467b48Spatrick // We pick the latter composition because another register may have [dsub_0,
34509467b48Spatrick // dsub_1, dsub_2] subregs without necessarily having a qsub_1 subreg. The
34609467b48Spatrick // dsub_2 -> ssub_0 composition can be shared.
34709467b48Spatrick while (!Indices.empty() && !Orphans.empty()) {
34809467b48Spatrick CodeGenSubRegIndex *Idx = Indices.pop_back_val();
34909467b48Spatrick CodeGenRegister *SR = SubRegs[Idx];
35009467b48Spatrick const SubRegMap &Map = SR->computeSubRegs(RegBank);
35109467b48Spatrick for (const auto &SubReg : Map)
35209467b48Spatrick if (Orphans.erase(SubReg.second))
35309467b48Spatrick SubRegs[RegBank.getCompositeSubRegIndex(Idx, SubReg.first)] = SubReg.second;
35409467b48Spatrick }
35509467b48Spatrick
35609467b48Spatrick // Compute the inverse SubReg -> Idx map.
35709467b48Spatrick for (const auto &SubReg : SubRegs) {
35809467b48Spatrick if (SubReg.second == this) {
35909467b48Spatrick ArrayRef<SMLoc> Loc;
36009467b48Spatrick if (TheDef)
36109467b48Spatrick Loc = TheDef->getLoc();
36209467b48Spatrick PrintFatalError(Loc, "Register " + getName() +
36309467b48Spatrick " has itself as a sub-register");
36409467b48Spatrick }
36509467b48Spatrick
36609467b48Spatrick // Compute AllSuperRegsCovered.
36709467b48Spatrick if (!CoveredBySubRegs)
36809467b48Spatrick SubReg.first->AllSuperRegsCovered = false;
36909467b48Spatrick
37009467b48Spatrick // Ensure that every sub-register has a unique name.
37109467b48Spatrick DenseMap<const CodeGenRegister*, CodeGenSubRegIndex*>::iterator Ins =
37209467b48Spatrick SubReg2Idx.insert(std::make_pair(SubReg.second, SubReg.first)).first;
37309467b48Spatrick if (Ins->second == SubReg.first)
37409467b48Spatrick continue;
37509467b48Spatrick // Trouble: Two different names for SubReg.second.
37609467b48Spatrick ArrayRef<SMLoc> Loc;
37709467b48Spatrick if (TheDef)
37809467b48Spatrick Loc = TheDef->getLoc();
37909467b48Spatrick PrintFatalError(Loc, "Sub-register can't have two names: " +
38009467b48Spatrick SubReg.second->getName() + " available as " +
38109467b48Spatrick SubReg.first->getName() + " and " + Ins->second->getName());
38209467b48Spatrick }
38309467b48Spatrick
38409467b48Spatrick // Derive possible names for sub-register concatenations from any explicit
38509467b48Spatrick // sub-registers. By doing this before computeSecondarySubRegs(), we ensure
38609467b48Spatrick // that getConcatSubRegIndex() won't invent any concatenated indices that the
38709467b48Spatrick // user already specified.
38809467b48Spatrick for (unsigned i = 0, e = ExplicitSubRegs.size(); i != e; ++i) {
38909467b48Spatrick CodeGenRegister *SR = ExplicitSubRegs[i];
39009467b48Spatrick if (!SR->CoveredBySubRegs || SR->ExplicitSubRegs.size() <= 1 ||
39109467b48Spatrick SR->Artificial)
39209467b48Spatrick continue;
39309467b48Spatrick
39409467b48Spatrick // SR is composed of multiple sub-regs. Find their names in this register.
39509467b48Spatrick SmallVector<CodeGenSubRegIndex*, 8> Parts;
39609467b48Spatrick for (unsigned j = 0, e = SR->ExplicitSubRegs.size(); j != e; ++j) {
39709467b48Spatrick CodeGenSubRegIndex &I = *SR->ExplicitSubRegIndices[j];
39809467b48Spatrick if (!I.Artificial)
39909467b48Spatrick Parts.push_back(getSubRegIndex(SR->ExplicitSubRegs[j]));
40009467b48Spatrick }
40109467b48Spatrick
40209467b48Spatrick // Offer this as an existing spelling for the concatenation of Parts.
40309467b48Spatrick CodeGenSubRegIndex &Idx = *ExplicitSubRegIndices[i];
40409467b48Spatrick Idx.setConcatenationOf(Parts);
40509467b48Spatrick }
40609467b48Spatrick
40709467b48Spatrick // Initialize RegUnitList. Because getSubRegs is called recursively, this
40809467b48Spatrick // processes the register hierarchy in postorder.
40909467b48Spatrick //
41009467b48Spatrick // Inherit all sub-register units. It is good enough to look at the explicit
41109467b48Spatrick // sub-registers, the other registers won't contribute any more units.
41209467b48Spatrick for (unsigned i = 0, e = ExplicitSubRegs.size(); i != e; ++i) {
41309467b48Spatrick CodeGenRegister *SR = ExplicitSubRegs[i];
41409467b48Spatrick RegUnits |= SR->RegUnits;
41509467b48Spatrick }
41609467b48Spatrick
41709467b48Spatrick // Absent any ad hoc aliasing, we create one register unit per leaf register.
41809467b48Spatrick // These units correspond to the maximal cliques in the register overlap
41909467b48Spatrick // graph which is optimal.
42009467b48Spatrick //
42109467b48Spatrick // When there is ad hoc aliasing, we simply create one unit per edge in the
42209467b48Spatrick // undirected ad hoc aliasing graph. Technically, we could do better by
42309467b48Spatrick // identifying maximal cliques in the ad hoc graph, but cliques larger than 2
42409467b48Spatrick // are extremely rare anyway (I've never seen one), so we don't bother with
42509467b48Spatrick // the added complexity.
42609467b48Spatrick for (unsigned i = 0, e = ExplicitAliases.size(); i != e; ++i) {
42709467b48Spatrick CodeGenRegister *AR = ExplicitAliases[i];
42809467b48Spatrick // Only visit each edge once.
42909467b48Spatrick if (AR->SubRegsComplete)
43009467b48Spatrick continue;
43109467b48Spatrick // Create a RegUnit representing this alias edge, and add it to both
43209467b48Spatrick // registers.
43309467b48Spatrick unsigned Unit = RegBank.newRegUnit(this, AR);
43409467b48Spatrick RegUnits.set(Unit);
43509467b48Spatrick AR->RegUnits.set(Unit);
43609467b48Spatrick }
43709467b48Spatrick
43809467b48Spatrick // Finally, create units for leaf registers without ad hoc aliases. Note that
43909467b48Spatrick // a leaf register with ad hoc aliases doesn't get its own unit - it isn't
44009467b48Spatrick // necessary. This means the aliasing leaf registers can share a single unit.
44109467b48Spatrick if (RegUnits.empty())
44209467b48Spatrick RegUnits.set(RegBank.newRegUnit(this));
44309467b48Spatrick
44409467b48Spatrick // We have now computed the native register units. More may be adopted later
44509467b48Spatrick // for balancing purposes.
44609467b48Spatrick NativeRegUnits = RegUnits;
44709467b48Spatrick
44809467b48Spatrick return SubRegs;
44909467b48Spatrick }
45009467b48Spatrick
45109467b48Spatrick // In a register that is covered by its sub-registers, try to find redundant
45209467b48Spatrick // sub-registers. For example:
45309467b48Spatrick //
45409467b48Spatrick // QQ0 = {Q0, Q1}
45509467b48Spatrick // Q0 = {D0, D1}
45609467b48Spatrick // Q1 = {D2, D3}
45709467b48Spatrick //
45809467b48Spatrick // We can infer that D1_D2 is also a sub-register, even if it wasn't named in
45909467b48Spatrick // the register definition.
46009467b48Spatrick //
46109467b48Spatrick // The explicitly specified registers form a tree. This function discovers
46209467b48Spatrick // sub-register relationships that would force a DAG.
46309467b48Spatrick //
computeSecondarySubRegs(CodeGenRegBank & RegBank)46409467b48Spatrick void CodeGenRegister::computeSecondarySubRegs(CodeGenRegBank &RegBank) {
46509467b48Spatrick SmallVector<SubRegMap::value_type, 8> NewSubRegs;
46609467b48Spatrick
46709467b48Spatrick std::queue<std::pair<CodeGenSubRegIndex*,CodeGenRegister*>> SubRegQueue;
46809467b48Spatrick for (std::pair<CodeGenSubRegIndex*,CodeGenRegister*> P : SubRegs)
46909467b48Spatrick SubRegQueue.push(P);
47009467b48Spatrick
47109467b48Spatrick // Look at the leading super-registers of each sub-register. Those are the
47209467b48Spatrick // candidates for new sub-registers, assuming they are fully contained in
47309467b48Spatrick // this register.
47409467b48Spatrick while (!SubRegQueue.empty()) {
47509467b48Spatrick CodeGenSubRegIndex *SubRegIdx;
47609467b48Spatrick const CodeGenRegister *SubReg;
47709467b48Spatrick std::tie(SubRegIdx, SubReg) = SubRegQueue.front();
47809467b48Spatrick SubRegQueue.pop();
47909467b48Spatrick
48009467b48Spatrick const CodeGenRegister::SuperRegList &Leads = SubReg->LeadingSuperRegs;
48109467b48Spatrick for (unsigned i = 0, e = Leads.size(); i != e; ++i) {
48209467b48Spatrick CodeGenRegister *Cand = const_cast<CodeGenRegister*>(Leads[i]);
48309467b48Spatrick // Already got this sub-register?
48409467b48Spatrick if (Cand == this || getSubRegIndex(Cand))
48509467b48Spatrick continue;
48609467b48Spatrick // Check if each component of Cand is already a sub-register.
48709467b48Spatrick assert(!Cand->ExplicitSubRegs.empty() &&
48809467b48Spatrick "Super-register has no sub-registers");
48909467b48Spatrick if (Cand->ExplicitSubRegs.size() == 1)
49009467b48Spatrick continue;
49109467b48Spatrick SmallVector<CodeGenSubRegIndex*, 8> Parts;
49209467b48Spatrick // We know that the first component is (SubRegIdx,SubReg). However we
49309467b48Spatrick // may still need to split it into smaller subregister parts.
49409467b48Spatrick assert(Cand->ExplicitSubRegs[0] == SubReg && "LeadingSuperRegs correct");
49509467b48Spatrick assert(getSubRegIndex(SubReg) == SubRegIdx && "LeadingSuperRegs correct");
49609467b48Spatrick for (CodeGenRegister *SubReg : Cand->ExplicitSubRegs) {
49709467b48Spatrick if (CodeGenSubRegIndex *SubRegIdx = getSubRegIndex(SubReg)) {
49873471bf0Spatrick if (SubRegIdx->ConcatenationOf.empty())
49909467b48Spatrick Parts.push_back(SubRegIdx);
50073471bf0Spatrick else
50173471bf0Spatrick append_range(Parts, SubRegIdx->ConcatenationOf);
50209467b48Spatrick } else {
50309467b48Spatrick // Sub-register doesn't exist.
50409467b48Spatrick Parts.clear();
50509467b48Spatrick break;
50609467b48Spatrick }
50709467b48Spatrick }
50809467b48Spatrick // There is nothing to do if some Cand sub-register is not part of this
50909467b48Spatrick // register.
51009467b48Spatrick if (Parts.empty())
51109467b48Spatrick continue;
51209467b48Spatrick
51309467b48Spatrick // Each part of Cand is a sub-register of this. Make the full Cand also
51409467b48Spatrick // a sub-register with a concatenated sub-register index.
51509467b48Spatrick CodeGenSubRegIndex *Concat = RegBank.getConcatSubRegIndex(Parts);
51609467b48Spatrick std::pair<CodeGenSubRegIndex*,CodeGenRegister*> NewSubReg =
51709467b48Spatrick std::make_pair(Concat, Cand);
51809467b48Spatrick
51909467b48Spatrick if (!SubRegs.insert(NewSubReg).second)
52009467b48Spatrick continue;
52109467b48Spatrick
52209467b48Spatrick // We inserted a new subregister.
52309467b48Spatrick NewSubRegs.push_back(NewSubReg);
52409467b48Spatrick SubRegQueue.push(NewSubReg);
52509467b48Spatrick SubReg2Idx.insert(std::make_pair(Cand, Concat));
52609467b48Spatrick }
52709467b48Spatrick }
52809467b48Spatrick
52909467b48Spatrick // Create sub-register index composition maps for the synthesized indices.
53009467b48Spatrick for (unsigned i = 0, e = NewSubRegs.size(); i != e; ++i) {
53109467b48Spatrick CodeGenSubRegIndex *NewIdx = NewSubRegs[i].first;
53209467b48Spatrick CodeGenRegister *NewSubReg = NewSubRegs[i].second;
53373471bf0Spatrick for (auto SubReg : NewSubReg->SubRegs) {
53473471bf0Spatrick CodeGenSubRegIndex *SubIdx = getSubRegIndex(SubReg.second);
53509467b48Spatrick if (!SubIdx)
53609467b48Spatrick PrintFatalError(TheDef->getLoc(), "No SubRegIndex for " +
53773471bf0Spatrick SubReg.second->getName() +
53873471bf0Spatrick " in " + getName());
53973471bf0Spatrick NewIdx->addComposite(SubReg.first, SubIdx);
54009467b48Spatrick }
54109467b48Spatrick }
54209467b48Spatrick }
54309467b48Spatrick
computeSuperRegs(CodeGenRegBank & RegBank)54409467b48Spatrick void CodeGenRegister::computeSuperRegs(CodeGenRegBank &RegBank) {
54509467b48Spatrick // Only visit each register once.
54609467b48Spatrick if (SuperRegsComplete)
54709467b48Spatrick return;
54809467b48Spatrick SuperRegsComplete = true;
54909467b48Spatrick
55009467b48Spatrick // Make sure all sub-registers have been visited first, so the super-reg
55109467b48Spatrick // lists will be topologically ordered.
55273471bf0Spatrick for (auto SubReg : SubRegs)
55373471bf0Spatrick SubReg.second->computeSuperRegs(RegBank);
55409467b48Spatrick
55509467b48Spatrick // Now add this as a super-register on all sub-registers.
55609467b48Spatrick // Also compute the TopoSigId in post-order.
55709467b48Spatrick TopoSigId Id;
55873471bf0Spatrick for (auto SubReg : SubRegs) {
55909467b48Spatrick // Topological signature computed from SubIdx, TopoId(SubReg).
56009467b48Spatrick // Loops and idempotent indices have TopoSig = ~0u.
56173471bf0Spatrick Id.push_back(SubReg.first->EnumValue);
56273471bf0Spatrick Id.push_back(SubReg.second->TopoSig);
56309467b48Spatrick
56409467b48Spatrick // Don't add duplicate entries.
56573471bf0Spatrick if (!SubReg.second->SuperRegs.empty() &&
56673471bf0Spatrick SubReg.second->SuperRegs.back() == this)
56709467b48Spatrick continue;
56873471bf0Spatrick SubReg.second->SuperRegs.push_back(this);
56909467b48Spatrick }
57009467b48Spatrick TopoSig = RegBank.getTopoSig(Id);
57109467b48Spatrick }
57209467b48Spatrick
57309467b48Spatrick void
addSubRegsPreOrder(SetVector<const CodeGenRegister * > & OSet,CodeGenRegBank & RegBank) const57409467b48Spatrick CodeGenRegister::addSubRegsPreOrder(SetVector<const CodeGenRegister*> &OSet,
57509467b48Spatrick CodeGenRegBank &RegBank) const {
57609467b48Spatrick assert(SubRegsComplete && "Must precompute sub-registers");
57709467b48Spatrick for (unsigned i = 0, e = ExplicitSubRegs.size(); i != e; ++i) {
57809467b48Spatrick CodeGenRegister *SR = ExplicitSubRegs[i];
57909467b48Spatrick if (OSet.insert(SR))
58009467b48Spatrick SR->addSubRegsPreOrder(OSet, RegBank);
58109467b48Spatrick }
58209467b48Spatrick // Add any secondary sub-registers that weren't part of the explicit tree.
58373471bf0Spatrick for (auto SubReg : SubRegs)
58473471bf0Spatrick OSet.insert(SubReg.second);
58509467b48Spatrick }
58609467b48Spatrick
58709467b48Spatrick // Get the sum of this register's unit weights.
getWeight(const CodeGenRegBank & RegBank) const58809467b48Spatrick unsigned CodeGenRegister::getWeight(const CodeGenRegBank &RegBank) const {
58909467b48Spatrick unsigned Weight = 0;
59073471bf0Spatrick for (unsigned RegUnit : RegUnits) {
59173471bf0Spatrick Weight += RegBank.getRegUnit(RegUnit).Weight;
59209467b48Spatrick }
59309467b48Spatrick return Weight;
59409467b48Spatrick }
59509467b48Spatrick
59609467b48Spatrick //===----------------------------------------------------------------------===//
59709467b48Spatrick // RegisterTuples
59809467b48Spatrick //===----------------------------------------------------------------------===//
59909467b48Spatrick
60009467b48Spatrick // A RegisterTuples def is used to generate pseudo-registers from lists of
60109467b48Spatrick // sub-registers. We provide a SetTheory expander class that returns the new
60209467b48Spatrick // registers.
60309467b48Spatrick namespace {
60409467b48Spatrick
60509467b48Spatrick struct TupleExpander : SetTheory::Expander {
60609467b48Spatrick // Reference to SynthDefs in the containing CodeGenRegBank, to keep track of
60709467b48Spatrick // the synthesized definitions for their lifetime.
60809467b48Spatrick std::vector<std::unique_ptr<Record>> &SynthDefs;
60909467b48Spatrick
TupleExpander__anon1b76e19f0211::TupleExpander61009467b48Spatrick TupleExpander(std::vector<std::unique_ptr<Record>> &SynthDefs)
61109467b48Spatrick : SynthDefs(SynthDefs) {}
61209467b48Spatrick
expand__anon1b76e19f0211::TupleExpander61309467b48Spatrick void expand(SetTheory &ST, Record *Def, SetTheory::RecSet &Elts) override {
61409467b48Spatrick std::vector<Record*> Indices = Def->getValueAsListOfDefs("SubRegIndices");
61509467b48Spatrick unsigned Dim = Indices.size();
61609467b48Spatrick ListInit *SubRegs = Def->getValueAsListInit("SubRegs");
61709467b48Spatrick if (Dim != SubRegs->size())
61809467b48Spatrick PrintFatalError(Def->getLoc(), "SubRegIndices and SubRegs size mismatch");
61909467b48Spatrick if (Dim < 2)
62009467b48Spatrick PrintFatalError(Def->getLoc(),
62109467b48Spatrick "Tuples must have at least 2 sub-registers");
62209467b48Spatrick
62309467b48Spatrick // Evaluate the sub-register lists to be zipped.
62409467b48Spatrick unsigned Length = ~0u;
62509467b48Spatrick SmallVector<SetTheory::RecSet, 4> Lists(Dim);
62609467b48Spatrick for (unsigned i = 0; i != Dim; ++i) {
62709467b48Spatrick ST.evaluate(SubRegs->getElement(i), Lists[i], Def->getLoc());
62809467b48Spatrick Length = std::min(Length, unsigned(Lists[i].size()));
62909467b48Spatrick }
63009467b48Spatrick
63109467b48Spatrick if (Length == 0)
63209467b48Spatrick return;
63309467b48Spatrick
63409467b48Spatrick // Precompute some types.
63509467b48Spatrick Record *RegisterCl = Def->getRecords().getClass("Register");
63609467b48Spatrick RecTy *RegisterRecTy = RecordRecTy::get(RegisterCl);
63709467b48Spatrick std::vector<StringRef> RegNames =
63809467b48Spatrick Def->getValueAsListOfStrings("RegAsmNames");
63909467b48Spatrick
64009467b48Spatrick // Zip them up.
641*d415bd75Srobert RecordKeeper &RK = Def->getRecords();
64209467b48Spatrick for (unsigned n = 0; n != Length; ++n) {
64309467b48Spatrick std::string Name;
64409467b48Spatrick Record *Proto = Lists[0][n];
64509467b48Spatrick std::vector<Init*> Tuple;
64609467b48Spatrick for (unsigned i = 0; i != Dim; ++i) {
64709467b48Spatrick Record *Reg = Lists[i][n];
64809467b48Spatrick if (i) Name += '_';
64909467b48Spatrick Name += Reg->getName();
65009467b48Spatrick Tuple.push_back(DefInit::get(Reg));
65109467b48Spatrick }
65209467b48Spatrick
65373471bf0Spatrick // Take the cost list of the first register in the tuple.
65473471bf0Spatrick ListInit *CostList = Proto->getValueAsListInit("CostPerUse");
65573471bf0Spatrick SmallVector<Init *, 2> CostPerUse;
65673471bf0Spatrick CostPerUse.insert(CostPerUse.end(), CostList->begin(), CostList->end());
65773471bf0Spatrick
658*d415bd75Srobert StringInit *AsmName = StringInit::get(RK, "");
65909467b48Spatrick if (!RegNames.empty()) {
66009467b48Spatrick if (RegNames.size() <= n)
66109467b48Spatrick PrintFatalError(Def->getLoc(),
66209467b48Spatrick "Register tuple definition missing name for '" +
66309467b48Spatrick Name + "'.");
664*d415bd75Srobert AsmName = StringInit::get(RK, RegNames[n]);
66509467b48Spatrick }
66609467b48Spatrick
66709467b48Spatrick // Create a new Record representing the synthesized register. This record
66809467b48Spatrick // is only for consumption by CodeGenRegister, it is not added to the
66909467b48Spatrick // RecordKeeper.
67009467b48Spatrick SynthDefs.emplace_back(
67109467b48Spatrick std::make_unique<Record>(Name, Def->getLoc(), Def->getRecords()));
67209467b48Spatrick Record *NewReg = SynthDefs.back().get();
67309467b48Spatrick Elts.insert(NewReg);
67409467b48Spatrick
67509467b48Spatrick // Copy Proto super-classes.
67609467b48Spatrick ArrayRef<std::pair<Record *, SMRange>> Supers = Proto->getSuperClasses();
67709467b48Spatrick for (const auto &SuperPair : Supers)
67809467b48Spatrick NewReg->addSuperClass(SuperPair.first, SuperPair.second);
67909467b48Spatrick
68009467b48Spatrick // Copy Proto fields.
68109467b48Spatrick for (unsigned i = 0, e = Proto->getValues().size(); i != e; ++i) {
68209467b48Spatrick RecordVal RV = Proto->getValues()[i];
68309467b48Spatrick
68409467b48Spatrick // Skip existing fields, like NAME.
68509467b48Spatrick if (NewReg->getValue(RV.getNameInit()))
68609467b48Spatrick continue;
68709467b48Spatrick
68809467b48Spatrick StringRef Field = RV.getName();
68909467b48Spatrick
69009467b48Spatrick // Replace the sub-register list with Tuple.
69109467b48Spatrick if (Field == "SubRegs")
69209467b48Spatrick RV.setValue(ListInit::get(Tuple, RegisterRecTy));
69309467b48Spatrick
69409467b48Spatrick if (Field == "AsmName")
69509467b48Spatrick RV.setValue(AsmName);
69609467b48Spatrick
69709467b48Spatrick // CostPerUse is aggregated from all Tuple members.
69809467b48Spatrick if (Field == "CostPerUse")
69973471bf0Spatrick RV.setValue(ListInit::get(CostPerUse, CostList->getElementType()));
70009467b48Spatrick
70109467b48Spatrick // Composite registers are always covered by sub-registers.
70209467b48Spatrick if (Field == "CoveredBySubRegs")
703*d415bd75Srobert RV.setValue(BitInit::get(RK, true));
70409467b48Spatrick
70509467b48Spatrick // Copy fields from the RegisterTuples def.
70609467b48Spatrick if (Field == "SubRegIndices" ||
70709467b48Spatrick Field == "CompositeIndices") {
70809467b48Spatrick NewReg->addValue(*Def->getValue(Field));
70909467b48Spatrick continue;
71009467b48Spatrick }
71109467b48Spatrick
71209467b48Spatrick // Some fields get their default uninitialized value.
71309467b48Spatrick if (Field == "DwarfNumbers" ||
71409467b48Spatrick Field == "DwarfAlias" ||
71509467b48Spatrick Field == "Aliases") {
71609467b48Spatrick if (const RecordVal *DefRV = RegisterCl->getValue(Field))
71709467b48Spatrick NewReg->addValue(*DefRV);
71809467b48Spatrick continue;
71909467b48Spatrick }
72009467b48Spatrick
72109467b48Spatrick // Everything else is copied from Proto.
72209467b48Spatrick NewReg->addValue(RV);
72309467b48Spatrick }
72409467b48Spatrick }
72509467b48Spatrick }
72609467b48Spatrick };
72709467b48Spatrick
72809467b48Spatrick } // end anonymous namespace
72909467b48Spatrick
73009467b48Spatrick //===----------------------------------------------------------------------===//
73109467b48Spatrick // CodeGenRegisterClass
73209467b48Spatrick //===----------------------------------------------------------------------===//
73309467b48Spatrick
sortAndUniqueRegisters(CodeGenRegister::Vec & M)73409467b48Spatrick static void sortAndUniqueRegisters(CodeGenRegister::Vec &M) {
73509467b48Spatrick llvm::sort(M, deref<std::less<>>());
73609467b48Spatrick M.erase(std::unique(M.begin(), M.end(), deref<std::equal_to<>>()), M.end());
73709467b48Spatrick }
73809467b48Spatrick
CodeGenRegisterClass(CodeGenRegBank & RegBank,Record * R)73909467b48Spatrick CodeGenRegisterClass::CodeGenRegisterClass(CodeGenRegBank &RegBank, Record *R)
740097a140dSpatrick : TheDef(R), Name(std::string(R->getName())),
741*d415bd75Srobert TopoSigs(RegBank.getNumTopoSigs()), EnumValue(-1), TSFlags(0) {
742097a140dSpatrick GeneratePressureSet = R->getValueAsBit("GeneratePressureSet");
74309467b48Spatrick std::vector<Record*> TypeList = R->getValueAsListOfDefs("RegTypes");
74473471bf0Spatrick if (TypeList.empty())
74573471bf0Spatrick PrintFatalError(R->getLoc(), "RegTypes list must not be empty!");
74609467b48Spatrick for (unsigned i = 0, e = TypeList.size(); i != e; ++i) {
74709467b48Spatrick Record *Type = TypeList[i];
74809467b48Spatrick if (!Type->isSubClassOf("ValueType"))
74909467b48Spatrick PrintFatalError(R->getLoc(),
75009467b48Spatrick "RegTypes list member '" + Type->getName() +
75109467b48Spatrick "' does not derive from the ValueType class!");
75209467b48Spatrick VTs.push_back(getValueTypeByHwMode(Type, RegBank.getHwModes()));
75309467b48Spatrick }
75409467b48Spatrick
75509467b48Spatrick // Allocation order 0 is the full set. AltOrders provides others.
75609467b48Spatrick const SetTheory::RecVec *Elements = RegBank.getSets().expand(R);
75709467b48Spatrick ListInit *AltOrders = R->getValueAsListInit("AltOrders");
75809467b48Spatrick Orders.resize(1 + AltOrders->size());
75909467b48Spatrick
76009467b48Spatrick // Default allocation order always contains all registers.
76109467b48Spatrick Artificial = true;
76209467b48Spatrick for (unsigned i = 0, e = Elements->size(); i != e; ++i) {
76309467b48Spatrick Orders[0].push_back((*Elements)[i]);
76409467b48Spatrick const CodeGenRegister *Reg = RegBank.getReg((*Elements)[i]);
76509467b48Spatrick Members.push_back(Reg);
76609467b48Spatrick Artificial &= Reg->Artificial;
76709467b48Spatrick TopoSigs.set(Reg->getTopoSig());
76809467b48Spatrick }
76909467b48Spatrick sortAndUniqueRegisters(Members);
77009467b48Spatrick
77109467b48Spatrick // Alternative allocation orders may be subsets.
77209467b48Spatrick SetTheory::RecSet Order;
77309467b48Spatrick for (unsigned i = 0, e = AltOrders->size(); i != e; ++i) {
77409467b48Spatrick RegBank.getSets().evaluate(AltOrders->getElement(i), Order, R->getLoc());
77509467b48Spatrick Orders[1 + i].append(Order.begin(), Order.end());
77609467b48Spatrick // Verify that all altorder members are regclass members.
77709467b48Spatrick while (!Order.empty()) {
77809467b48Spatrick CodeGenRegister *Reg = RegBank.getReg(Order.back());
77909467b48Spatrick Order.pop_back();
78009467b48Spatrick if (!contains(Reg))
78109467b48Spatrick PrintFatalError(R->getLoc(), " AltOrder register " + Reg->getName() +
78209467b48Spatrick " is not a class member");
78309467b48Spatrick }
78409467b48Spatrick }
78509467b48Spatrick
78609467b48Spatrick Namespace = R->getValueAsString("Namespace");
78709467b48Spatrick
78809467b48Spatrick if (const RecordVal *RV = R->getValue("RegInfos"))
78909467b48Spatrick if (DefInit *DI = dyn_cast_or_null<DefInit>(RV->getValue()))
79009467b48Spatrick RSI = RegSizeInfoByHwMode(DI->getDef(), RegBank.getHwModes());
79109467b48Spatrick unsigned Size = R->getValueAsInt("Size");
79209467b48Spatrick assert((RSI.hasDefault() || Size != 0 || VTs[0].isSimple()) &&
79309467b48Spatrick "Impossible to determine register size");
79409467b48Spatrick if (!RSI.hasDefault()) {
79509467b48Spatrick RegSizeInfo RI;
79609467b48Spatrick RI.RegSize = RI.SpillSize = Size ? Size
79709467b48Spatrick : VTs[0].getSimple().getSizeInBits();
79809467b48Spatrick RI.SpillAlignment = R->getValueAsInt("Alignment");
79973471bf0Spatrick RSI.insertRegSizeForMode(DefaultMode, RI);
80009467b48Spatrick }
80109467b48Spatrick
80209467b48Spatrick CopyCost = R->getValueAsInt("CopyCost");
80309467b48Spatrick Allocatable = R->getValueAsBit("isAllocatable");
80409467b48Spatrick AltOrderSelect = R->getValueAsString("AltOrderSelect");
80509467b48Spatrick int AllocationPriority = R->getValueAsInt("AllocationPriority");
806*d415bd75Srobert if (!isUInt<5>(AllocationPriority))
807*d415bd75Srobert PrintFatalError(R->getLoc(), "AllocationPriority out of range [0,31]");
80809467b48Spatrick this->AllocationPriority = AllocationPriority;
809*d415bd75Srobert
810*d415bd75Srobert GlobalPriority = R->getValueAsBit("GlobalPriority");
811*d415bd75Srobert
812*d415bd75Srobert BitsInit *TSF = R->getValueAsBitsInit("TSFlags");
813*d415bd75Srobert for (unsigned I = 0, E = TSF->getNumBits(); I != E; ++I) {
814*d415bd75Srobert BitInit *Bit = cast<BitInit>(TSF->getBit(I));
815*d415bd75Srobert TSFlags |= uint8_t(Bit->getValue()) << I;
816*d415bd75Srobert }
81709467b48Spatrick }
81809467b48Spatrick
81909467b48Spatrick // Create an inferred register class that was missing from the .td files.
82009467b48Spatrick // Most properties will be inherited from the closest super-class after the
82109467b48Spatrick // class structure has been computed.
CodeGenRegisterClass(CodeGenRegBank & RegBank,StringRef Name,Key Props)82209467b48Spatrick CodeGenRegisterClass::CodeGenRegisterClass(CodeGenRegBank &RegBank,
82309467b48Spatrick StringRef Name, Key Props)
824097a140dSpatrick : Members(*Props.Members), TheDef(nullptr), Name(std::string(Name)),
825097a140dSpatrick TopoSigs(RegBank.getNumTopoSigs()), EnumValue(-1), RSI(Props.RSI),
826*d415bd75Srobert CopyCost(0), Allocatable(true), AllocationPriority(0),
827*d415bd75Srobert GlobalPriority(false), TSFlags(0) {
82809467b48Spatrick Artificial = true;
829097a140dSpatrick GeneratePressureSet = false;
83009467b48Spatrick for (const auto R : Members) {
83109467b48Spatrick TopoSigs.set(R->getTopoSig());
83209467b48Spatrick Artificial &= R->Artificial;
83309467b48Spatrick }
83409467b48Spatrick }
83509467b48Spatrick
83609467b48Spatrick // Compute inherited propertied for a synthesized register class.
inheritProperties(CodeGenRegBank & RegBank)83709467b48Spatrick void CodeGenRegisterClass::inheritProperties(CodeGenRegBank &RegBank) {
83809467b48Spatrick assert(!getDef() && "Only synthesized classes can inherit properties");
83909467b48Spatrick assert(!SuperClasses.empty() && "Synthesized class without super class");
84009467b48Spatrick
84109467b48Spatrick // The last super-class is the smallest one.
84209467b48Spatrick CodeGenRegisterClass &Super = *SuperClasses.back();
84309467b48Spatrick
84409467b48Spatrick // Most properties are copied directly.
84509467b48Spatrick // Exceptions are members, size, and alignment
84609467b48Spatrick Namespace = Super.Namespace;
84709467b48Spatrick VTs = Super.VTs;
84809467b48Spatrick CopyCost = Super.CopyCost;
84973471bf0Spatrick // Check for allocatable superclasses.
85073471bf0Spatrick Allocatable = any_of(SuperClasses, [&](const CodeGenRegisterClass *S) {
85173471bf0Spatrick return S->Allocatable;
85273471bf0Spatrick });
85309467b48Spatrick AltOrderSelect = Super.AltOrderSelect;
85409467b48Spatrick AllocationPriority = Super.AllocationPriority;
855*d415bd75Srobert GlobalPriority = Super.GlobalPriority;
856*d415bd75Srobert TSFlags = Super.TSFlags;
857097a140dSpatrick GeneratePressureSet |= Super.GeneratePressureSet;
85809467b48Spatrick
85909467b48Spatrick // Copy all allocation orders, filter out foreign registers from the larger
86009467b48Spatrick // super-class.
86109467b48Spatrick Orders.resize(Super.Orders.size());
86209467b48Spatrick for (unsigned i = 0, ie = Super.Orders.size(); i != ie; ++i)
86309467b48Spatrick for (unsigned j = 0, je = Super.Orders[i].size(); j != je; ++j)
86409467b48Spatrick if (contains(RegBank.getReg(Super.Orders[i][j])))
86509467b48Spatrick Orders[i].push_back(Super.Orders[i][j]);
86609467b48Spatrick }
86709467b48Spatrick
hasType(const ValueTypeByHwMode & VT) const868*d415bd75Srobert bool CodeGenRegisterClass::hasType(const ValueTypeByHwMode &VT) const {
869*d415bd75Srobert if (llvm::is_contained(VTs, VT))
870*d415bd75Srobert return true;
871*d415bd75Srobert
872*d415bd75Srobert // If VT is not identical to any of this class's types, but is a simple
873*d415bd75Srobert // type, check if any of the types for this class contain it under some
874*d415bd75Srobert // mode.
875*d415bd75Srobert // The motivating example came from RISCV, where (likely because of being
876*d415bd75Srobert // guarded by "64-bit" predicate), the type of X5 was {*:[i64]}, but the
877*d415bd75Srobert // type in GRC was {*:[i32], m1:[i64]}.
878*d415bd75Srobert if (VT.isSimple()) {
879*d415bd75Srobert MVT T = VT.getSimple();
880*d415bd75Srobert for (const ValueTypeByHwMode &OurVT : VTs) {
881*d415bd75Srobert if (llvm::count_if(OurVT, [T](auto &&P) { return P.second == T; }))
882*d415bd75Srobert return true;
883*d415bd75Srobert }
884*d415bd75Srobert }
885*d415bd75Srobert return false;
886*d415bd75Srobert }
887*d415bd75Srobert
contains(const CodeGenRegister * Reg) const88809467b48Spatrick bool CodeGenRegisterClass::contains(const CodeGenRegister *Reg) const {
88909467b48Spatrick return std::binary_search(Members.begin(), Members.end(), Reg,
89009467b48Spatrick deref<std::less<>>());
89109467b48Spatrick }
89209467b48Spatrick
getWeight(const CodeGenRegBank & RegBank) const893097a140dSpatrick unsigned CodeGenRegisterClass::getWeight(const CodeGenRegBank& RegBank) const {
894097a140dSpatrick if (TheDef && !TheDef->isValueUnset("Weight"))
895097a140dSpatrick return TheDef->getValueAsInt("Weight");
896097a140dSpatrick
897097a140dSpatrick if (Members.empty() || Artificial)
898097a140dSpatrick return 0;
899097a140dSpatrick
900097a140dSpatrick return (*Members.begin())->getWeight(RegBank);
901097a140dSpatrick }
902097a140dSpatrick
90309467b48Spatrick namespace llvm {
90409467b48Spatrick
operator <<(raw_ostream & OS,const CodeGenRegisterClass::Key & K)90509467b48Spatrick raw_ostream &operator<<(raw_ostream &OS, const CodeGenRegisterClass::Key &K) {
90609467b48Spatrick OS << "{ " << K.RSI;
90709467b48Spatrick for (const auto R : *K.Members)
90809467b48Spatrick OS << ", " << R->getName();
90909467b48Spatrick return OS << " }";
91009467b48Spatrick }
91109467b48Spatrick
91209467b48Spatrick } // end namespace llvm
91309467b48Spatrick
91409467b48Spatrick // This is a simple lexicographical order that can be used to search for sets.
91509467b48Spatrick // It is not the same as the topological order provided by TopoOrderRC.
91609467b48Spatrick bool CodeGenRegisterClass::Key::
operator <(const CodeGenRegisterClass::Key & B) const91709467b48Spatrick operator<(const CodeGenRegisterClass::Key &B) const {
91809467b48Spatrick assert(Members && B.Members);
91909467b48Spatrick return std::tie(*Members, RSI) < std::tie(*B.Members, B.RSI);
92009467b48Spatrick }
92109467b48Spatrick
92209467b48Spatrick // Returns true if RC is a strict subclass.
92309467b48Spatrick // RC is a sub-class of this class if it is a valid replacement for any
92409467b48Spatrick // instruction operand where a register of this classis required. It must
92509467b48Spatrick // satisfy these conditions:
92609467b48Spatrick //
92709467b48Spatrick // 1. All RC registers are also in this.
92809467b48Spatrick // 2. The RC spill size must not be smaller than our spill size.
92909467b48Spatrick // 3. RC spill alignment must be compatible with ours.
93009467b48Spatrick //
testSubClass(const CodeGenRegisterClass * A,const CodeGenRegisterClass * B)93109467b48Spatrick static bool testSubClass(const CodeGenRegisterClass *A,
93209467b48Spatrick const CodeGenRegisterClass *B) {
93309467b48Spatrick return A->RSI.isSubClassOf(B->RSI) &&
93409467b48Spatrick std::includes(A->getMembers().begin(), A->getMembers().end(),
93509467b48Spatrick B->getMembers().begin(), B->getMembers().end(),
93609467b48Spatrick deref<std::less<>>());
93709467b48Spatrick }
93809467b48Spatrick
93909467b48Spatrick /// Sorting predicate for register classes. This provides a topological
94009467b48Spatrick /// ordering that arranges all register classes before their sub-classes.
94109467b48Spatrick ///
94209467b48Spatrick /// Register classes with the same registers, spill size, and alignment form a
94309467b48Spatrick /// clique. They will be ordered alphabetically.
94409467b48Spatrick ///
TopoOrderRC(const CodeGenRegisterClass & PA,const CodeGenRegisterClass & PB)94509467b48Spatrick static bool TopoOrderRC(const CodeGenRegisterClass &PA,
94609467b48Spatrick const CodeGenRegisterClass &PB) {
94709467b48Spatrick auto *A = &PA;
94809467b48Spatrick auto *B = &PB;
94909467b48Spatrick if (A == B)
95009467b48Spatrick return false;
95109467b48Spatrick
95209467b48Spatrick if (A->RSI < B->RSI)
95309467b48Spatrick return true;
95409467b48Spatrick if (A->RSI != B->RSI)
95509467b48Spatrick return false;
95609467b48Spatrick
95709467b48Spatrick // Order by descending set size. Note that the classes' allocation order may
95809467b48Spatrick // not have been computed yet. The Members set is always vaild.
95909467b48Spatrick if (A->getMembers().size() > B->getMembers().size())
96009467b48Spatrick return true;
96109467b48Spatrick if (A->getMembers().size() < B->getMembers().size())
96209467b48Spatrick return false;
96309467b48Spatrick
96409467b48Spatrick // Finally order by name as a tie breaker.
96509467b48Spatrick return StringRef(A->getName()) < B->getName();
96609467b48Spatrick }
96709467b48Spatrick
getQualifiedName() const96809467b48Spatrick std::string CodeGenRegisterClass::getQualifiedName() const {
96909467b48Spatrick if (Namespace.empty())
97009467b48Spatrick return getName();
97109467b48Spatrick else
97209467b48Spatrick return (Namespace + "::" + getName()).str();
97309467b48Spatrick }
97409467b48Spatrick
97509467b48Spatrick // Compute sub-classes of all register classes.
97609467b48Spatrick // Assume the classes are ordered topologically.
computeSubClasses(CodeGenRegBank & RegBank)97709467b48Spatrick void CodeGenRegisterClass::computeSubClasses(CodeGenRegBank &RegBank) {
97809467b48Spatrick auto &RegClasses = RegBank.getRegClasses();
97909467b48Spatrick
98009467b48Spatrick // Visit backwards so sub-classes are seen first.
98109467b48Spatrick for (auto I = RegClasses.rbegin(), E = RegClasses.rend(); I != E; ++I) {
98209467b48Spatrick CodeGenRegisterClass &RC = *I;
98309467b48Spatrick RC.SubClasses.resize(RegClasses.size());
98409467b48Spatrick RC.SubClasses.set(RC.EnumValue);
98509467b48Spatrick if (RC.Artificial)
98609467b48Spatrick continue;
98709467b48Spatrick
98809467b48Spatrick // Normally, all subclasses have IDs >= rci, unless RC is part of a clique.
98909467b48Spatrick for (auto I2 = I.base(), E2 = RegClasses.end(); I2 != E2; ++I2) {
99009467b48Spatrick CodeGenRegisterClass &SubRC = *I2;
99109467b48Spatrick if (RC.SubClasses.test(SubRC.EnumValue))
99209467b48Spatrick continue;
99309467b48Spatrick if (!testSubClass(&RC, &SubRC))
99409467b48Spatrick continue;
99509467b48Spatrick // SubRC is a sub-class. Grap all its sub-classes so we won't have to
99609467b48Spatrick // check them again.
99709467b48Spatrick RC.SubClasses |= SubRC.SubClasses;
99809467b48Spatrick }
99909467b48Spatrick
100009467b48Spatrick // Sweep up missed clique members. They will be immediately preceding RC.
100109467b48Spatrick for (auto I2 = std::next(I); I2 != E && testSubClass(&RC, &*I2); ++I2)
100209467b48Spatrick RC.SubClasses.set(I2->EnumValue);
100309467b48Spatrick }
100409467b48Spatrick
100509467b48Spatrick // Compute the SuperClasses lists from the SubClasses vectors.
100609467b48Spatrick for (auto &RC : RegClasses) {
100709467b48Spatrick const BitVector &SC = RC.getSubClasses();
100809467b48Spatrick auto I = RegClasses.begin();
100909467b48Spatrick for (int s = 0, next_s = SC.find_first(); next_s != -1;
101009467b48Spatrick next_s = SC.find_next(s)) {
101109467b48Spatrick std::advance(I, next_s - s);
101209467b48Spatrick s = next_s;
101309467b48Spatrick if (&*I == &RC)
101409467b48Spatrick continue;
101509467b48Spatrick I->SuperClasses.push_back(&RC);
101609467b48Spatrick }
101709467b48Spatrick }
101809467b48Spatrick
101909467b48Spatrick // With the class hierarchy in place, let synthesized register classes inherit
102009467b48Spatrick // properties from their closest super-class. The iteration order here can
102109467b48Spatrick // propagate properties down multiple levels.
102209467b48Spatrick for (auto &RC : RegClasses)
102309467b48Spatrick if (!RC.getDef())
102409467b48Spatrick RC.inheritProperties(RegBank);
102509467b48Spatrick }
102609467b48Spatrick
1027*d415bd75Srobert std::optional<std::pair<CodeGenRegisterClass *, CodeGenRegisterClass *>>
getMatchingSubClassWithSubRegs(CodeGenRegBank & RegBank,const CodeGenSubRegIndex * SubIdx) const102809467b48Spatrick CodeGenRegisterClass::getMatchingSubClassWithSubRegs(
102909467b48Spatrick CodeGenRegBank &RegBank, const CodeGenSubRegIndex *SubIdx) const {
1030097a140dSpatrick auto SizeOrder = [this](const CodeGenRegisterClass *A,
103109467b48Spatrick const CodeGenRegisterClass *B) {
1032097a140dSpatrick // If there are multiple, identical register classes, prefer the original
1033097a140dSpatrick // register class.
103473471bf0Spatrick if (A == B)
103573471bf0Spatrick return false;
1036097a140dSpatrick if (A->getMembers().size() == B->getMembers().size())
1037097a140dSpatrick return A == this;
103809467b48Spatrick return A->getMembers().size() > B->getMembers().size();
103909467b48Spatrick };
104009467b48Spatrick
104109467b48Spatrick auto &RegClasses = RegBank.getRegClasses();
104209467b48Spatrick
104309467b48Spatrick // Find all the subclasses of this one that fully support the sub-register
104409467b48Spatrick // index and order them by size. BiggestSuperRC should always be first.
104509467b48Spatrick CodeGenRegisterClass *BiggestSuperRegRC = getSubClassWithSubReg(SubIdx);
104609467b48Spatrick if (!BiggestSuperRegRC)
1047*d415bd75Srobert return std::nullopt;
104809467b48Spatrick BitVector SuperRegRCsBV = BiggestSuperRegRC->getSubClasses();
104909467b48Spatrick std::vector<CodeGenRegisterClass *> SuperRegRCs;
105009467b48Spatrick for (auto &RC : RegClasses)
105109467b48Spatrick if (SuperRegRCsBV[RC.EnumValue])
105209467b48Spatrick SuperRegRCs.emplace_back(&RC);
1053097a140dSpatrick llvm::stable_sort(SuperRegRCs, SizeOrder);
1054097a140dSpatrick
1055097a140dSpatrick assert(SuperRegRCs.front() == BiggestSuperRegRC &&
1056097a140dSpatrick "Biggest class wasn't first");
105709467b48Spatrick
105809467b48Spatrick // Find all the subreg classes and order them by size too.
105909467b48Spatrick std::vector<std::pair<CodeGenRegisterClass *, BitVector>> SuperRegClasses;
106009467b48Spatrick for (auto &RC: RegClasses) {
106109467b48Spatrick BitVector SuperRegClassesBV(RegClasses.size());
106209467b48Spatrick RC.getSuperRegClasses(SubIdx, SuperRegClassesBV);
106309467b48Spatrick if (SuperRegClassesBV.any())
106409467b48Spatrick SuperRegClasses.push_back(std::make_pair(&RC, SuperRegClassesBV));
106509467b48Spatrick }
106609467b48Spatrick llvm::sort(SuperRegClasses,
106709467b48Spatrick [&](const std::pair<CodeGenRegisterClass *, BitVector> &A,
106809467b48Spatrick const std::pair<CodeGenRegisterClass *, BitVector> &B) {
106909467b48Spatrick return SizeOrder(A.first, B.first);
107009467b48Spatrick });
107109467b48Spatrick
107209467b48Spatrick // Find the biggest subclass and subreg class such that R:subidx is in the
107309467b48Spatrick // subreg class for all R in subclass.
107409467b48Spatrick //
107509467b48Spatrick // For example:
107609467b48Spatrick // All registers in X86's GR64 have a sub_32bit subregister but no class
107709467b48Spatrick // exists that contains all the 32-bit subregisters because GR64 contains RIP
107809467b48Spatrick // but GR32 does not contain EIP. Instead, we constrain SuperRegRC to
107909467b48Spatrick // GR32_with_sub_8bit (which is identical to GR32_with_sub_32bit) and then,
108009467b48Spatrick // having excluded RIP, we are able to find a SubRegRC (GR32).
108109467b48Spatrick CodeGenRegisterClass *ChosenSuperRegClass = nullptr;
108209467b48Spatrick CodeGenRegisterClass *SubRegRC = nullptr;
108309467b48Spatrick for (auto *SuperRegRC : SuperRegRCs) {
108409467b48Spatrick for (const auto &SuperRegClassPair : SuperRegClasses) {
108509467b48Spatrick const BitVector &SuperRegClassBV = SuperRegClassPair.second;
108609467b48Spatrick if (SuperRegClassBV[SuperRegRC->EnumValue]) {
108709467b48Spatrick SubRegRC = SuperRegClassPair.first;
108809467b48Spatrick ChosenSuperRegClass = SuperRegRC;
108909467b48Spatrick
109009467b48Spatrick // If SubRegRC is bigger than SuperRegRC then there are members of
109109467b48Spatrick // SubRegRC that don't have super registers via SubIdx. Keep looking to
109209467b48Spatrick // find a better fit and fall back on this one if there isn't one.
109309467b48Spatrick //
109409467b48Spatrick // This is intended to prevent X86 from making odd choices such as
109509467b48Spatrick // picking LOW32_ADDR_ACCESS_RBP instead of GR32 in the example above.
109609467b48Spatrick // LOW32_ADDR_ACCESS_RBP is a valid choice but contains registers that
109709467b48Spatrick // aren't subregisters of SuperRegRC whereas GR32 has a direct 1:1
109809467b48Spatrick // mapping.
109909467b48Spatrick if (SuperRegRC->getMembers().size() >= SubRegRC->getMembers().size())
110009467b48Spatrick return std::make_pair(ChosenSuperRegClass, SubRegRC);
110109467b48Spatrick }
110209467b48Spatrick }
110309467b48Spatrick
110409467b48Spatrick // If we found a fit but it wasn't quite ideal because SubRegRC had excess
110509467b48Spatrick // registers, then we're done.
110609467b48Spatrick if (ChosenSuperRegClass)
110709467b48Spatrick return std::make_pair(ChosenSuperRegClass, SubRegRC);
110809467b48Spatrick }
110909467b48Spatrick
1110*d415bd75Srobert return std::nullopt;
111109467b48Spatrick }
111209467b48Spatrick
getSuperRegClasses(const CodeGenSubRegIndex * SubIdx,BitVector & Out) const111309467b48Spatrick void CodeGenRegisterClass::getSuperRegClasses(const CodeGenSubRegIndex *SubIdx,
111409467b48Spatrick BitVector &Out) const {
111509467b48Spatrick auto FindI = SuperRegClasses.find(SubIdx);
111609467b48Spatrick if (FindI == SuperRegClasses.end())
111709467b48Spatrick return;
111809467b48Spatrick for (CodeGenRegisterClass *RC : FindI->second)
111909467b48Spatrick Out.set(RC->EnumValue);
112009467b48Spatrick }
112109467b48Spatrick
112209467b48Spatrick // Populate a unique sorted list of units from a register set.
buildRegUnitSet(const CodeGenRegBank & RegBank,std::vector<unsigned> & RegUnits) const112309467b48Spatrick void CodeGenRegisterClass::buildRegUnitSet(const CodeGenRegBank &RegBank,
112409467b48Spatrick std::vector<unsigned> &RegUnits) const {
112509467b48Spatrick std::vector<unsigned> TmpUnits;
112609467b48Spatrick for (RegUnitIterator UnitI(Members); UnitI.isValid(); ++UnitI) {
112709467b48Spatrick const RegUnit &RU = RegBank.getRegUnit(*UnitI);
112809467b48Spatrick if (!RU.Artificial)
112909467b48Spatrick TmpUnits.push_back(*UnitI);
113009467b48Spatrick }
113109467b48Spatrick llvm::sort(TmpUnits);
113209467b48Spatrick std::unique_copy(TmpUnits.begin(), TmpUnits.end(),
113309467b48Spatrick std::back_inserter(RegUnits));
113409467b48Spatrick }
113509467b48Spatrick
113609467b48Spatrick //===----------------------------------------------------------------------===//
1137*d415bd75Srobert // CodeGenRegisterCategory
1138*d415bd75Srobert //===----------------------------------------------------------------------===//
1139*d415bd75Srobert
CodeGenRegisterCategory(CodeGenRegBank & RegBank,Record * R)1140*d415bd75Srobert CodeGenRegisterCategory::CodeGenRegisterCategory(CodeGenRegBank &RegBank,
1141*d415bd75Srobert Record *R)
1142*d415bd75Srobert : TheDef(R), Name(std::string(R->getName())) {
1143*d415bd75Srobert for (Record *RegClass : R->getValueAsListOfDefs("Classes"))
1144*d415bd75Srobert Classes.push_back(RegBank.getRegClass(RegClass));
1145*d415bd75Srobert }
1146*d415bd75Srobert
1147*d415bd75Srobert //===----------------------------------------------------------------------===//
114809467b48Spatrick // CodeGenRegBank
114909467b48Spatrick //===----------------------------------------------------------------------===//
115009467b48Spatrick
CodeGenRegBank(RecordKeeper & Records,const CodeGenHwModes & Modes)115109467b48Spatrick CodeGenRegBank::CodeGenRegBank(RecordKeeper &Records,
115209467b48Spatrick const CodeGenHwModes &Modes) : CGH(Modes) {
115309467b48Spatrick // Configure register Sets to understand register classes and tuples.
115409467b48Spatrick Sets.addFieldExpander("RegisterClass", "MemberList");
115509467b48Spatrick Sets.addFieldExpander("CalleeSavedRegs", "SaveList");
115609467b48Spatrick Sets.addExpander("RegisterTuples",
115709467b48Spatrick std::make_unique<TupleExpander>(SynthDefs));
115809467b48Spatrick
115909467b48Spatrick // Read in the user-defined (named) sub-register indices.
116009467b48Spatrick // More indices will be synthesized later.
116109467b48Spatrick std::vector<Record*> SRIs = Records.getAllDerivedDefinitions("SubRegIndex");
116209467b48Spatrick llvm::sort(SRIs, LessRecord());
116309467b48Spatrick for (unsigned i = 0, e = SRIs.size(); i != e; ++i)
116409467b48Spatrick getSubRegIdx(SRIs[i]);
116509467b48Spatrick // Build composite maps from ComposedOf fields.
116609467b48Spatrick for (auto &Idx : SubRegIndices)
116709467b48Spatrick Idx.updateComponents(*this);
116809467b48Spatrick
116909467b48Spatrick // Read in the register definitions.
117009467b48Spatrick std::vector<Record*> Regs = Records.getAllDerivedDefinitions("Register");
117109467b48Spatrick llvm::sort(Regs, LessRecordRegister());
117209467b48Spatrick // Assign the enumeration values.
117309467b48Spatrick for (unsigned i = 0, e = Regs.size(); i != e; ++i)
117409467b48Spatrick getReg(Regs[i]);
117509467b48Spatrick
117609467b48Spatrick // Expand tuples and number the new registers.
117709467b48Spatrick std::vector<Record*> Tups =
117809467b48Spatrick Records.getAllDerivedDefinitions("RegisterTuples");
117909467b48Spatrick
118009467b48Spatrick for (Record *R : Tups) {
118109467b48Spatrick std::vector<Record *> TupRegs = *Sets.expand(R);
118209467b48Spatrick llvm::sort(TupRegs, LessRecordRegister());
118309467b48Spatrick for (Record *RC : TupRegs)
118409467b48Spatrick getReg(RC);
118509467b48Spatrick }
118609467b48Spatrick
118709467b48Spatrick // Now all the registers are known. Build the object graph of explicit
118809467b48Spatrick // register-register references.
118909467b48Spatrick for (auto &Reg : Registers)
119009467b48Spatrick Reg.buildObjectGraph(*this);
119109467b48Spatrick
119209467b48Spatrick // Compute register name map.
119309467b48Spatrick for (auto &Reg : Registers)
119409467b48Spatrick // FIXME: This could just be RegistersByName[name] = register, except that
119509467b48Spatrick // causes some failures in MIPS - perhaps they have duplicate register name
119609467b48Spatrick // entries? (or maybe there's a reason for it - I don't know much about this
119709467b48Spatrick // code, just drive-by refactoring)
119809467b48Spatrick RegistersByName.insert(
119909467b48Spatrick std::make_pair(Reg.TheDef->getValueAsString("AsmName"), &Reg));
120009467b48Spatrick
120109467b48Spatrick // Precompute all sub-register maps.
120209467b48Spatrick // This will create Composite entries for all inferred sub-register indices.
120309467b48Spatrick for (auto &Reg : Registers)
120409467b48Spatrick Reg.computeSubRegs(*this);
120509467b48Spatrick
120609467b48Spatrick // Compute transitive closure of subregister index ConcatenationOf vectors
120709467b48Spatrick // and initialize ConcatIdx map.
120809467b48Spatrick for (CodeGenSubRegIndex &SRI : SubRegIndices) {
120909467b48Spatrick SRI.computeConcatTransitiveClosure();
121009467b48Spatrick if (!SRI.ConcatenationOf.empty())
121109467b48Spatrick ConcatIdx.insert(std::make_pair(
121209467b48Spatrick SmallVector<CodeGenSubRegIndex*,8>(SRI.ConcatenationOf.begin(),
121309467b48Spatrick SRI.ConcatenationOf.end()), &SRI));
121409467b48Spatrick }
121509467b48Spatrick
121609467b48Spatrick // Infer even more sub-registers by combining leading super-registers.
121709467b48Spatrick for (auto &Reg : Registers)
121809467b48Spatrick if (Reg.CoveredBySubRegs)
121909467b48Spatrick Reg.computeSecondarySubRegs(*this);
122009467b48Spatrick
122109467b48Spatrick // After the sub-register graph is complete, compute the topologically
122209467b48Spatrick // ordered SuperRegs list.
122309467b48Spatrick for (auto &Reg : Registers)
122409467b48Spatrick Reg.computeSuperRegs(*this);
122509467b48Spatrick
122609467b48Spatrick // For each pair of Reg:SR, if both are non-artificial, mark the
122709467b48Spatrick // corresponding sub-register index as non-artificial.
122809467b48Spatrick for (auto &Reg : Registers) {
122909467b48Spatrick if (Reg.Artificial)
123009467b48Spatrick continue;
123109467b48Spatrick for (auto P : Reg.getSubRegs()) {
123209467b48Spatrick const CodeGenRegister *SR = P.second;
123309467b48Spatrick if (!SR->Artificial)
123409467b48Spatrick P.first->Artificial = false;
123509467b48Spatrick }
123609467b48Spatrick }
123709467b48Spatrick
123809467b48Spatrick // Native register units are associated with a leaf register. They've all been
123909467b48Spatrick // discovered now.
124009467b48Spatrick NumNativeRegUnits = RegUnits.size();
124109467b48Spatrick
124209467b48Spatrick // Read in register class definitions.
124309467b48Spatrick std::vector<Record*> RCs = Records.getAllDerivedDefinitions("RegisterClass");
124409467b48Spatrick if (RCs.empty())
124509467b48Spatrick PrintFatalError("No 'RegisterClass' subclasses defined!");
124609467b48Spatrick
124709467b48Spatrick // Allocate user-defined register classes.
124809467b48Spatrick for (auto *R : RCs) {
124909467b48Spatrick RegClasses.emplace_back(*this, R);
125009467b48Spatrick CodeGenRegisterClass &RC = RegClasses.back();
125109467b48Spatrick if (!RC.Artificial)
125209467b48Spatrick addToMaps(&RC);
125309467b48Spatrick }
125409467b48Spatrick
125509467b48Spatrick // Infer missing classes to create a full algebra.
125609467b48Spatrick computeInferredRegisterClasses();
125709467b48Spatrick
125809467b48Spatrick // Order register classes topologically and assign enum values.
125909467b48Spatrick RegClasses.sort(TopoOrderRC);
126009467b48Spatrick unsigned i = 0;
126109467b48Spatrick for (auto &RC : RegClasses)
126209467b48Spatrick RC.EnumValue = i++;
126309467b48Spatrick CodeGenRegisterClass::computeSubClasses(*this);
1264*d415bd75Srobert
1265*d415bd75Srobert // Read in the register category definitions.
1266*d415bd75Srobert std::vector<Record *> RCats =
1267*d415bd75Srobert Records.getAllDerivedDefinitions("RegisterCategory");
1268*d415bd75Srobert for (auto *R : RCats)
1269*d415bd75Srobert RegCategories.emplace_back(*this, R);
127009467b48Spatrick }
127109467b48Spatrick
127209467b48Spatrick // Create a synthetic CodeGenSubRegIndex without a corresponding Record.
127309467b48Spatrick CodeGenSubRegIndex*
createSubRegIndex(StringRef Name,StringRef Namespace)127409467b48Spatrick CodeGenRegBank::createSubRegIndex(StringRef Name, StringRef Namespace) {
127509467b48Spatrick SubRegIndices.emplace_back(Name, Namespace, SubRegIndices.size() + 1);
127609467b48Spatrick return &SubRegIndices.back();
127709467b48Spatrick }
127809467b48Spatrick
getSubRegIdx(Record * Def)127909467b48Spatrick CodeGenSubRegIndex *CodeGenRegBank::getSubRegIdx(Record *Def) {
128009467b48Spatrick CodeGenSubRegIndex *&Idx = Def2SubRegIdx[Def];
128109467b48Spatrick if (Idx)
128209467b48Spatrick return Idx;
128309467b48Spatrick SubRegIndices.emplace_back(Def, SubRegIndices.size() + 1);
128409467b48Spatrick Idx = &SubRegIndices.back();
128509467b48Spatrick return Idx;
128609467b48Spatrick }
128709467b48Spatrick
1288097a140dSpatrick const CodeGenSubRegIndex *
findSubRegIdx(const Record * Def) const1289097a140dSpatrick CodeGenRegBank::findSubRegIdx(const Record* Def) const {
129073471bf0Spatrick return Def2SubRegIdx.lookup(Def);
1291097a140dSpatrick }
1292097a140dSpatrick
getReg(Record * Def)129309467b48Spatrick CodeGenRegister *CodeGenRegBank::getReg(Record *Def) {
129409467b48Spatrick CodeGenRegister *&Reg = Def2Reg[Def];
129509467b48Spatrick if (Reg)
129609467b48Spatrick return Reg;
129709467b48Spatrick Registers.emplace_back(Def, Registers.size() + 1);
129809467b48Spatrick Reg = &Registers.back();
129909467b48Spatrick return Reg;
130009467b48Spatrick }
130109467b48Spatrick
addToMaps(CodeGenRegisterClass * RC)130209467b48Spatrick void CodeGenRegBank::addToMaps(CodeGenRegisterClass *RC) {
130309467b48Spatrick if (Record *Def = RC->getDef())
130409467b48Spatrick Def2RC.insert(std::make_pair(Def, RC));
130509467b48Spatrick
130609467b48Spatrick // Duplicate classes are rejected by insert().
130709467b48Spatrick // That's OK, we only care about the properties handled by CGRC::Key.
130809467b48Spatrick CodeGenRegisterClass::Key K(*RC);
130909467b48Spatrick Key2RC.insert(std::make_pair(K, RC));
131009467b48Spatrick }
131109467b48Spatrick
131209467b48Spatrick // Create a synthetic sub-class if it is missing.
131309467b48Spatrick CodeGenRegisterClass*
getOrCreateSubClass(const CodeGenRegisterClass * RC,const CodeGenRegister::Vec * Members,StringRef Name)131409467b48Spatrick CodeGenRegBank::getOrCreateSubClass(const CodeGenRegisterClass *RC,
131509467b48Spatrick const CodeGenRegister::Vec *Members,
131609467b48Spatrick StringRef Name) {
131709467b48Spatrick // Synthetic sub-class has the same size and alignment as RC.
131809467b48Spatrick CodeGenRegisterClass::Key K(Members, RC->RSI);
131909467b48Spatrick RCKeyMap::const_iterator FoundI = Key2RC.find(K);
132009467b48Spatrick if (FoundI != Key2RC.end())
132109467b48Spatrick return FoundI->second;
132209467b48Spatrick
132309467b48Spatrick // Sub-class doesn't exist, create a new one.
132409467b48Spatrick RegClasses.emplace_back(*this, Name, K);
132509467b48Spatrick addToMaps(&RegClasses.back());
132609467b48Spatrick return &RegClasses.back();
132709467b48Spatrick }
132809467b48Spatrick
getRegClass(const Record * Def) const1329097a140dSpatrick CodeGenRegisterClass *CodeGenRegBank::getRegClass(const Record *Def) const {
1330097a140dSpatrick if (CodeGenRegisterClass *RC = Def2RC.lookup(Def))
133109467b48Spatrick return RC;
133209467b48Spatrick
133309467b48Spatrick PrintFatalError(Def->getLoc(), "Not a known RegisterClass!");
133409467b48Spatrick }
133509467b48Spatrick
133609467b48Spatrick CodeGenSubRegIndex*
getCompositeSubRegIndex(CodeGenSubRegIndex * A,CodeGenSubRegIndex * B)133709467b48Spatrick CodeGenRegBank::getCompositeSubRegIndex(CodeGenSubRegIndex *A,
133809467b48Spatrick CodeGenSubRegIndex *B) {
133909467b48Spatrick // Look for an existing entry.
134009467b48Spatrick CodeGenSubRegIndex *Comp = A->compose(B);
134109467b48Spatrick if (Comp)
134209467b48Spatrick return Comp;
134309467b48Spatrick
134409467b48Spatrick // None exists, synthesize one.
134509467b48Spatrick std::string Name = A->getName() + "_then_" + B->getName();
134609467b48Spatrick Comp = createSubRegIndex(Name, A->getNamespace());
134709467b48Spatrick A->addComposite(B, Comp);
134809467b48Spatrick return Comp;
134909467b48Spatrick }
135009467b48Spatrick
135109467b48Spatrick CodeGenSubRegIndex *CodeGenRegBank::
getConcatSubRegIndex(const SmallVector<CodeGenSubRegIndex *,8> & Parts)135209467b48Spatrick getConcatSubRegIndex(const SmallVector<CodeGenSubRegIndex *, 8> &Parts) {
135309467b48Spatrick assert(Parts.size() > 1 && "Need two parts to concatenate");
135409467b48Spatrick #ifndef NDEBUG
135509467b48Spatrick for (CodeGenSubRegIndex *Idx : Parts) {
135609467b48Spatrick assert(Idx->ConcatenationOf.empty() && "No transitive closure?");
135709467b48Spatrick }
135809467b48Spatrick #endif
135909467b48Spatrick
136009467b48Spatrick // Look for an existing entry.
136109467b48Spatrick CodeGenSubRegIndex *&Idx = ConcatIdx[Parts];
136209467b48Spatrick if (Idx)
136309467b48Spatrick return Idx;
136409467b48Spatrick
136509467b48Spatrick // None exists, synthesize one.
136609467b48Spatrick std::string Name = Parts.front()->getName();
136709467b48Spatrick // Determine whether all parts are contiguous.
136809467b48Spatrick bool isContinuous = true;
136909467b48Spatrick unsigned Size = Parts.front()->Size;
137009467b48Spatrick unsigned LastOffset = Parts.front()->Offset;
137109467b48Spatrick unsigned LastSize = Parts.front()->Size;
1372*d415bd75Srobert unsigned UnknownSize = (uint16_t)-1;
137309467b48Spatrick for (unsigned i = 1, e = Parts.size(); i != e; ++i) {
137409467b48Spatrick Name += '_';
137509467b48Spatrick Name += Parts[i]->getName();
1376*d415bd75Srobert if (Size == UnknownSize || Parts[i]->Size == UnknownSize)
1377*d415bd75Srobert Size = UnknownSize;
1378*d415bd75Srobert else
137909467b48Spatrick Size += Parts[i]->Size;
1380*d415bd75Srobert if (LastSize == UnknownSize || Parts[i]->Offset != (LastOffset + LastSize))
138109467b48Spatrick isContinuous = false;
138209467b48Spatrick LastOffset = Parts[i]->Offset;
138309467b48Spatrick LastSize = Parts[i]->Size;
138409467b48Spatrick }
138509467b48Spatrick Idx = createSubRegIndex(Name, Parts.front()->getNamespace());
138609467b48Spatrick Idx->Size = Size;
138709467b48Spatrick Idx->Offset = isContinuous ? Parts.front()->Offset : -1;
138809467b48Spatrick Idx->ConcatenationOf.assign(Parts.begin(), Parts.end());
138909467b48Spatrick return Idx;
139009467b48Spatrick }
139109467b48Spatrick
computeComposites()139209467b48Spatrick void CodeGenRegBank::computeComposites() {
139309467b48Spatrick using RegMap = std::map<const CodeGenRegister*, const CodeGenRegister*>;
139409467b48Spatrick
139509467b48Spatrick // Subreg -> { Reg->Reg }, where the right-hand side is the mapping from
139609467b48Spatrick // register to (sub)register associated with the action of the left-hand
139709467b48Spatrick // side subregister.
139809467b48Spatrick std::map<const CodeGenSubRegIndex*, RegMap> SubRegAction;
139909467b48Spatrick for (const CodeGenRegister &R : Registers) {
140009467b48Spatrick const CodeGenRegister::SubRegMap &SM = R.getSubRegs();
140109467b48Spatrick for (std::pair<const CodeGenSubRegIndex*, const CodeGenRegister*> P : SM)
140209467b48Spatrick SubRegAction[P.first].insert({&R, P.second});
140309467b48Spatrick }
140409467b48Spatrick
140509467b48Spatrick // Calculate the composition of two subregisters as compositions of their
140609467b48Spatrick // associated actions.
140709467b48Spatrick auto compose = [&SubRegAction] (const CodeGenSubRegIndex *Sub1,
140809467b48Spatrick const CodeGenSubRegIndex *Sub2) {
140909467b48Spatrick RegMap C;
141009467b48Spatrick const RegMap &Img1 = SubRegAction.at(Sub1);
141109467b48Spatrick const RegMap &Img2 = SubRegAction.at(Sub2);
141209467b48Spatrick for (std::pair<const CodeGenRegister*, const CodeGenRegister*> P : Img1) {
141309467b48Spatrick auto F = Img2.find(P.second);
141409467b48Spatrick if (F != Img2.end())
141509467b48Spatrick C.insert({P.first, F->second});
141609467b48Spatrick }
141709467b48Spatrick return C;
141809467b48Spatrick };
141909467b48Spatrick
142009467b48Spatrick // Check if the two maps agree on the intersection of their domains.
142109467b48Spatrick auto agree = [] (const RegMap &Map1, const RegMap &Map2) {
142209467b48Spatrick // Technically speaking, an empty map agrees with any other map, but
142309467b48Spatrick // this could flag false positives. We're interested in non-vacuous
142409467b48Spatrick // agreements.
142509467b48Spatrick if (Map1.empty() || Map2.empty())
142609467b48Spatrick return false;
142709467b48Spatrick for (std::pair<const CodeGenRegister*, const CodeGenRegister*> P : Map1) {
142809467b48Spatrick auto F = Map2.find(P.first);
142909467b48Spatrick if (F == Map2.end() || P.second != F->second)
143009467b48Spatrick return false;
143109467b48Spatrick }
143209467b48Spatrick return true;
143309467b48Spatrick };
143409467b48Spatrick
143509467b48Spatrick using CompositePair = std::pair<const CodeGenSubRegIndex*,
143609467b48Spatrick const CodeGenSubRegIndex*>;
143709467b48Spatrick SmallSet<CompositePair,4> UserDefined;
143809467b48Spatrick for (const CodeGenSubRegIndex &Idx : SubRegIndices)
143909467b48Spatrick for (auto P : Idx.getComposites())
144009467b48Spatrick UserDefined.insert(std::make_pair(&Idx, P.first));
144109467b48Spatrick
144209467b48Spatrick // Keep track of TopoSigs visited. We only need to visit each TopoSig once,
144309467b48Spatrick // and many registers will share TopoSigs on regular architectures.
144409467b48Spatrick BitVector TopoSigs(getNumTopoSigs());
144509467b48Spatrick
144609467b48Spatrick for (const auto &Reg1 : Registers) {
144709467b48Spatrick // Skip identical subreg structures already processed.
144809467b48Spatrick if (TopoSigs.test(Reg1.getTopoSig()))
144909467b48Spatrick continue;
145009467b48Spatrick TopoSigs.set(Reg1.getTopoSig());
145109467b48Spatrick
145209467b48Spatrick const CodeGenRegister::SubRegMap &SRM1 = Reg1.getSubRegs();
145373471bf0Spatrick for (auto I1 : SRM1) {
145473471bf0Spatrick CodeGenSubRegIndex *Idx1 = I1.first;
145573471bf0Spatrick CodeGenRegister *Reg2 = I1.second;
145609467b48Spatrick // Ignore identity compositions.
145709467b48Spatrick if (&Reg1 == Reg2)
145809467b48Spatrick continue;
145909467b48Spatrick const CodeGenRegister::SubRegMap &SRM2 = Reg2->getSubRegs();
146009467b48Spatrick // Try composing Idx1 with another SubRegIndex.
146173471bf0Spatrick for (auto I2 : SRM2) {
146273471bf0Spatrick CodeGenSubRegIndex *Idx2 = I2.first;
146373471bf0Spatrick CodeGenRegister *Reg3 = I2.second;
146409467b48Spatrick // Ignore identity compositions.
146509467b48Spatrick if (Reg2 == Reg3)
146609467b48Spatrick continue;
146709467b48Spatrick // OK Reg1:IdxPair == Reg3. Find the index with Reg:Idx == Reg3.
146809467b48Spatrick CodeGenSubRegIndex *Idx3 = Reg1.getSubRegIndex(Reg3);
146909467b48Spatrick assert(Idx3 && "Sub-register doesn't have an index");
147009467b48Spatrick
147109467b48Spatrick // Conflicting composition? Emit a warning but allow it.
147209467b48Spatrick if (CodeGenSubRegIndex *Prev = Idx1->addComposite(Idx2, Idx3)) {
147309467b48Spatrick // If the composition was not user-defined, always emit a warning.
147409467b48Spatrick if (!UserDefined.count({Idx1, Idx2}) ||
147509467b48Spatrick agree(compose(Idx1, Idx2), SubRegAction.at(Idx3)))
147609467b48Spatrick PrintWarning(Twine("SubRegIndex ") + Idx1->getQualifiedName() +
147709467b48Spatrick " and " + Idx2->getQualifiedName() +
147809467b48Spatrick " compose ambiguously as " + Prev->getQualifiedName() +
147909467b48Spatrick " or " + Idx3->getQualifiedName());
148009467b48Spatrick }
148109467b48Spatrick }
148209467b48Spatrick }
148309467b48Spatrick }
148409467b48Spatrick }
148509467b48Spatrick
148609467b48Spatrick // Compute lane masks. This is similar to register units, but at the
148709467b48Spatrick // sub-register index level. Each bit in the lane mask is like a register unit
148809467b48Spatrick // class, and two lane masks will have a bit in common if two sub-register
148909467b48Spatrick // indices overlap in some register.
149009467b48Spatrick //
149109467b48Spatrick // Conservatively share a lane mask bit if two sub-register indices overlap in
149209467b48Spatrick // some registers, but not in others. That shouldn't happen a lot.
computeSubRegLaneMasks()149309467b48Spatrick void CodeGenRegBank::computeSubRegLaneMasks() {
149409467b48Spatrick // First assign individual bits to all the leaf indices.
149509467b48Spatrick unsigned Bit = 0;
149609467b48Spatrick // Determine mask of lanes that cover their registers.
149709467b48Spatrick CoveringLanes = LaneBitmask::getAll();
149809467b48Spatrick for (auto &Idx : SubRegIndices) {
149909467b48Spatrick if (Idx.getComposites().empty()) {
150009467b48Spatrick if (Bit > LaneBitmask::BitWidth) {
150109467b48Spatrick PrintFatalError(
150209467b48Spatrick Twine("Ran out of lanemask bits to represent subregister ")
150309467b48Spatrick + Idx.getName());
150409467b48Spatrick }
150509467b48Spatrick Idx.LaneMask = LaneBitmask::getLane(Bit);
150609467b48Spatrick ++Bit;
150709467b48Spatrick } else {
150809467b48Spatrick Idx.LaneMask = LaneBitmask::getNone();
150909467b48Spatrick }
151009467b48Spatrick }
151109467b48Spatrick
151209467b48Spatrick // Compute transformation sequences for composeSubRegIndexLaneMask. The idea
151309467b48Spatrick // here is that for each possible target subregister we look at the leafs
151409467b48Spatrick // in the subregister graph that compose for this target and create
151509467b48Spatrick // transformation sequences for the lanemasks. Each step in the sequence
151609467b48Spatrick // consists of a bitmask and a bitrotate operation. As the rotation amounts
151709467b48Spatrick // are usually the same for many subregisters we can easily combine the steps
151809467b48Spatrick // by combining the masks.
151909467b48Spatrick for (const auto &Idx : SubRegIndices) {
152009467b48Spatrick const auto &Composites = Idx.getComposites();
152109467b48Spatrick auto &LaneTransforms = Idx.CompositionLaneMaskTransform;
152209467b48Spatrick
152309467b48Spatrick if (Composites.empty()) {
152409467b48Spatrick // Moving from a class with no subregisters we just had a single lane:
152509467b48Spatrick // The subregister must be a leaf subregister and only occupies 1 bit.
152609467b48Spatrick // Move the bit from the class without subregisters into that position.
152709467b48Spatrick unsigned DstBit = Idx.LaneMask.getHighestLane();
152809467b48Spatrick assert(Idx.LaneMask == LaneBitmask::getLane(DstBit) &&
152909467b48Spatrick "Must be a leaf subregister");
153009467b48Spatrick MaskRolPair MaskRol = { LaneBitmask::getLane(0), (uint8_t)DstBit };
153109467b48Spatrick LaneTransforms.push_back(MaskRol);
153209467b48Spatrick } else {
153309467b48Spatrick // Go through all leaf subregisters and find the ones that compose with
153409467b48Spatrick // Idx. These make out all possible valid bits in the lane mask we want to
153509467b48Spatrick // transform. Looking only at the leafs ensure that only a single bit in
153609467b48Spatrick // the mask is set.
153709467b48Spatrick unsigned NextBit = 0;
153809467b48Spatrick for (auto &Idx2 : SubRegIndices) {
153909467b48Spatrick // Skip non-leaf subregisters.
154009467b48Spatrick if (!Idx2.getComposites().empty())
154109467b48Spatrick continue;
154209467b48Spatrick // Replicate the behaviour from the lane mask generation loop above.
154309467b48Spatrick unsigned SrcBit = NextBit;
154409467b48Spatrick LaneBitmask SrcMask = LaneBitmask::getLane(SrcBit);
154509467b48Spatrick if (NextBit < LaneBitmask::BitWidth-1)
154609467b48Spatrick ++NextBit;
154709467b48Spatrick assert(Idx2.LaneMask == SrcMask);
154809467b48Spatrick
154909467b48Spatrick // Get the composed subregister if there is any.
155009467b48Spatrick auto C = Composites.find(&Idx2);
155109467b48Spatrick if (C == Composites.end())
155209467b48Spatrick continue;
155309467b48Spatrick const CodeGenSubRegIndex *Composite = C->second;
155409467b48Spatrick // The Composed subreg should be a leaf subreg too
155509467b48Spatrick assert(Composite->getComposites().empty());
155609467b48Spatrick
155709467b48Spatrick // Create Mask+Rotate operation and merge with existing ops if possible.
155809467b48Spatrick unsigned DstBit = Composite->LaneMask.getHighestLane();
155909467b48Spatrick int Shift = DstBit - SrcBit;
156009467b48Spatrick uint8_t RotateLeft = Shift >= 0 ? (uint8_t)Shift
156109467b48Spatrick : LaneBitmask::BitWidth + Shift;
156209467b48Spatrick for (auto &I : LaneTransforms) {
156309467b48Spatrick if (I.RotateLeft == RotateLeft) {
156409467b48Spatrick I.Mask |= SrcMask;
156509467b48Spatrick SrcMask = LaneBitmask::getNone();
156609467b48Spatrick }
156709467b48Spatrick }
156809467b48Spatrick if (SrcMask.any()) {
156909467b48Spatrick MaskRolPair MaskRol = { SrcMask, RotateLeft };
157009467b48Spatrick LaneTransforms.push_back(MaskRol);
157109467b48Spatrick }
157209467b48Spatrick }
157309467b48Spatrick }
157409467b48Spatrick
157509467b48Spatrick // Optimize if the transformation consists of one step only: Set mask to
157609467b48Spatrick // 0xffffffff (including some irrelevant invalid bits) so that it should
157709467b48Spatrick // merge with more entries later while compressing the table.
157809467b48Spatrick if (LaneTransforms.size() == 1)
157909467b48Spatrick LaneTransforms[0].Mask = LaneBitmask::getAll();
158009467b48Spatrick
158109467b48Spatrick // Further compression optimization: For invalid compositions resulting
158209467b48Spatrick // in a sequence with 0 entries we can just pick any other. Choose
158309467b48Spatrick // Mask 0xffffffff with Rotation 0.
158409467b48Spatrick if (LaneTransforms.size() == 0) {
158509467b48Spatrick MaskRolPair P = { LaneBitmask::getAll(), 0 };
158609467b48Spatrick LaneTransforms.push_back(P);
158709467b48Spatrick }
158809467b48Spatrick }
158909467b48Spatrick
159009467b48Spatrick // FIXME: What if ad-hoc aliasing introduces overlaps that aren't represented
159109467b48Spatrick // by the sub-register graph? This doesn't occur in any known targets.
159209467b48Spatrick
159309467b48Spatrick // Inherit lanes from composites.
159409467b48Spatrick for (const auto &Idx : SubRegIndices) {
159509467b48Spatrick LaneBitmask Mask = Idx.computeLaneMask();
159609467b48Spatrick // If some super-registers without CoveredBySubRegs use this index, we can
159709467b48Spatrick // no longer assume that the lanes are covering their registers.
159809467b48Spatrick if (!Idx.AllSuperRegsCovered)
159909467b48Spatrick CoveringLanes &= ~Mask;
160009467b48Spatrick }
160109467b48Spatrick
160209467b48Spatrick // Compute lane mask combinations for register classes.
160309467b48Spatrick for (auto &RegClass : RegClasses) {
160409467b48Spatrick LaneBitmask LaneMask;
160509467b48Spatrick for (const auto &SubRegIndex : SubRegIndices) {
160609467b48Spatrick if (RegClass.getSubClassWithSubReg(&SubRegIndex) == nullptr)
160709467b48Spatrick continue;
160809467b48Spatrick LaneMask |= SubRegIndex.LaneMask;
160909467b48Spatrick }
161009467b48Spatrick
161109467b48Spatrick // For classes without any subregisters set LaneMask to 1 instead of 0.
161209467b48Spatrick // This makes it easier for client code to handle classes uniformly.
161309467b48Spatrick if (LaneMask.none())
161409467b48Spatrick LaneMask = LaneBitmask::getLane(0);
161509467b48Spatrick
161609467b48Spatrick RegClass.LaneMask = LaneMask;
161709467b48Spatrick }
161809467b48Spatrick }
161909467b48Spatrick
162009467b48Spatrick namespace {
162109467b48Spatrick
162209467b48Spatrick // UberRegSet is a helper class for computeRegUnitWeights. Each UberRegSet is
162309467b48Spatrick // the transitive closure of the union of overlapping register
162409467b48Spatrick // classes. Together, the UberRegSets form a partition of the registers. If we
162509467b48Spatrick // consider overlapping register classes to be connected, then each UberRegSet
162609467b48Spatrick // is a set of connected components.
162709467b48Spatrick //
162809467b48Spatrick // An UberRegSet will likely be a horizontal slice of register names of
162909467b48Spatrick // the same width. Nontrivial subregisters should then be in a separate
163009467b48Spatrick // UberRegSet. But this property isn't required for valid computation of
163109467b48Spatrick // register unit weights.
163209467b48Spatrick //
163309467b48Spatrick // A Weight field caches the max per-register unit weight in each UberRegSet.
163409467b48Spatrick //
163509467b48Spatrick // A set of SingularDeterminants flags single units of some register in this set
163609467b48Spatrick // for which the unit weight equals the set weight. These units should not have
163709467b48Spatrick // their weight increased.
163809467b48Spatrick struct UberRegSet {
163909467b48Spatrick CodeGenRegister::Vec Regs;
164009467b48Spatrick unsigned Weight = 0;
164109467b48Spatrick CodeGenRegister::RegUnitList SingularDeterminants;
164209467b48Spatrick
164309467b48Spatrick UberRegSet() = default;
164409467b48Spatrick };
164509467b48Spatrick
164609467b48Spatrick } // end anonymous namespace
164709467b48Spatrick
164809467b48Spatrick // Partition registers into UberRegSets, where each set is the transitive
164909467b48Spatrick // closure of the union of overlapping register classes.
165009467b48Spatrick //
165109467b48Spatrick // UberRegSets[0] is a special non-allocatable set.
computeUberSets(std::vector<UberRegSet> & UberSets,std::vector<UberRegSet * > & RegSets,CodeGenRegBank & RegBank)165209467b48Spatrick static void computeUberSets(std::vector<UberRegSet> &UberSets,
165309467b48Spatrick std::vector<UberRegSet*> &RegSets,
165409467b48Spatrick CodeGenRegBank &RegBank) {
165509467b48Spatrick const auto &Registers = RegBank.getRegisters();
165609467b48Spatrick
165709467b48Spatrick // The Register EnumValue is one greater than its index into Registers.
165809467b48Spatrick assert(Registers.size() == Registers.back().EnumValue &&
165909467b48Spatrick "register enum value mismatch");
166009467b48Spatrick
166109467b48Spatrick // For simplicitly make the SetID the same as EnumValue.
166209467b48Spatrick IntEqClasses UberSetIDs(Registers.size()+1);
166309467b48Spatrick std::set<unsigned> AllocatableRegs;
166409467b48Spatrick for (auto &RegClass : RegBank.getRegClasses()) {
166509467b48Spatrick if (!RegClass.Allocatable)
166609467b48Spatrick continue;
166709467b48Spatrick
166809467b48Spatrick const CodeGenRegister::Vec &Regs = RegClass.getMembers();
166909467b48Spatrick if (Regs.empty())
167009467b48Spatrick continue;
167109467b48Spatrick
167209467b48Spatrick unsigned USetID = UberSetIDs.findLeader((*Regs.begin())->EnumValue);
167309467b48Spatrick assert(USetID && "register number 0 is invalid");
167409467b48Spatrick
167509467b48Spatrick AllocatableRegs.insert((*Regs.begin())->EnumValue);
1676*d415bd75Srobert for (const CodeGenRegister *CGR : llvm::drop_begin(Regs)) {
1677*d415bd75Srobert AllocatableRegs.insert(CGR->EnumValue);
1678*d415bd75Srobert UberSetIDs.join(USetID, CGR->EnumValue);
167909467b48Spatrick }
168009467b48Spatrick }
168109467b48Spatrick // Combine non-allocatable regs.
168209467b48Spatrick for (const auto &Reg : Registers) {
168309467b48Spatrick unsigned RegNum = Reg.EnumValue;
168409467b48Spatrick if (AllocatableRegs.count(RegNum))
168509467b48Spatrick continue;
168609467b48Spatrick
168709467b48Spatrick UberSetIDs.join(0, RegNum);
168809467b48Spatrick }
168909467b48Spatrick UberSetIDs.compress();
169009467b48Spatrick
169109467b48Spatrick // Make the first UberSet a special unallocatable set.
169209467b48Spatrick unsigned ZeroID = UberSetIDs[0];
169309467b48Spatrick
169409467b48Spatrick // Insert Registers into the UberSets formed by union-find.
169509467b48Spatrick // Do not resize after this.
169609467b48Spatrick UberSets.resize(UberSetIDs.getNumClasses());
169709467b48Spatrick unsigned i = 0;
169809467b48Spatrick for (const CodeGenRegister &Reg : Registers) {
169909467b48Spatrick unsigned USetID = UberSetIDs[Reg.EnumValue];
170009467b48Spatrick if (!USetID)
170109467b48Spatrick USetID = ZeroID;
170209467b48Spatrick else if (USetID == ZeroID)
170309467b48Spatrick USetID = 0;
170409467b48Spatrick
170509467b48Spatrick UberRegSet *USet = &UberSets[USetID];
170609467b48Spatrick USet->Regs.push_back(&Reg);
170709467b48Spatrick sortAndUniqueRegisters(USet->Regs);
170809467b48Spatrick RegSets[i++] = USet;
170909467b48Spatrick }
171009467b48Spatrick }
171109467b48Spatrick
171209467b48Spatrick // Recompute each UberSet weight after changing unit weights.
computeUberWeights(std::vector<UberRegSet> & UberSets,CodeGenRegBank & RegBank)171309467b48Spatrick static void computeUberWeights(std::vector<UberRegSet> &UberSets,
171409467b48Spatrick CodeGenRegBank &RegBank) {
171509467b48Spatrick // Skip the first unallocatable set.
171609467b48Spatrick for (std::vector<UberRegSet>::iterator I = std::next(UberSets.begin()),
171709467b48Spatrick E = UberSets.end(); I != E; ++I) {
171809467b48Spatrick
171909467b48Spatrick // Initialize all unit weights in this set, and remember the max units/reg.
172009467b48Spatrick const CodeGenRegister *Reg = nullptr;
172109467b48Spatrick unsigned MaxWeight = 0, Weight = 0;
172209467b48Spatrick for (RegUnitIterator UnitI(I->Regs); UnitI.isValid(); ++UnitI) {
172309467b48Spatrick if (Reg != UnitI.getReg()) {
172409467b48Spatrick if (Weight > MaxWeight)
172509467b48Spatrick MaxWeight = Weight;
172609467b48Spatrick Reg = UnitI.getReg();
172709467b48Spatrick Weight = 0;
172809467b48Spatrick }
172909467b48Spatrick if (!RegBank.getRegUnit(*UnitI).Artificial) {
173009467b48Spatrick unsigned UWeight = RegBank.getRegUnit(*UnitI).Weight;
173109467b48Spatrick if (!UWeight) {
173209467b48Spatrick UWeight = 1;
173309467b48Spatrick RegBank.increaseRegUnitWeight(*UnitI, UWeight);
173409467b48Spatrick }
173509467b48Spatrick Weight += UWeight;
173609467b48Spatrick }
173709467b48Spatrick }
173809467b48Spatrick if (Weight > MaxWeight)
173909467b48Spatrick MaxWeight = Weight;
174009467b48Spatrick if (I->Weight != MaxWeight) {
174109467b48Spatrick LLVM_DEBUG(dbgs() << "UberSet " << I - UberSets.begin() << " Weight "
174209467b48Spatrick << MaxWeight;
174309467b48Spatrick for (auto &Unit
174409467b48Spatrick : I->Regs) dbgs()
174509467b48Spatrick << " " << Unit->getName();
174609467b48Spatrick dbgs() << "\n");
174709467b48Spatrick // Update the set weight.
174809467b48Spatrick I->Weight = MaxWeight;
174909467b48Spatrick }
175009467b48Spatrick
175109467b48Spatrick // Find singular determinants.
175209467b48Spatrick for (const auto R : I->Regs) {
175309467b48Spatrick if (R->getRegUnits().count() == 1 && R->getWeight(RegBank) == I->Weight) {
175409467b48Spatrick I->SingularDeterminants |= R->getRegUnits();
175509467b48Spatrick }
175609467b48Spatrick }
175709467b48Spatrick }
175809467b48Spatrick }
175909467b48Spatrick
176009467b48Spatrick // normalizeWeight is a computeRegUnitWeights helper that adjusts the weight of
176109467b48Spatrick // a register and its subregisters so that they have the same weight as their
176209467b48Spatrick // UberSet. Self-recursion processes the subregister tree in postorder so
176309467b48Spatrick // subregisters are normalized first.
176409467b48Spatrick //
176509467b48Spatrick // Side effects:
176609467b48Spatrick // - creates new adopted register units
176709467b48Spatrick // - causes superregisters to inherit adopted units
176809467b48Spatrick // - increases the weight of "singular" units
176909467b48Spatrick // - induces recomputation of UberWeights.
normalizeWeight(CodeGenRegister * Reg,std::vector<UberRegSet> & UberSets,std::vector<UberRegSet * > & RegSets,BitVector & NormalRegs,CodeGenRegister::RegUnitList & NormalUnits,CodeGenRegBank & RegBank)177009467b48Spatrick static bool normalizeWeight(CodeGenRegister *Reg,
177109467b48Spatrick std::vector<UberRegSet> &UberSets,
177209467b48Spatrick std::vector<UberRegSet*> &RegSets,
177309467b48Spatrick BitVector &NormalRegs,
177409467b48Spatrick CodeGenRegister::RegUnitList &NormalUnits,
177509467b48Spatrick CodeGenRegBank &RegBank) {
177609467b48Spatrick NormalRegs.resize(std::max(Reg->EnumValue + 1, NormalRegs.size()));
177709467b48Spatrick if (NormalRegs.test(Reg->EnumValue))
177809467b48Spatrick return false;
177909467b48Spatrick NormalRegs.set(Reg->EnumValue);
178009467b48Spatrick
178109467b48Spatrick bool Changed = false;
178209467b48Spatrick const CodeGenRegister::SubRegMap &SRM = Reg->getSubRegs();
178373471bf0Spatrick for (auto SRI : SRM) {
178473471bf0Spatrick if (SRI.second == Reg)
178509467b48Spatrick continue; // self-cycles happen
178609467b48Spatrick
178773471bf0Spatrick Changed |= normalizeWeight(SRI.second, UberSets, RegSets, NormalRegs,
178873471bf0Spatrick NormalUnits, RegBank);
178909467b48Spatrick }
179009467b48Spatrick // Postorder register normalization.
179109467b48Spatrick
179209467b48Spatrick // Inherit register units newly adopted by subregisters.
179309467b48Spatrick if (Reg->inheritRegUnits(RegBank))
179409467b48Spatrick computeUberWeights(UberSets, RegBank);
179509467b48Spatrick
179609467b48Spatrick // Check if this register is too skinny for its UberRegSet.
179709467b48Spatrick UberRegSet *UberSet = RegSets[RegBank.getRegIndex(Reg)];
179809467b48Spatrick
179909467b48Spatrick unsigned RegWeight = Reg->getWeight(RegBank);
180009467b48Spatrick if (UberSet->Weight > RegWeight) {
180109467b48Spatrick // A register unit's weight can be adjusted only if it is the singular unit
180209467b48Spatrick // for this register, has not been used to normalize a subregister's set,
180309467b48Spatrick // and has not already been used to singularly determine this UberRegSet.
180409467b48Spatrick unsigned AdjustUnit = *Reg->getRegUnits().begin();
180509467b48Spatrick if (Reg->getRegUnits().count() != 1
180609467b48Spatrick || hasRegUnit(NormalUnits, AdjustUnit)
180709467b48Spatrick || hasRegUnit(UberSet->SingularDeterminants, AdjustUnit)) {
180809467b48Spatrick // We don't have an adjustable unit, so adopt a new one.
180909467b48Spatrick AdjustUnit = RegBank.newRegUnit(UberSet->Weight - RegWeight);
181009467b48Spatrick Reg->adoptRegUnit(AdjustUnit);
181109467b48Spatrick // Adopting a unit does not immediately require recomputing set weights.
181209467b48Spatrick }
181309467b48Spatrick else {
181409467b48Spatrick // Adjust the existing single unit.
181509467b48Spatrick if (!RegBank.getRegUnit(AdjustUnit).Artificial)
181609467b48Spatrick RegBank.increaseRegUnitWeight(AdjustUnit, UberSet->Weight - RegWeight);
181709467b48Spatrick // The unit may be shared among sets and registers within this set.
181809467b48Spatrick computeUberWeights(UberSets, RegBank);
181909467b48Spatrick }
182009467b48Spatrick Changed = true;
182109467b48Spatrick }
182209467b48Spatrick
182309467b48Spatrick // Mark these units normalized so superregisters can't change their weights.
182409467b48Spatrick NormalUnits |= Reg->getRegUnits();
182509467b48Spatrick
182609467b48Spatrick return Changed;
182709467b48Spatrick }
182809467b48Spatrick
182909467b48Spatrick // Compute a weight for each register unit created during getSubRegs.
183009467b48Spatrick //
183109467b48Spatrick // The goal is that two registers in the same class will have the same weight,
183209467b48Spatrick // where each register's weight is defined as sum of its units' weights.
computeRegUnitWeights()183309467b48Spatrick void CodeGenRegBank::computeRegUnitWeights() {
183409467b48Spatrick std::vector<UberRegSet> UberSets;
183509467b48Spatrick std::vector<UberRegSet*> RegSets(Registers.size());
183609467b48Spatrick computeUberSets(UberSets, RegSets, *this);
183709467b48Spatrick // UberSets and RegSets are now immutable.
183809467b48Spatrick
183909467b48Spatrick computeUberWeights(UberSets, *this);
184009467b48Spatrick
184109467b48Spatrick // Iterate over each Register, normalizing the unit weights until reaching
184209467b48Spatrick // a fix point.
184309467b48Spatrick unsigned NumIters = 0;
184409467b48Spatrick for (bool Changed = true; Changed; ++NumIters) {
184509467b48Spatrick assert(NumIters <= NumNativeRegUnits && "Runaway register unit weights");
1846*d415bd75Srobert (void) NumIters;
184709467b48Spatrick Changed = false;
184809467b48Spatrick for (auto &Reg : Registers) {
184909467b48Spatrick CodeGenRegister::RegUnitList NormalUnits;
185009467b48Spatrick BitVector NormalRegs;
185109467b48Spatrick Changed |= normalizeWeight(&Reg, UberSets, RegSets, NormalRegs,
185209467b48Spatrick NormalUnits, *this);
185309467b48Spatrick }
185409467b48Spatrick }
185509467b48Spatrick }
185609467b48Spatrick
185709467b48Spatrick // Find a set in UniqueSets with the same elements as Set.
185809467b48Spatrick // Return an iterator into UniqueSets.
185909467b48Spatrick static std::vector<RegUnitSet>::const_iterator
findRegUnitSet(const std::vector<RegUnitSet> & UniqueSets,const RegUnitSet & Set)186009467b48Spatrick findRegUnitSet(const std::vector<RegUnitSet> &UniqueSets,
186109467b48Spatrick const RegUnitSet &Set) {
186209467b48Spatrick std::vector<RegUnitSet>::const_iterator
186309467b48Spatrick I = UniqueSets.begin(), E = UniqueSets.end();
186409467b48Spatrick for(;I != E; ++I) {
186509467b48Spatrick if (I->Units == Set.Units)
186609467b48Spatrick break;
186709467b48Spatrick }
186809467b48Spatrick return I;
186909467b48Spatrick }
187009467b48Spatrick
187109467b48Spatrick // Return true if the RUSubSet is a subset of RUSuperSet.
isRegUnitSubSet(const std::vector<unsigned> & RUSubSet,const std::vector<unsigned> & RUSuperSet)187209467b48Spatrick static bool isRegUnitSubSet(const std::vector<unsigned> &RUSubSet,
187309467b48Spatrick const std::vector<unsigned> &RUSuperSet) {
187409467b48Spatrick return std::includes(RUSuperSet.begin(), RUSuperSet.end(),
187509467b48Spatrick RUSubSet.begin(), RUSubSet.end());
187609467b48Spatrick }
187709467b48Spatrick
187809467b48Spatrick /// Iteratively prune unit sets. Prune subsets that are close to the superset,
187909467b48Spatrick /// but with one or two registers removed. We occasionally have registers like
188009467b48Spatrick /// APSR and PC thrown in with the general registers. We also see many
188109467b48Spatrick /// special-purpose register subsets, such as tail-call and Thumb
188209467b48Spatrick /// encodings. Generating all possible overlapping sets is combinatorial and
188309467b48Spatrick /// overkill for modeling pressure. Ideally we could fix this statically in
188409467b48Spatrick /// tablegen by (1) having the target define register classes that only include
188509467b48Spatrick /// the allocatable registers and marking other classes as non-allocatable and
188609467b48Spatrick /// (2) having a way to mark special purpose classes as "don't-care" classes for
188709467b48Spatrick /// the purpose of pressure. However, we make an attempt to handle targets that
188809467b48Spatrick /// are not nicely defined by merging nearly identical register unit sets
188909467b48Spatrick /// statically. This generates smaller tables. Then, dynamically, we adjust the
189009467b48Spatrick /// set limit by filtering the reserved registers.
189109467b48Spatrick ///
189209467b48Spatrick /// Merge sets only if the units have the same weight. For example, on ARM,
189309467b48Spatrick /// Q-tuples with ssub index 0 include all S regs but also include D16+. We
189409467b48Spatrick /// should not expand the S set to include D regs.
pruneUnitSets()189509467b48Spatrick void CodeGenRegBank::pruneUnitSets() {
189609467b48Spatrick assert(RegClassUnitSets.empty() && "this invalidates RegClassUnitSets");
189709467b48Spatrick
189809467b48Spatrick // Form an equivalence class of UnitSets with no significant difference.
189909467b48Spatrick std::vector<unsigned> SuperSetIDs;
190009467b48Spatrick for (unsigned SubIdx = 0, EndIdx = RegUnitSets.size();
190109467b48Spatrick SubIdx != EndIdx; ++SubIdx) {
190209467b48Spatrick const RegUnitSet &SubSet = RegUnitSets[SubIdx];
190309467b48Spatrick unsigned SuperIdx = 0;
190409467b48Spatrick for (; SuperIdx != EndIdx; ++SuperIdx) {
190509467b48Spatrick if (SuperIdx == SubIdx)
190609467b48Spatrick continue;
190709467b48Spatrick
190809467b48Spatrick unsigned UnitWeight = RegUnits[SubSet.Units[0]].Weight;
190909467b48Spatrick const RegUnitSet &SuperSet = RegUnitSets[SuperIdx];
191009467b48Spatrick if (isRegUnitSubSet(SubSet.Units, SuperSet.Units)
191109467b48Spatrick && (SubSet.Units.size() + 3 > SuperSet.Units.size())
191209467b48Spatrick && UnitWeight == RegUnits[SuperSet.Units[0]].Weight
191309467b48Spatrick && UnitWeight == RegUnits[SuperSet.Units.back()].Weight) {
191409467b48Spatrick LLVM_DEBUG(dbgs() << "UnitSet " << SubIdx << " subsumed by " << SuperIdx
191509467b48Spatrick << "\n");
191609467b48Spatrick // We can pick any of the set names for the merged set. Go for the
191709467b48Spatrick // shortest one to avoid picking the name of one of the classes that are
191809467b48Spatrick // artificially created by tablegen. So "FPR128_lo" instead of
191909467b48Spatrick // "QQQQ_with_qsub3_in_FPR128_lo".
192009467b48Spatrick if (RegUnitSets[SubIdx].Name.size() < RegUnitSets[SuperIdx].Name.size())
192109467b48Spatrick RegUnitSets[SuperIdx].Name = RegUnitSets[SubIdx].Name;
192209467b48Spatrick break;
192309467b48Spatrick }
192409467b48Spatrick }
192509467b48Spatrick if (SuperIdx == EndIdx)
192609467b48Spatrick SuperSetIDs.push_back(SubIdx);
192709467b48Spatrick }
192809467b48Spatrick // Populate PrunedUnitSets with each equivalence class's superset.
192909467b48Spatrick std::vector<RegUnitSet> PrunedUnitSets(SuperSetIDs.size());
193009467b48Spatrick for (unsigned i = 0, e = SuperSetIDs.size(); i != e; ++i) {
193109467b48Spatrick unsigned SuperIdx = SuperSetIDs[i];
193209467b48Spatrick PrunedUnitSets[i].Name = RegUnitSets[SuperIdx].Name;
193309467b48Spatrick PrunedUnitSets[i].Units.swap(RegUnitSets[SuperIdx].Units);
193409467b48Spatrick }
193509467b48Spatrick RegUnitSets.swap(PrunedUnitSets);
193609467b48Spatrick }
193709467b48Spatrick
193809467b48Spatrick // Create a RegUnitSet for each RegClass that contains all units in the class
193909467b48Spatrick // including adopted units that are necessary to model register pressure. Then
194009467b48Spatrick // iteratively compute RegUnitSets such that the union of any two overlapping
194109467b48Spatrick // RegUnitSets is repreresented.
194209467b48Spatrick //
194309467b48Spatrick // RegisterInfoEmitter will map each RegClass to its RegUnitClass and any
194409467b48Spatrick // RegUnitSet that is a superset of that RegUnitClass.
computeRegUnitSets()194509467b48Spatrick void CodeGenRegBank::computeRegUnitSets() {
194609467b48Spatrick assert(RegUnitSets.empty() && "dirty RegUnitSets");
194709467b48Spatrick
194809467b48Spatrick // Compute a unique RegUnitSet for each RegClass.
194909467b48Spatrick auto &RegClasses = getRegClasses();
195009467b48Spatrick for (auto &RC : RegClasses) {
1951097a140dSpatrick if (!RC.Allocatable || RC.Artificial || !RC.GeneratePressureSet)
195209467b48Spatrick continue;
195309467b48Spatrick
195409467b48Spatrick // Speculatively grow the RegUnitSets to hold the new set.
195509467b48Spatrick RegUnitSets.resize(RegUnitSets.size() + 1);
195609467b48Spatrick RegUnitSets.back().Name = RC.getName();
195709467b48Spatrick
195809467b48Spatrick // Compute a sorted list of units in this class.
195909467b48Spatrick RC.buildRegUnitSet(*this, RegUnitSets.back().Units);
196009467b48Spatrick
196109467b48Spatrick // Find an existing RegUnitSet.
196209467b48Spatrick std::vector<RegUnitSet>::const_iterator SetI =
196309467b48Spatrick findRegUnitSet(RegUnitSets, RegUnitSets.back());
196409467b48Spatrick if (SetI != std::prev(RegUnitSets.end()))
196509467b48Spatrick RegUnitSets.pop_back();
196609467b48Spatrick }
196709467b48Spatrick
1968*d415bd75Srobert if (RegUnitSets.empty())
1969*d415bd75Srobert PrintFatalError("RegUnitSets cannot be empty!");
1970*d415bd75Srobert
197109467b48Spatrick LLVM_DEBUG(dbgs() << "\nBefore pruning:\n"; for (unsigned USIdx = 0,
197209467b48Spatrick USEnd = RegUnitSets.size();
197309467b48Spatrick USIdx < USEnd; ++USIdx) {
197409467b48Spatrick dbgs() << "UnitSet " << USIdx << " " << RegUnitSets[USIdx].Name << ":";
197509467b48Spatrick for (auto &U : RegUnitSets[USIdx].Units)
197609467b48Spatrick printRegUnitName(U);
197709467b48Spatrick dbgs() << "\n";
197809467b48Spatrick });
197909467b48Spatrick
198009467b48Spatrick // Iteratively prune unit sets.
198109467b48Spatrick pruneUnitSets();
198209467b48Spatrick
198309467b48Spatrick LLVM_DEBUG(dbgs() << "\nBefore union:\n"; for (unsigned USIdx = 0,
198409467b48Spatrick USEnd = RegUnitSets.size();
198509467b48Spatrick USIdx < USEnd; ++USIdx) {
198609467b48Spatrick dbgs() << "UnitSet " << USIdx << " " << RegUnitSets[USIdx].Name << ":";
198709467b48Spatrick for (auto &U : RegUnitSets[USIdx].Units)
198809467b48Spatrick printRegUnitName(U);
198909467b48Spatrick dbgs() << "\n";
199009467b48Spatrick } dbgs() << "\nUnion sets:\n");
199109467b48Spatrick
199209467b48Spatrick // Iterate over all unit sets, including new ones added by this loop.
199309467b48Spatrick unsigned NumRegUnitSubSets = RegUnitSets.size();
199409467b48Spatrick for (unsigned Idx = 0, EndIdx = RegUnitSets.size(); Idx != EndIdx; ++Idx) {
199509467b48Spatrick // In theory, this is combinatorial. In practice, it needs to be bounded
199609467b48Spatrick // by a small number of sets for regpressure to be efficient.
199709467b48Spatrick // If the assert is hit, we need to implement pruning.
199809467b48Spatrick assert(Idx < (2*NumRegUnitSubSets) && "runaway unit set inference");
199909467b48Spatrick
200009467b48Spatrick // Compare new sets with all original classes.
200109467b48Spatrick for (unsigned SearchIdx = (Idx >= NumRegUnitSubSets) ? 0 : Idx+1;
200209467b48Spatrick SearchIdx != EndIdx; ++SearchIdx) {
200309467b48Spatrick std::set<unsigned> Intersection;
200409467b48Spatrick std::set_intersection(RegUnitSets[Idx].Units.begin(),
200509467b48Spatrick RegUnitSets[Idx].Units.end(),
200609467b48Spatrick RegUnitSets[SearchIdx].Units.begin(),
200709467b48Spatrick RegUnitSets[SearchIdx].Units.end(),
200809467b48Spatrick std::inserter(Intersection, Intersection.begin()));
200909467b48Spatrick if (Intersection.empty())
201009467b48Spatrick continue;
201109467b48Spatrick
201209467b48Spatrick // Speculatively grow the RegUnitSets to hold the new set.
201309467b48Spatrick RegUnitSets.resize(RegUnitSets.size() + 1);
201409467b48Spatrick RegUnitSets.back().Name =
2015097a140dSpatrick RegUnitSets[Idx].Name + "_with_" + RegUnitSets[SearchIdx].Name;
201609467b48Spatrick
201709467b48Spatrick std::set_union(RegUnitSets[Idx].Units.begin(),
201809467b48Spatrick RegUnitSets[Idx].Units.end(),
201909467b48Spatrick RegUnitSets[SearchIdx].Units.begin(),
202009467b48Spatrick RegUnitSets[SearchIdx].Units.end(),
202109467b48Spatrick std::inserter(RegUnitSets.back().Units,
202209467b48Spatrick RegUnitSets.back().Units.begin()));
202309467b48Spatrick
202409467b48Spatrick // Find an existing RegUnitSet, or add the union to the unique sets.
202509467b48Spatrick std::vector<RegUnitSet>::const_iterator SetI =
202609467b48Spatrick findRegUnitSet(RegUnitSets, RegUnitSets.back());
202709467b48Spatrick if (SetI != std::prev(RegUnitSets.end()))
202809467b48Spatrick RegUnitSets.pop_back();
202909467b48Spatrick else {
203009467b48Spatrick LLVM_DEBUG(dbgs() << "UnitSet " << RegUnitSets.size() - 1 << " "
203109467b48Spatrick << RegUnitSets.back().Name << ":";
203209467b48Spatrick for (auto &U
203309467b48Spatrick : RegUnitSets.back().Units) printRegUnitName(U);
203409467b48Spatrick dbgs() << "\n";);
203509467b48Spatrick }
203609467b48Spatrick }
203709467b48Spatrick }
203809467b48Spatrick
203909467b48Spatrick // Iteratively prune unit sets after inferring supersets.
204009467b48Spatrick pruneUnitSets();
204109467b48Spatrick
204209467b48Spatrick LLVM_DEBUG(
204309467b48Spatrick dbgs() << "\n"; for (unsigned USIdx = 0, USEnd = RegUnitSets.size();
204409467b48Spatrick USIdx < USEnd; ++USIdx) {
204509467b48Spatrick dbgs() << "UnitSet " << USIdx << " " << RegUnitSets[USIdx].Name << ":";
204609467b48Spatrick for (auto &U : RegUnitSets[USIdx].Units)
204709467b48Spatrick printRegUnitName(U);
204809467b48Spatrick dbgs() << "\n";
204909467b48Spatrick });
205009467b48Spatrick
205109467b48Spatrick // For each register class, list the UnitSets that are supersets.
205209467b48Spatrick RegClassUnitSets.resize(RegClasses.size());
205309467b48Spatrick int RCIdx = -1;
205409467b48Spatrick for (auto &RC : RegClasses) {
205509467b48Spatrick ++RCIdx;
205609467b48Spatrick if (!RC.Allocatable)
205709467b48Spatrick continue;
205809467b48Spatrick
205909467b48Spatrick // Recompute the sorted list of units in this class.
206009467b48Spatrick std::vector<unsigned> RCRegUnits;
206109467b48Spatrick RC.buildRegUnitSet(*this, RCRegUnits);
206209467b48Spatrick
206309467b48Spatrick // Don't increase pressure for unallocatable regclasses.
206409467b48Spatrick if (RCRegUnits.empty())
206509467b48Spatrick continue;
206609467b48Spatrick
206709467b48Spatrick LLVM_DEBUG(dbgs() << "RC " << RC.getName() << " Units:\n";
206809467b48Spatrick for (auto U
206909467b48Spatrick : RCRegUnits) printRegUnitName(U);
207009467b48Spatrick dbgs() << "\n UnitSetIDs:");
207109467b48Spatrick
207209467b48Spatrick // Find all supersets.
207309467b48Spatrick for (unsigned USIdx = 0, USEnd = RegUnitSets.size();
207409467b48Spatrick USIdx != USEnd; ++USIdx) {
207509467b48Spatrick if (isRegUnitSubSet(RCRegUnits, RegUnitSets[USIdx].Units)) {
207609467b48Spatrick LLVM_DEBUG(dbgs() << " " << USIdx);
207709467b48Spatrick RegClassUnitSets[RCIdx].push_back(USIdx);
207809467b48Spatrick }
207909467b48Spatrick }
208009467b48Spatrick LLVM_DEBUG(dbgs() << "\n");
2081*d415bd75Srobert assert((!RegClassUnitSets[RCIdx].empty() || !RC.GeneratePressureSet) &&
2082*d415bd75Srobert "missing unit set for regclass");
208309467b48Spatrick }
208409467b48Spatrick
208509467b48Spatrick // For each register unit, ensure that we have the list of UnitSets that
208609467b48Spatrick // contain the unit. Normally, this matches an existing list of UnitSets for a
208709467b48Spatrick // register class. If not, we create a new entry in RegClassUnitSets as a
208809467b48Spatrick // "fake" register class.
208909467b48Spatrick for (unsigned UnitIdx = 0, UnitEnd = NumNativeRegUnits;
209009467b48Spatrick UnitIdx < UnitEnd; ++UnitIdx) {
209109467b48Spatrick std::vector<unsigned> RUSets;
209209467b48Spatrick for (unsigned i = 0, e = RegUnitSets.size(); i != e; ++i) {
209309467b48Spatrick RegUnitSet &RUSet = RegUnitSets[i];
209409467b48Spatrick if (!is_contained(RUSet.Units, UnitIdx))
209509467b48Spatrick continue;
209609467b48Spatrick RUSets.push_back(i);
209709467b48Spatrick }
209809467b48Spatrick unsigned RCUnitSetsIdx = 0;
209909467b48Spatrick for (unsigned e = RegClassUnitSets.size();
210009467b48Spatrick RCUnitSetsIdx != e; ++RCUnitSetsIdx) {
210109467b48Spatrick if (RegClassUnitSets[RCUnitSetsIdx] == RUSets) {
210209467b48Spatrick break;
210309467b48Spatrick }
210409467b48Spatrick }
210509467b48Spatrick RegUnits[UnitIdx].RegClassUnitSetsIdx = RCUnitSetsIdx;
210609467b48Spatrick if (RCUnitSetsIdx == RegClassUnitSets.size()) {
210709467b48Spatrick // Create a new list of UnitSets as a "fake" register class.
210809467b48Spatrick RegClassUnitSets.resize(RCUnitSetsIdx + 1);
210909467b48Spatrick RegClassUnitSets[RCUnitSetsIdx].swap(RUSets);
211009467b48Spatrick }
211109467b48Spatrick }
211209467b48Spatrick }
211309467b48Spatrick
computeRegUnitLaneMasks()211409467b48Spatrick void CodeGenRegBank::computeRegUnitLaneMasks() {
211509467b48Spatrick for (auto &Register : Registers) {
211609467b48Spatrick // Create an initial lane mask for all register units.
211709467b48Spatrick const auto &RegUnits = Register.getRegUnits();
211809467b48Spatrick CodeGenRegister::RegUnitLaneMaskList
211909467b48Spatrick RegUnitLaneMasks(RegUnits.count(), LaneBitmask::getNone());
212009467b48Spatrick // Iterate through SubRegisters.
212109467b48Spatrick typedef CodeGenRegister::SubRegMap SubRegMap;
212209467b48Spatrick const SubRegMap &SubRegs = Register.getSubRegs();
212373471bf0Spatrick for (auto S : SubRegs) {
212473471bf0Spatrick CodeGenRegister *SubReg = S.second;
212509467b48Spatrick // Ignore non-leaf subregisters, their lane masks are fully covered by
212609467b48Spatrick // the leaf subregisters anyway.
212709467b48Spatrick if (!SubReg->getSubRegs().empty())
212809467b48Spatrick continue;
212973471bf0Spatrick CodeGenSubRegIndex *SubRegIndex = S.first;
213073471bf0Spatrick const CodeGenRegister *SubRegister = S.second;
213109467b48Spatrick LaneBitmask LaneMask = SubRegIndex->LaneMask;
213209467b48Spatrick // Distribute LaneMask to Register Units touched.
213309467b48Spatrick for (unsigned SUI : SubRegister->getRegUnits()) {
213409467b48Spatrick bool Found = false;
213509467b48Spatrick unsigned u = 0;
213609467b48Spatrick for (unsigned RU : RegUnits) {
213709467b48Spatrick if (SUI == RU) {
213809467b48Spatrick RegUnitLaneMasks[u] |= LaneMask;
213909467b48Spatrick assert(!Found);
214009467b48Spatrick Found = true;
214109467b48Spatrick }
214209467b48Spatrick ++u;
214309467b48Spatrick }
214409467b48Spatrick (void)Found;
214509467b48Spatrick assert(Found);
214609467b48Spatrick }
214709467b48Spatrick }
214809467b48Spatrick Register.setRegUnitLaneMasks(RegUnitLaneMasks);
214909467b48Spatrick }
215009467b48Spatrick }
215109467b48Spatrick
computeDerivedInfo()215209467b48Spatrick void CodeGenRegBank::computeDerivedInfo() {
215309467b48Spatrick computeComposites();
215409467b48Spatrick computeSubRegLaneMasks();
215509467b48Spatrick
215609467b48Spatrick // Compute a weight for each register unit created during getSubRegs.
215709467b48Spatrick // This may create adopted register units (with unit # >= NumNativeRegUnits).
215809467b48Spatrick computeRegUnitWeights();
215909467b48Spatrick
216009467b48Spatrick // Compute a unique set of RegUnitSets. One for each RegClass and inferred
216109467b48Spatrick // supersets for the union of overlapping sets.
216209467b48Spatrick computeRegUnitSets();
216309467b48Spatrick
216409467b48Spatrick computeRegUnitLaneMasks();
216509467b48Spatrick
216609467b48Spatrick // Compute register class HasDisjunctSubRegs/CoveredBySubRegs flag.
216709467b48Spatrick for (CodeGenRegisterClass &RC : RegClasses) {
216809467b48Spatrick RC.HasDisjunctSubRegs = false;
216909467b48Spatrick RC.CoveredBySubRegs = true;
217009467b48Spatrick for (const CodeGenRegister *Reg : RC.getMembers()) {
217109467b48Spatrick RC.HasDisjunctSubRegs |= Reg->HasDisjunctSubRegs;
217209467b48Spatrick RC.CoveredBySubRegs &= Reg->CoveredBySubRegs;
217309467b48Spatrick }
217409467b48Spatrick }
217509467b48Spatrick
217609467b48Spatrick // Get the weight of each set.
217709467b48Spatrick for (unsigned Idx = 0, EndIdx = RegUnitSets.size(); Idx != EndIdx; ++Idx)
217809467b48Spatrick RegUnitSets[Idx].Weight = getRegUnitSetWeight(RegUnitSets[Idx].Units);
217909467b48Spatrick
218009467b48Spatrick // Find the order of each set.
218109467b48Spatrick RegUnitSetOrder.reserve(RegUnitSets.size());
218209467b48Spatrick for (unsigned Idx = 0, EndIdx = RegUnitSets.size(); Idx != EndIdx; ++Idx)
218309467b48Spatrick RegUnitSetOrder.push_back(Idx);
218409467b48Spatrick
218509467b48Spatrick llvm::stable_sort(RegUnitSetOrder, [this](unsigned ID1, unsigned ID2) {
218609467b48Spatrick return getRegPressureSet(ID1).Units.size() <
218709467b48Spatrick getRegPressureSet(ID2).Units.size();
218809467b48Spatrick });
218909467b48Spatrick for (unsigned Idx = 0, EndIdx = RegUnitSets.size(); Idx != EndIdx; ++Idx) {
219009467b48Spatrick RegUnitSets[RegUnitSetOrder[Idx]].Order = Idx;
219109467b48Spatrick }
219209467b48Spatrick }
219309467b48Spatrick
219409467b48Spatrick //
219509467b48Spatrick // Synthesize missing register class intersections.
219609467b48Spatrick //
219709467b48Spatrick // Make sure that sub-classes of RC exists such that getCommonSubClass(RC, X)
219809467b48Spatrick // returns a maximal register class for all X.
219909467b48Spatrick //
inferCommonSubClass(CodeGenRegisterClass * RC)220009467b48Spatrick void CodeGenRegBank::inferCommonSubClass(CodeGenRegisterClass *RC) {
220109467b48Spatrick assert(!RegClasses.empty());
220209467b48Spatrick // Stash the iterator to the last element so that this loop doesn't visit
220309467b48Spatrick // elements added by the getOrCreateSubClass call within it.
220409467b48Spatrick for (auto I = RegClasses.begin(), E = std::prev(RegClasses.end());
220509467b48Spatrick I != std::next(E); ++I) {
220609467b48Spatrick CodeGenRegisterClass *RC1 = RC;
220709467b48Spatrick CodeGenRegisterClass *RC2 = &*I;
220809467b48Spatrick if (RC1 == RC2)
220909467b48Spatrick continue;
221009467b48Spatrick
221109467b48Spatrick // Compute the set intersection of RC1 and RC2.
221209467b48Spatrick const CodeGenRegister::Vec &Memb1 = RC1->getMembers();
221309467b48Spatrick const CodeGenRegister::Vec &Memb2 = RC2->getMembers();
221409467b48Spatrick CodeGenRegister::Vec Intersection;
221509467b48Spatrick std::set_intersection(Memb1.begin(), Memb1.end(), Memb2.begin(),
221609467b48Spatrick Memb2.end(),
221709467b48Spatrick std::inserter(Intersection, Intersection.begin()),
221809467b48Spatrick deref<std::less<>>());
221909467b48Spatrick
222009467b48Spatrick // Skip disjoint class pairs.
222109467b48Spatrick if (Intersection.empty())
222209467b48Spatrick continue;
222309467b48Spatrick
222409467b48Spatrick // If RC1 and RC2 have different spill sizes or alignments, use the
222509467b48Spatrick // stricter one for sub-classing. If they are equal, prefer RC1.
222609467b48Spatrick if (RC2->RSI.hasStricterSpillThan(RC1->RSI))
222709467b48Spatrick std::swap(RC1, RC2);
222809467b48Spatrick
222909467b48Spatrick getOrCreateSubClass(RC1, &Intersection,
223009467b48Spatrick RC1->getName() + "_and_" + RC2->getName());
223109467b48Spatrick }
223209467b48Spatrick }
223309467b48Spatrick
223409467b48Spatrick //
223509467b48Spatrick // Synthesize missing sub-classes for getSubClassWithSubReg().
223609467b48Spatrick //
223709467b48Spatrick // Make sure that the set of registers in RC with a given SubIdx sub-register
223809467b48Spatrick // form a register class. Update RC->SubClassWithSubReg.
223909467b48Spatrick //
inferSubClassWithSubReg(CodeGenRegisterClass * RC)224009467b48Spatrick void CodeGenRegBank::inferSubClassWithSubReg(CodeGenRegisterClass *RC) {
224109467b48Spatrick // Map SubRegIndex to set of registers in RC supporting that SubRegIndex.
224209467b48Spatrick typedef std::map<const CodeGenSubRegIndex *, CodeGenRegister::Vec,
224309467b48Spatrick deref<std::less<>>>
224409467b48Spatrick SubReg2SetMap;
224509467b48Spatrick
224609467b48Spatrick // Compute the set of registers supporting each SubRegIndex.
224709467b48Spatrick SubReg2SetMap SRSets;
224809467b48Spatrick for (const auto R : RC->getMembers()) {
224909467b48Spatrick if (R->Artificial)
225009467b48Spatrick continue;
225109467b48Spatrick const CodeGenRegister::SubRegMap &SRM = R->getSubRegs();
225273471bf0Spatrick for (auto I : SRM) {
225373471bf0Spatrick if (!I.first->Artificial)
225473471bf0Spatrick SRSets[I.first].push_back(R);
225509467b48Spatrick }
225609467b48Spatrick }
225709467b48Spatrick
225809467b48Spatrick for (auto I : SRSets)
225909467b48Spatrick sortAndUniqueRegisters(I.second);
226009467b48Spatrick
226109467b48Spatrick // Find matching classes for all SRSets entries. Iterate in SubRegIndex
226209467b48Spatrick // numerical order to visit synthetic indices last.
226309467b48Spatrick for (const auto &SubIdx : SubRegIndices) {
226409467b48Spatrick if (SubIdx.Artificial)
226509467b48Spatrick continue;
226609467b48Spatrick SubReg2SetMap::const_iterator I = SRSets.find(&SubIdx);
226709467b48Spatrick // Unsupported SubRegIndex. Skip it.
226809467b48Spatrick if (I == SRSets.end())
226909467b48Spatrick continue;
227009467b48Spatrick // In most cases, all RC registers support the SubRegIndex.
227109467b48Spatrick if (I->second.size() == RC->getMembers().size()) {
227209467b48Spatrick RC->setSubClassWithSubReg(&SubIdx, RC);
227309467b48Spatrick continue;
227409467b48Spatrick }
227509467b48Spatrick // This is a real subset. See if we have a matching class.
227609467b48Spatrick CodeGenRegisterClass *SubRC =
227709467b48Spatrick getOrCreateSubClass(RC, &I->second,
227809467b48Spatrick RC->getName() + "_with_" + I->first->getName());
227909467b48Spatrick RC->setSubClassWithSubReg(&SubIdx, SubRC);
228009467b48Spatrick }
228109467b48Spatrick }
228209467b48Spatrick
228309467b48Spatrick //
228409467b48Spatrick // Synthesize missing sub-classes of RC for getMatchingSuperRegClass().
228509467b48Spatrick //
228609467b48Spatrick // Create sub-classes of RC such that getMatchingSuperRegClass(RC, SubIdx, X)
228709467b48Spatrick // has a maximal result for any SubIdx and any X >= FirstSubRegRC.
228809467b48Spatrick //
228909467b48Spatrick
inferMatchingSuperRegClass(CodeGenRegisterClass * RC,std::list<CodeGenRegisterClass>::iterator FirstSubRegRC)229009467b48Spatrick void CodeGenRegBank::inferMatchingSuperRegClass(CodeGenRegisterClass *RC,
229109467b48Spatrick std::list<CodeGenRegisterClass>::iterator FirstSubRegRC) {
229209467b48Spatrick SmallVector<std::pair<const CodeGenRegister*,
229309467b48Spatrick const CodeGenRegister*>, 16> SSPairs;
229409467b48Spatrick BitVector TopoSigs(getNumTopoSigs());
229509467b48Spatrick
229609467b48Spatrick // Iterate in SubRegIndex numerical order to visit synthetic indices last.
229709467b48Spatrick for (auto &SubIdx : SubRegIndices) {
229809467b48Spatrick // Skip indexes that aren't fully supported by RC's registers. This was
229909467b48Spatrick // computed by inferSubClassWithSubReg() above which should have been
230009467b48Spatrick // called first.
230109467b48Spatrick if (RC->getSubClassWithSubReg(&SubIdx) != RC)
230209467b48Spatrick continue;
230309467b48Spatrick
230409467b48Spatrick // Build list of (Super, Sub) pairs for this SubIdx.
230509467b48Spatrick SSPairs.clear();
230609467b48Spatrick TopoSigs.reset();
230709467b48Spatrick for (const auto Super : RC->getMembers()) {
230809467b48Spatrick const CodeGenRegister *Sub = Super->getSubRegs().find(&SubIdx)->second;
230909467b48Spatrick assert(Sub && "Missing sub-register");
231009467b48Spatrick SSPairs.push_back(std::make_pair(Super, Sub));
231109467b48Spatrick TopoSigs.set(Sub->getTopoSig());
231209467b48Spatrick }
231309467b48Spatrick
231409467b48Spatrick // Iterate over sub-register class candidates. Ignore classes created by
231509467b48Spatrick // this loop. They will never be useful.
231609467b48Spatrick // Store an iterator to the last element (not end) so that this loop doesn't
231709467b48Spatrick // visit newly inserted elements.
231809467b48Spatrick assert(!RegClasses.empty());
231909467b48Spatrick for (auto I = FirstSubRegRC, E = std::prev(RegClasses.end());
232009467b48Spatrick I != std::next(E); ++I) {
232109467b48Spatrick CodeGenRegisterClass &SubRC = *I;
232209467b48Spatrick if (SubRC.Artificial)
232309467b48Spatrick continue;
232409467b48Spatrick // Topological shortcut: SubRC members have the wrong shape.
232509467b48Spatrick if (!TopoSigs.anyCommon(SubRC.getTopoSigs()))
232609467b48Spatrick continue;
232709467b48Spatrick // Compute the subset of RC that maps into SubRC.
232809467b48Spatrick CodeGenRegister::Vec SubSetVec;
232909467b48Spatrick for (unsigned i = 0, e = SSPairs.size(); i != e; ++i)
233009467b48Spatrick if (SubRC.contains(SSPairs[i].second))
233109467b48Spatrick SubSetVec.push_back(SSPairs[i].first);
233209467b48Spatrick
233309467b48Spatrick if (SubSetVec.empty())
233409467b48Spatrick continue;
233509467b48Spatrick
233609467b48Spatrick // RC injects completely into SubRC.
233709467b48Spatrick sortAndUniqueRegisters(SubSetVec);
233809467b48Spatrick if (SubSetVec.size() == SSPairs.size()) {
233909467b48Spatrick SubRC.addSuperRegClass(&SubIdx, RC);
234009467b48Spatrick continue;
234109467b48Spatrick }
234209467b48Spatrick
234309467b48Spatrick // Only a subset of RC maps into SubRC. Make sure it is represented by a
234409467b48Spatrick // class.
234509467b48Spatrick getOrCreateSubClass(RC, &SubSetVec, RC->getName() + "_with_" +
234609467b48Spatrick SubIdx.getName() + "_in_" +
234709467b48Spatrick SubRC.getName());
234809467b48Spatrick }
234909467b48Spatrick }
235009467b48Spatrick }
235109467b48Spatrick
235209467b48Spatrick //
235309467b48Spatrick // Infer missing register classes.
235409467b48Spatrick //
computeInferredRegisterClasses()235509467b48Spatrick void CodeGenRegBank::computeInferredRegisterClasses() {
235609467b48Spatrick assert(!RegClasses.empty());
235709467b48Spatrick // When this function is called, the register classes have not been sorted
235809467b48Spatrick // and assigned EnumValues yet. That means getSubClasses(),
235909467b48Spatrick // getSuperClasses(), and hasSubClass() functions are defunct.
236009467b48Spatrick
236109467b48Spatrick // Use one-before-the-end so it doesn't move forward when new elements are
236209467b48Spatrick // added.
236309467b48Spatrick auto FirstNewRC = std::prev(RegClasses.end());
236409467b48Spatrick
236509467b48Spatrick // Visit all register classes, including the ones being added by the loop.
236609467b48Spatrick // Watch out for iterator invalidation here.
236709467b48Spatrick for (auto I = RegClasses.begin(), E = RegClasses.end(); I != E; ++I) {
236809467b48Spatrick CodeGenRegisterClass *RC = &*I;
236909467b48Spatrick if (RC->Artificial)
237009467b48Spatrick continue;
237109467b48Spatrick
237209467b48Spatrick // Synthesize answers for getSubClassWithSubReg().
237309467b48Spatrick inferSubClassWithSubReg(RC);
237409467b48Spatrick
237509467b48Spatrick // Synthesize answers for getCommonSubClass().
237609467b48Spatrick inferCommonSubClass(RC);
237709467b48Spatrick
237809467b48Spatrick // Synthesize answers for getMatchingSuperRegClass().
237909467b48Spatrick inferMatchingSuperRegClass(RC);
238009467b48Spatrick
238109467b48Spatrick // New register classes are created while this loop is running, and we need
238209467b48Spatrick // to visit all of them. I particular, inferMatchingSuperRegClass needs
238309467b48Spatrick // to match old super-register classes with sub-register classes created
238409467b48Spatrick // after inferMatchingSuperRegClass was called. At this point,
238509467b48Spatrick // inferMatchingSuperRegClass has checked SuperRC = [0..rci] with SubRC =
238609467b48Spatrick // [0..FirstNewRC). We need to cover SubRC = [FirstNewRC..rci].
238709467b48Spatrick if (I == FirstNewRC) {
238809467b48Spatrick auto NextNewRC = std::prev(RegClasses.end());
238909467b48Spatrick for (auto I2 = RegClasses.begin(), E2 = std::next(FirstNewRC); I2 != E2;
239009467b48Spatrick ++I2)
239109467b48Spatrick inferMatchingSuperRegClass(&*I2, E2);
239209467b48Spatrick FirstNewRC = NextNewRC;
239309467b48Spatrick }
239409467b48Spatrick }
239509467b48Spatrick }
239609467b48Spatrick
239709467b48Spatrick /// getRegisterClassForRegister - Find the register class that contains the
239809467b48Spatrick /// specified physical register. If the register is not in a register class,
239909467b48Spatrick /// return null. If the register is in multiple classes, and the classes have a
240009467b48Spatrick /// superset-subset relationship and the same set of types, return the
240109467b48Spatrick /// superclass. Otherwise return null.
240209467b48Spatrick const CodeGenRegisterClass*
getRegClassForRegister(Record * R)240309467b48Spatrick CodeGenRegBank::getRegClassForRegister(Record *R) {
240409467b48Spatrick const CodeGenRegister *Reg = getReg(R);
240509467b48Spatrick const CodeGenRegisterClass *FoundRC = nullptr;
240609467b48Spatrick for (const auto &RC : getRegClasses()) {
240709467b48Spatrick if (!RC.contains(Reg))
240809467b48Spatrick continue;
240909467b48Spatrick
241009467b48Spatrick // If this is the first class that contains the register,
241109467b48Spatrick // make a note of it and go on to the next class.
241209467b48Spatrick if (!FoundRC) {
241309467b48Spatrick FoundRC = &RC;
241409467b48Spatrick continue;
241509467b48Spatrick }
241609467b48Spatrick
241709467b48Spatrick // If a register's classes have different types, return null.
241809467b48Spatrick if (RC.getValueTypes() != FoundRC->getValueTypes())
241909467b48Spatrick return nullptr;
242009467b48Spatrick
242109467b48Spatrick // Check to see if the previously found class that contains
242209467b48Spatrick // the register is a subclass of the current class. If so,
242309467b48Spatrick // prefer the superclass.
242409467b48Spatrick if (RC.hasSubClass(FoundRC)) {
242509467b48Spatrick FoundRC = &RC;
242609467b48Spatrick continue;
242709467b48Spatrick }
242809467b48Spatrick
242909467b48Spatrick // Check to see if the previously found class that contains
243009467b48Spatrick // the register is a superclass of the current class. If so,
243109467b48Spatrick // prefer the superclass.
243209467b48Spatrick if (FoundRC->hasSubClass(&RC))
243309467b48Spatrick continue;
243409467b48Spatrick
243509467b48Spatrick // Multiple classes, and neither is a superclass of the other.
243609467b48Spatrick // Return null.
243709467b48Spatrick return nullptr;
243809467b48Spatrick }
243909467b48Spatrick return FoundRC;
244009467b48Spatrick }
244109467b48Spatrick
244209467b48Spatrick const CodeGenRegisterClass *
getMinimalPhysRegClass(Record * RegRecord,ValueTypeByHwMode * VT)244309467b48Spatrick CodeGenRegBank::getMinimalPhysRegClass(Record *RegRecord,
244409467b48Spatrick ValueTypeByHwMode *VT) {
244509467b48Spatrick const CodeGenRegister *Reg = getReg(RegRecord);
244609467b48Spatrick const CodeGenRegisterClass *BestRC = nullptr;
244709467b48Spatrick for (const auto &RC : getRegClasses()) {
244809467b48Spatrick if ((!VT || RC.hasType(*VT)) &&
244909467b48Spatrick RC.contains(Reg) && (!BestRC || BestRC->hasSubClass(&RC)))
245009467b48Spatrick BestRC = &RC;
245109467b48Spatrick }
245209467b48Spatrick
245309467b48Spatrick assert(BestRC && "Couldn't find the register class");
245409467b48Spatrick return BestRC;
245509467b48Spatrick }
245609467b48Spatrick
computeCoveredRegisters(ArrayRef<Record * > Regs)245709467b48Spatrick BitVector CodeGenRegBank::computeCoveredRegisters(ArrayRef<Record*> Regs) {
245809467b48Spatrick SetVector<const CodeGenRegister*> Set;
245909467b48Spatrick
246009467b48Spatrick // First add Regs with all sub-registers.
246109467b48Spatrick for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
246209467b48Spatrick CodeGenRegister *Reg = getReg(Regs[i]);
246309467b48Spatrick if (Set.insert(Reg))
246409467b48Spatrick // Reg is new, add all sub-registers.
246509467b48Spatrick // The pre-ordering is not important here.
246609467b48Spatrick Reg->addSubRegsPreOrder(Set, *this);
246709467b48Spatrick }
246809467b48Spatrick
246909467b48Spatrick // Second, find all super-registers that are completely covered by the set.
247009467b48Spatrick for (unsigned i = 0; i != Set.size(); ++i) {
247109467b48Spatrick const CodeGenRegister::SuperRegList &SR = Set[i]->getSuperRegs();
247209467b48Spatrick for (unsigned j = 0, e = SR.size(); j != e; ++j) {
247309467b48Spatrick const CodeGenRegister *Super = SR[j];
247409467b48Spatrick if (!Super->CoveredBySubRegs || Set.count(Super))
247509467b48Spatrick continue;
247609467b48Spatrick // This new super-register is covered by its sub-registers.
247709467b48Spatrick bool AllSubsInSet = true;
247809467b48Spatrick const CodeGenRegister::SubRegMap &SRM = Super->getSubRegs();
247973471bf0Spatrick for (auto I : SRM)
248073471bf0Spatrick if (!Set.count(I.second)) {
248109467b48Spatrick AllSubsInSet = false;
248209467b48Spatrick break;
248309467b48Spatrick }
248409467b48Spatrick // All sub-registers in Set, add Super as well.
248509467b48Spatrick // We will visit Super later to recheck its super-registers.
248609467b48Spatrick if (AllSubsInSet)
248709467b48Spatrick Set.insert(Super);
248809467b48Spatrick }
248909467b48Spatrick }
249009467b48Spatrick
249109467b48Spatrick // Convert to BitVector.
249209467b48Spatrick BitVector BV(Registers.size() + 1);
249309467b48Spatrick for (unsigned i = 0, e = Set.size(); i != e; ++i)
249409467b48Spatrick BV.set(Set[i]->EnumValue);
249509467b48Spatrick return BV;
249609467b48Spatrick }
249709467b48Spatrick
printRegUnitName(unsigned Unit) const249809467b48Spatrick void CodeGenRegBank::printRegUnitName(unsigned Unit) const {
249909467b48Spatrick if (Unit < NumNativeRegUnits)
250009467b48Spatrick dbgs() << ' ' << RegUnits[Unit].Roots[0]->getName();
250109467b48Spatrick else
250209467b48Spatrick dbgs() << " #" << Unit;
250309467b48Spatrick }
2504