summaryrefslogtreecommitdiffstats
path: root/llvm
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
commitfa8b2ea41b293a43b362f1df60e240c9eda7b839 (patch)
treecdfc2967daad6662a937d5600fa54e8a0872c062 /llvm
parent8de6d22392196842f78cfca89ac22d5eccf3c6ab (diff)
downloadbcm5719-llvm-fa8b2ea41b293a43b362f1df60e240c9eda7b839.tar.gz
bcm5719-llvm-fa8b2ea41b293a43b362f1df60e240c9eda7b839.zip
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. llvm-svn: 54781
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/CodeGen/MachineInstr.cpp4
-rw-r--r--llvm/utils/TableGen/RegisterInfoEmitter.cpp12
2 files changed, 12 insertions, 4 deletions
diff --git a/llvm/lib/CodeGen/MachineInstr.cpp b/llvm/lib/CodeGen/MachineInstr.cpp
index c952293976e..d602e2442f7 100644
--- a/llvm/lib/CodeGen/MachineInstr.cpp
+++ b/llvm/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/llvm/utils/TableGen/RegisterInfoEmitter.cpp b/llvm/utils/TableGen/RegisterInfoEmitter.cpp
index 2870c8038bb..d514bf7deb8 100644
--- a/llvm/utils/TableGen/RegisterInfoEmitter.cpp
+++ b/llvm/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";
}
OpenPOWER on IntegriCloud