diff --git a/libyul/optimiser/BlockHasher.h b/libyul/optimiser/BlockHasher.h index f00f634d6..bdc27424e 100644 --- a/libyul/optimiser/BlockHasher.h +++ b/libyul/optimiser/BlockHasher.h @@ -134,4 +134,12 @@ public: void operator()(FunctionCall const& _funCall) override; }; +struct ExpressionHash +{ + uint64_t operator()(Expression const& _expression) const + { + return ExpressionHasher{}.run(_expression); + } +}; + } diff --git a/libyul/optimiser/CommonSubexpressionEliminator.cpp b/libyul/optimiser/CommonSubexpressionEliminator.cpp index 06c366cd5..be3c3c524 100644 --- a/libyul/optimiser/CommonSubexpressionEliminator.cpp +++ b/libyul/optimiser/CommonSubexpressionEliminator.cpp @@ -105,11 +105,8 @@ void CommonSubexpressionEliminator::visit(Expression& _e) _e = Identifier{debugDataOf(_e), value->name}; } } - else if ( - auto it = m_replacementCandidates.find(&_e); - it != m_replacementCandidates.end() - ) - for (auto const& variable: it->second) + else if (auto const* candidates = util::valueOrNullptr(m_replacementCandidates, _e)) + for (auto const& variable: *candidates) if (AssignedValue const* value = variableValue(variable)) { assertThrow(value->value, OptimizerException, ""); @@ -133,16 +130,16 @@ void CommonSubexpressionEliminator::visit(Expression& _e) void CommonSubexpressionEliminator::assignValue(YulString _variable, Expression const* _value) { if (_value) - m_replacementCandidates[_value].insert(_variable); + m_replacementCandidates[*_value].insert(_variable); DataFlowAnalyzer::assignValue(_variable, _value); } -uint64_t CommonSubexpressionEliminator::ExpressionHash::operator()(Expression const* _e) const +uint64_t CommonSubexpressionEliminator::ExpressionHash::operator()(Expression const& _e) const { - return ExpressionHasher::run(*_e); + return ExpressionHasher::run(_e); } -bool CommonSubexpressionEliminator::ExpressionEqual::operator()(Expression const* _a, Expression const* _b) const +bool CommonSubexpressionEliminator::ExpressionEqual::operator()(Expression const& _a, Expression const& _b) const { - return SyntacticallyEqual{}(*_a, *_b); + return SyntacticallyEqual{}(_a, _b); } diff --git a/libyul/optimiser/CommonSubexpressionEliminator.h b/libyul/optimiser/CommonSubexpressionEliminator.h index 51e3f886b..f0a42be01 100644 --- a/libyul/optimiser/CommonSubexpressionEliminator.h +++ b/libyul/optimiser/CommonSubexpressionEliminator.h @@ -61,14 +61,14 @@ protected: void assignValue(YulString _variable, Expression const* _value) override; private: struct ExpressionHash { - uint64_t operator()(Expression const*) const; + uint64_t operator()(Expression const&) const; }; struct ExpressionEqual { - bool operator()(Expression const*, Expression const*) const; + bool operator()(Expression const&, Expression const&) const; }; std::set m_returnVariables; std::unordered_map< - Expression const*, + std::reference_wrapper, std::set, ExpressionHash, ExpressionEqual