1*9880d681SAndroid Build Coastguard Worker //===- llvm/CodeGen/GlobalISel/RegisterBank.cpp - Register Bank --*- C++ -*-==//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker /// \file
10*9880d681SAndroid Build Coastguard Worker /// This file implements the RegisterBank class.
11*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/GlobalISel/RegisterBank.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetRegisterInfo.h"
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Worker #define DEBUG_TYPE "registerbank"
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Worker using namespace llvm;
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Worker const unsigned RegisterBank::InvalidID = UINT_MAX;
21*9880d681SAndroid Build Coastguard Worker
RegisterBank()22*9880d681SAndroid Build Coastguard Worker RegisterBank::RegisterBank() : ID(InvalidID), Name(nullptr), Size(0) {}
23*9880d681SAndroid Build Coastguard Worker
verify(const TargetRegisterInfo & TRI) const24*9880d681SAndroid Build Coastguard Worker bool RegisterBank::verify(const TargetRegisterInfo &TRI) const {
25*9880d681SAndroid Build Coastguard Worker assert(isValid() && "Invalid register bank");
26*9880d681SAndroid Build Coastguard Worker assert(ContainedRegClasses.size() == TRI.getNumRegClasses() &&
27*9880d681SAndroid Build Coastguard Worker "TRI does not match the initialization process?");
28*9880d681SAndroid Build Coastguard Worker for (unsigned RCId = 0, End = TRI.getNumRegClasses(); RCId != End; ++RCId) {
29*9880d681SAndroid Build Coastguard Worker const TargetRegisterClass &RC = *TRI.getRegClass(RCId);
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker if (!covers(RC))
32*9880d681SAndroid Build Coastguard Worker continue;
33*9880d681SAndroid Build Coastguard Worker // Verify that the register bank covers all the sub classes of the
34*9880d681SAndroid Build Coastguard Worker // classes it covers.
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Worker // Use a different (slow in that case) method than
37*9880d681SAndroid Build Coastguard Worker // RegisterBankInfo to find the subclasses of RC, to make sure
38*9880d681SAndroid Build Coastguard Worker // both agree on the covers.
39*9880d681SAndroid Build Coastguard Worker for (unsigned SubRCId = 0; SubRCId != End; ++SubRCId) {
40*9880d681SAndroid Build Coastguard Worker const TargetRegisterClass &SubRC = *TRI.getRegClass(RCId);
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker if (!RC.hasSubClassEq(&SubRC))
43*9880d681SAndroid Build Coastguard Worker continue;
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker // Verify that the Size of the register bank is big enough to cover
46*9880d681SAndroid Build Coastguard Worker // all the register classes it covers.
47*9880d681SAndroid Build Coastguard Worker assert((getSize() >= SubRC.getSize() * 8) &&
48*9880d681SAndroid Build Coastguard Worker "Size is not big enough for all the subclasses!");
49*9880d681SAndroid Build Coastguard Worker assert(covers(SubRC) && "Not all subclasses are covered");
50*9880d681SAndroid Build Coastguard Worker }
51*9880d681SAndroid Build Coastguard Worker }
52*9880d681SAndroid Build Coastguard Worker return true;
53*9880d681SAndroid Build Coastguard Worker }
54*9880d681SAndroid Build Coastguard Worker
covers(const TargetRegisterClass & RC) const55*9880d681SAndroid Build Coastguard Worker bool RegisterBank::covers(const TargetRegisterClass &RC) const {
56*9880d681SAndroid Build Coastguard Worker assert(isValid() && "RB hasn't been initialized yet");
57*9880d681SAndroid Build Coastguard Worker return ContainedRegClasses.test(RC.getID());
58*9880d681SAndroid Build Coastguard Worker }
59*9880d681SAndroid Build Coastguard Worker
isValid() const60*9880d681SAndroid Build Coastguard Worker bool RegisterBank::isValid() const {
61*9880d681SAndroid Build Coastguard Worker return ID != InvalidID && Name != nullptr && Size != 0 &&
62*9880d681SAndroid Build Coastguard Worker // A register bank that does not cover anything is useless.
63*9880d681SAndroid Build Coastguard Worker !ContainedRegClasses.empty();
64*9880d681SAndroid Build Coastguard Worker }
65*9880d681SAndroid Build Coastguard Worker
operator ==(const RegisterBank & OtherRB) const66*9880d681SAndroid Build Coastguard Worker bool RegisterBank::operator==(const RegisterBank &OtherRB) const {
67*9880d681SAndroid Build Coastguard Worker // There must be only one instance of a given register bank alive
68*9880d681SAndroid Build Coastguard Worker // for the whole compilation.
69*9880d681SAndroid Build Coastguard Worker // The RegisterBankInfo is supposed to enforce that.
70*9880d681SAndroid Build Coastguard Worker assert((OtherRB.getID() != getID() || &OtherRB == this) &&
71*9880d681SAndroid Build Coastguard Worker "ID does not uniquely identify a RegisterBank");
72*9880d681SAndroid Build Coastguard Worker return &OtherRB == this;
73*9880d681SAndroid Build Coastguard Worker }
74*9880d681SAndroid Build Coastguard Worker
dump(const TargetRegisterInfo * TRI) const75*9880d681SAndroid Build Coastguard Worker void RegisterBank::dump(const TargetRegisterInfo *TRI) const {
76*9880d681SAndroid Build Coastguard Worker print(dbgs(), /* IsForDebug */ true, TRI);
77*9880d681SAndroid Build Coastguard Worker }
78*9880d681SAndroid Build Coastguard Worker
print(raw_ostream & OS,bool IsForDebug,const TargetRegisterInfo * TRI) const79*9880d681SAndroid Build Coastguard Worker void RegisterBank::print(raw_ostream &OS, bool IsForDebug,
80*9880d681SAndroid Build Coastguard Worker const TargetRegisterInfo *TRI) const {
81*9880d681SAndroid Build Coastguard Worker OS << getName();
82*9880d681SAndroid Build Coastguard Worker if (!IsForDebug)
83*9880d681SAndroid Build Coastguard Worker return;
84*9880d681SAndroid Build Coastguard Worker OS << "(ID:" << getID() << ", Size:" << getSize() << ")\n"
85*9880d681SAndroid Build Coastguard Worker << "isValid:" << isValid() << '\n'
86*9880d681SAndroid Build Coastguard Worker << "Number of Covered register classes: " << ContainedRegClasses.count()
87*9880d681SAndroid Build Coastguard Worker << '\n';
88*9880d681SAndroid Build Coastguard Worker // Print all the subclasses if we can.
89*9880d681SAndroid Build Coastguard Worker // This register classes may not be properly initialized yet.
90*9880d681SAndroid Build Coastguard Worker if (!TRI || ContainedRegClasses.empty())
91*9880d681SAndroid Build Coastguard Worker return;
92*9880d681SAndroid Build Coastguard Worker assert(ContainedRegClasses.size() == TRI->getNumRegClasses() &&
93*9880d681SAndroid Build Coastguard Worker "TRI does not match the initialization process?");
94*9880d681SAndroid Build Coastguard Worker bool IsFirst = true;
95*9880d681SAndroid Build Coastguard Worker OS << "Covered register classes:\n";
96*9880d681SAndroid Build Coastguard Worker for (unsigned RCId = 0, End = TRI->getNumRegClasses(); RCId != End; ++RCId) {
97*9880d681SAndroid Build Coastguard Worker const TargetRegisterClass &RC = *TRI->getRegClass(RCId);
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Worker if (!covers(RC))
100*9880d681SAndroid Build Coastguard Worker continue;
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker if (!IsFirst)
103*9880d681SAndroid Build Coastguard Worker OS << ", ";
104*9880d681SAndroid Build Coastguard Worker OS << TRI->getRegClassName(&RC);
105*9880d681SAndroid Build Coastguard Worker IsFirst = false;
106*9880d681SAndroid Build Coastguard Worker }
107*9880d681SAndroid Build Coastguard Worker }
108