Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions libyul/optimiser/DataFlowAnalyzer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,8 @@ void DataFlowAnalyzer::handleAssignment(set<YulString> const& _variables, Expres
for (auto const& name: _variables)
{
m_state.references[name] = referencedVariables;
for (auto&& referencedVariable: referencedVariables)
m_state.references_reverse_lookup[referencedVariable].insert(name);
if (!_isDeclaration)
{
// assignment to slot denoted by "name"
Expand Down Expand Up @@ -316,6 +318,8 @@ void DataFlowAnalyzer::popScope()
for (auto const& name: m_variableScopes.back().variables)
{
m_state.value.erase(name);
for (auto&& ref: m_state.references[name])
m_state.references_reverse_lookup.erase(ref);
m_state.references.erase(name);
}
m_variableScopes.pop_back();
Expand Down Expand Up @@ -353,14 +357,15 @@ void DataFlowAnalyzer::clearValues(set<YulString> _variables)

// Also clear variables that reference variables to be cleared.
for (auto const& variableToClear: _variables)
for (auto const& [ref, names]: m_state.references)
if (names.count(variableToClear))
_variables.emplace(ref);
if (m_state.references_reverse_lookup.count(variableToClear))
_variables += m_state.references_reverse_lookup[variableToClear];

// Clear the value and update the reference relation.
for (auto const& name: _variables)
{
m_state.value.erase(name);
for (auto&& ref: m_state.references[name])
m_state.references_reverse_lookup.erase(ref);
m_state.references.erase(name);
}
}
Expand Down
2 changes: 2 additions & 0 deletions libyul/optimiser/DataFlowAnalyzer.h
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,8 @@ class DataFlowAnalyzer: public ASTModifier
std::map<YulString, AssignedValue> value;
/// m_references[a].contains(b) <=> the current expression assigned to a references b
std::unordered_map<YulString, std::set<YulString>> references;
/// Reverse lookup for above m_references map
std::unordered_map<YulString, std::set<YulString>> references_reverse_lookup;

Environment environment;
};
Expand Down