aboutsummaryrefslogtreecommitdiff
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
parenta8c763b3071ae1a58ee8baeb282331245527e004 (diff)
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
-rw-r--r--lib/CodeGen/MachineInstr.cpp4
-rw-r--r--utils/TableGen/RegisterInfoEmitter.cpp12
2 files changed, 12 insertions, 4 deletions
diff --git a/lib/CodeGen/MachineInstr.cpp b/lib/CodeGen/MachineInstr.cpp
index c952293976..d602e2442f 100644
--- a/lib/CodeGen/MachineInstr.cpp
+++ b/lib/CodeGen/MachineInstr.cpp
@@ -834,7 +834,9 @@ bool MachineInstr::addRegisterDead(unsigned IncomingReg,
// There exists a super-register that's marked dead.
if (RegInfo->isSuperRegister(IncomingReg, Reg))
return true;
- if (RegInfo->isSubRegister(IncomingReg, Reg))
+ if (RegInfo->getSubRegisters(IncomingReg) &&
+ RegInfo->getSuperRegisters(Reg) &&
+ RegInfo->isSubRegister(IncomingReg, Reg))
DeadOps.push_back(i);
}
}
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";
}