Skip to content

Commit 1d3e50f

Browse files
committed
[GISel] Remove BitVector from RegBank. Use tablegen CoverageData tables directly. NFC
RegBanks are allocated as global variables. The use of BitVector causes a static global constructor to be used. The BitVector is initialized from a table of bits that is created by tablegen. We can keep a pointer to that data and use it as the bit vector instead. This does require a little bit of manual indexing and reimplementation of BitVector::count.
1 parent a135822 commit 1d3e50f

File tree

2 files changed

+15
-16
lines changed

2 files changed

+15
-16
lines changed

llvm/include/llvm/CodeGen/RegisterBank.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
#ifndef LLVM_CODEGEN_REGISTERBANK_H
1414
#define LLVM_CODEGEN_REGISTERBANK_H
1515

16-
#include "llvm/ADT/BitVector.h"
16+
#include <cstdint>
1717

1818
namespace llvm {
1919
// Forward declarations.
@@ -28,15 +28,18 @@ class TargetRegisterInfo;
2828
class RegisterBank {
2929
private:
3030
unsigned ID;
31+
unsigned NumRegClasses;
3132
const char *Name;
32-
BitVector ContainedRegClasses;
33+
const uint32_t *CoveredClasses;
3334

3435
/// Only the RegisterBankInfo can initialize RegisterBank properly.
3536
friend RegisterBankInfo;
3637

3738
public:
3839
RegisterBank(unsigned ID, const char *Name, const uint32_t *CoveredClasses,
39-
unsigned NumRegClasses);
40+
unsigned NumRegClasses)
41+
: ID(ID), NumRegClasses(NumRegClasses), Name(Name),
42+
CoveredClasses(CoveredClasses) {}
4043

4144
/// Get the identifier of this register bank.
4245
unsigned getID() const { return ID; }

llvm/lib/CodeGen/RegisterBank.cpp

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,6 @@
2020

2121
using namespace llvm;
2222

23-
RegisterBank::RegisterBank(unsigned ID, const char *Name,
24-
const uint32_t *CoveredClasses,
25-
unsigned NumRegClasses)
26-
: ID(ID), Name(Name) {
27-
ContainedRegClasses.resize(NumRegClasses);
28-
ContainedRegClasses.setBitsInMask(CoveredClasses);
29-
}
30-
3123
bool RegisterBank::verify(const RegisterBankInfo &RBI,
3224
const TargetRegisterInfo &TRI) const {
3325
for (unsigned RCId = 0, End = TRI.getNumRegClasses(); RCId != End; ++RCId) {
@@ -58,7 +50,7 @@ bool RegisterBank::verify(const RegisterBankInfo &RBI,
5850
}
5951

6052
bool RegisterBank::covers(const TargetRegisterClass &RC) const {
61-
return ContainedRegClasses.test(RC.getID());
53+
return (CoveredClasses[RC.getID() / 32] & (1U << RC.getID() % 32)) != 0;
6254
}
6355

6456
bool RegisterBank::operator==(const RegisterBank &OtherRB) const {
@@ -81,14 +73,18 @@ void RegisterBank::print(raw_ostream &OS, bool IsForDebug,
8173
OS << getName();
8274
if (!IsForDebug)
8375
return;
76+
77+
unsigned Count = 0;
78+
for (int i = 0, e = ((NumRegClasses + 31) / 32); i != e; ++i)
79+
Count += llvm::popcount(CoveredClasses[i]);
80+
8481
OS << "(ID:" << getID() << ")\n"
85-
<< "Number of Covered register classes: " << ContainedRegClasses.count()
86-
<< '\n';
82+
<< "Number of Covered register classes: " << Count << '\n';
8783
// Print all the subclasses if we can.
8884
// This register classes may not be properly initialized yet.
89-
if (!TRI || ContainedRegClasses.empty())
85+
if (!TRI || NumRegClasses == 0)
9086
return;
91-
assert(ContainedRegClasses.size() == TRI->getNumRegClasses() &&
87+
assert(NumRegClasses == TRI->getNumRegClasses() &&
9288
"TRI does not match the initialization process?");
9389
OS << "Covered register classes:\n";
9490
ListSeparator LS;

0 commit comments

Comments
 (0)