mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-26 05:32:25 +00:00
Change SymbolTable::insertEntry to be more careful about how many map
lookups it does. This shaves another 5% off of bcreading 252.eon. Note that the proper solution to this problem is to fix PR411, but that will have to wait until later. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15455 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
69105f33c1
commit
1c06891186
@ -74,9 +74,9 @@ std::string SymbolTable::getUniqueName(const Type *Ty,
|
||||
// lookup a value - Returns null on failure...
|
||||
Value *SymbolTable::lookup(const Type *Ty, const std::string &Name) const {
|
||||
plane_const_iterator PI = pmap.find(Ty);
|
||||
if (PI != pmap.end()) { // We have symbols in that plane...
|
||||
if (PI != pmap.end()) { // We have symbols in that plane.
|
||||
value_const_iterator VI = PI->second.find(Name);
|
||||
if (VI != PI->second.end()) // and the name is in our hash table...
|
||||
if (VI != PI->second.end()) // and the name is in our hash table.
|
||||
return VI->second;
|
||||
}
|
||||
return 0;
|
||||
@ -181,15 +181,9 @@ Type* SymbolTable::removeEntry(type_iterator Entry) {
|
||||
// insertEntry - Insert a value into the symbol table with the specified name.
|
||||
void SymbolTable::insertEntry(const std::string &Name, const Type *VTy,
|
||||
Value *V) {
|
||||
// Check to see if there is a naming conflict. If so, rename this value!
|
||||
if (lookup(VTy, Name)) {
|
||||
std::string UniqueName = getUniqueName(VTy, Name);
|
||||
assert(InternallyInconsistent == false && "Infinite loop inserting value!");
|
||||
InternallyInconsistent = true;
|
||||
V->setName(UniqueName, this);
|
||||
InternallyInconsistent = false;
|
||||
return;
|
||||
}
|
||||
plane_iterator PI = pmap.find(VTy); // Plane iterator
|
||||
value_iterator VI; // Actual value iterator
|
||||
ValueMap *VM; // The plane we care about.
|
||||
|
||||
#if DEBUG_SYMBOL_TABLE
|
||||
dump();
|
||||
@ -197,11 +191,10 @@ void SymbolTable::insertEntry(const std::string &Name, const Type *VTy,
|
||||
<< VTy->getDescription() << "\n";
|
||||
#endif
|
||||
|
||||
plane_iterator PI = pmap.find(VTy);
|
||||
if (PI == pmap.end()) { // Not in collection yet... insert dummy entry
|
||||
// Insert a new empty element. I points to the new elements.
|
||||
PI = pmap.insert(make_pair(VTy, ValueMap())).first;
|
||||
assert(PI != pmap.end() && "How did insert fail?");
|
||||
VM = &pmap.insert(make_pair(VTy, ValueMap())).first->second;
|
||||
VI = VM->end();
|
||||
|
||||
// Check to see if the type is abstract. If so, it might be refined in the
|
||||
// future, which would cause the plane of the old type to get merged into
|
||||
@ -214,9 +207,23 @@ void SymbolTable::insertEntry(const std::string &Name, const Type *VTy,
|
||||
<< "\n";
|
||||
#endif
|
||||
}
|
||||
|
||||
} else {
|
||||
// Check to see if there is a naming conflict. If so, rename this value!
|
||||
VM = &PI->second;
|
||||
VI = VM->lower_bound(Name);
|
||||
if (VI != VM->end() && VI->first == Name) {
|
||||
std::string UniqueName = getUniqueName(VTy, Name);
|
||||
assert(InternallyInconsistent == false &&
|
||||
"Infinite loop inserting value!");
|
||||
InternallyInconsistent = true;
|
||||
V->setName(UniqueName, this);
|
||||
InternallyInconsistent = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
PI->second.insert(make_pair(Name, V));
|
||||
VM->insert(VI, make_pair(Name, V));
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user