improved loop

This commit is contained in:
chriseth 2022-11-28 15:51:10 +01:00
parent 1013419597
commit dc584fe2f1

View File

@ -253,27 +253,29 @@ vector<UnusedStoreEliminator::Operation> UnusedStoreEliminator::operationsFromFu
void UnusedStoreEliminator::applyOperation(UnusedStoreEliminator::Operation const& _operation) void UnusedStoreEliminator::applyOperation(UnusedStoreEliminator::Operation const& _operation)
{ {
set<Statement const*> toRemove;
set<Statement const*>& active = set<Statement const*>& active =
_operation.location == Location::Storage ? _operation.location == Location::Storage ?
activeStorageStores() : activeStorageStores() :
activeMemoryStores(); activeMemoryStores();
// TODO this loop could be done more efficiently - removing while iterating. auto it = active.begin();
for (Statement const* statement: active) auto end = active.end();
for (; it != end;)
{ {
Statement const* statement = *it;
Operation const& storeOperation = m_storeOperations.at(statement); Operation const& storeOperation = m_storeOperations.at(statement);
if (_operation.effect == Effect::Read && !knownUnrelated(storeOperation, _operation)) if (_operation.effect == Effect::Read && !knownUnrelated(storeOperation, _operation))
{ {
// This store is read from, mark it as used and remove it from the active set. // This store is read from, mark it as used and remove it from the active set.
m_usedStores.insert(statement); m_usedStores.insert(statement);
toRemove.insert(statement); it = active.erase(it);
} }
else if (_operation.effect == Effect::Write && knownCovered(storeOperation, _operation)) else if (_operation.effect == Effect::Write && knownCovered(storeOperation, _operation))
// This store is overwritten before being read, remove it from the active set. // This store is overwritten before being read, remove it from the active set.
toRemove.insert(statement); it = active.erase(it);
else
++it;
} }
active -= toRemove;
} }
bool UnusedStoreEliminator::knownUnrelated( bool UnusedStoreEliminator::knownUnrelated(