summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2008-08-14 18:34:18 +0000
committerOwen Anderson <resistor@mac.com>2008-08-14 18:34:18 +0000
commit22ae99908258dd5631fde7128a94c418ed08eae5 (patch)
tree797b5ec7146e0c8d2204e4c0bcd8f7bf7650b6ae /utils
parenta8c763b3071ae1a58ee8baeb282331245527e004 (diff)
downloadllvm-22ae99908258dd5631fde7128a94c418ed08eae5.tar.gz
llvm-22ae99908258dd5631fde7128a94c418ed08eae5.tar.bz2
llvm-22ae99908258dd5631fde7128a94c418ed08eae5.tar.xz
Speed up addRegisterDead by adding more fast checks before performing the expensive
subregister query, and by increasing the size of the subregister hashtable so that there are fewer collisions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54781 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r--utils/TableGen/RegisterInfoEmitter.cpp12
1 files changed, 9 insertions, 3 deletions
diff --git a/utils/TableGen/RegisterInfoEmitter.cpp b/utils/TableGen/RegisterInfoEmitter.cpp
index 2870c8038b..d514bf7deb 100644
--- a/utils/TableGen/RegisterInfoEmitter.cpp
+++ b/utils/TableGen/RegisterInfoEmitter.cpp
@@ -473,10 +473,12 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
NumSubRegs += RegisterSubRegs[Regs[i].TheDef].size();
}
- unsigned SubregHashTableSize = NextPowerOf2(2 * NumSubRegs);
+ unsigned SubregHashTableSize = 2 * NextPowerOf2(2 * NumSubRegs);
unsigned* SubregHashTable = new unsigned[2 * SubregHashTableSize];
std::fill(SubregHashTable, SubregHashTable + 2 * SubregHashTableSize, ~0U);
+ unsigned hashMisses = 0;
+
for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
Record* R = Regs[i].TheDef;
for (std::set<Record*>::iterator I = RegisterSubRegs[R].begin(),
@@ -491,6 +493,8 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
SubregHashTable[index*2+1] != ~0U) {
index = (index + ProbeAmt) & (SubregHashTableSize-1);
ProbeAmt += 2;
+
+ hashMisses++;
}
SubregHashTable[index*2] = i;
@@ -498,10 +502,12 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
}
}
+ OS << "\n\n // Number of hash collisions: " << hashMisses << "\n";
+
if (SubregHashTableSize) {
std::string Namespace = Regs[0].TheDef->getValueAsString("Namespace");
- OS << "\n\n const unsigned SubregHashTable[] = { ";
+ OS << " const unsigned SubregHashTable[] = { ";
for (unsigned i = 0; i < SubregHashTableSize - 1; ++i) {
if (i != 0)
// Insert spaces for nice formatting.
@@ -527,7 +533,7 @@ void RegisterInfoEmitter::run(std::ostream &OS) {
OS << " const unsigned SubregHashTableSize = "
<< SubregHashTableSize << ";\n";
} else {
- OS << "\n\n const unsigned SubregHashTable[] = { ~0U, ~0U };\n"
+ OS << " const unsigned SubregHashTable[] = { ~0U, ~0U };\n"
<< " const unsigned SubregHashTableSize = 1;\n";
}