From 6a8b56766293398f15ab6769f0d8ad41d1448998 Mon Sep 17 00:00:00 2001 From: chriseth Date: Mon, 20 Jun 2022 17:10:43 +0200 Subject: [PATCH] lazy expansion --- libyul/optimiser/KnowledgeBase.cpp | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/libyul/optimiser/KnowledgeBase.cpp b/libyul/optimiser/KnowledgeBase.cpp index 8b169a2d4..7146a6133 100644 --- a/libyul/optimiser/KnowledgeBase.cpp +++ b/libyul/optimiser/KnowledgeBase.cpp @@ -191,9 +191,9 @@ private: return std::nullopt; }, [&](Identifier const& _identifier) -> optional { - if (m_expandedVariables.count(_identifier.name)) + /*if (m_expandedVariables.count(_identifier.name)) return m_expandedVariables.at(_identifier.name); - else + else*/ return SumExpression::variable(_identifier.name); }, [&](Literal const& _literal) -> optional { @@ -211,14 +211,22 @@ private: if (assignedValue->value) if (auto newValue = toSumExpression(*assignedValue->value)) { -// cout << " to " << newValue->toString() << endl; - // TODO this will be exponential. - // TODO Expand lazily only in the expression itself? - for (auto& [variable, value]: m_expandedVariables) - expandInExpression(value, _variable, *newValue); expandInExpression(_currentExpression, _variable, *newValue); - m_expandedVariables[_variable] = move(*newValue); - return; + + bool expanded = false; + do + { + expanded = false; + for (auto&& [var, value]: _currentExpression.coefficients) + if (m_expandedVariables.count(var)) + { + expandInExpression(_currentExpression, var, m_expandedVariables[var]); + expanded = true; + break; + } + } + while (expanded); + } m_expandedFailedVariables.insert(_variable); }