Fix for implementation.

This commit is contained in:
chriseth 2022-04-17 18:20:35 +02:00
parent 1cc485bf72
commit 9da8d7f28c

View File

@ -21,6 +21,7 @@
#include <libyul/optimiser/Semantics.h> #include <libyul/optimiser/Semantics.h>
#include <libyul/AST.h> #include <libyul/AST.h>
#include <libyul/Dialect.h> #include <libyul/Dialect.h>
#include <libyul/optimiser/NameCollector.h>
#include <libsmtutil/SMTPortfolio.h> #include <libsmtutil/SMTPortfolio.h>
#include <libsmtutil/Helpers.h> #include <libsmtutil/Helpers.h>
@ -121,20 +122,25 @@ void ReasoningBasedSimplifier::operator()(ForLoop& _for)
m_pathCondition = branchCondition; m_pathCondition = branchCondition;
yulAssert(_for.pre.statements.empty()); yulAssert(_for.pre.statements.empty());
//TODO clear variables assigned inside body and post // clear variables assigned inside body and post
for (YulString const& varName: assignedVariableNames(_for.body) + assignedVariableNames(_for.post))
{
m_variableSequenceCounter[varName]++;
m_solver->newVariable(variableNameAtIndex(varName, m_variableSequenceCounter.at(varName)), defaultSort());
restrictToEVMWord(currentVariableExpression(varName));
}
ASTModifier::operator()(_for.body); ASTModifier::operator()(_for.body);
// TODO clear modified variables! // TODO clear modified variables!
ASTModifier::operator()(_for.post); ASTModifier::operator()(_for.post);
// join control flow // clear variables assigned inside body and post
for (auto& var: oldCounters) for (YulString const& varName: assignedVariableNames(_for.body) + assignedVariableNames(_for.post))
if (m_variableSequenceCounter.at(var.first) != var.second) {
{ m_variableSequenceCounter[varName]++;
var.second++; m_solver->newVariable(variableNameAtIndex(varName, m_variableSequenceCounter.at(varName)), defaultSort());
m_solver->newVariable(variableNameAtIndex(var.first, var.second), defaultSort()); restrictToEVMWord(currentVariableExpression(varName));
restrictToEVMWord(currentVariableExpression(var.first)); }
}
m_variableSequenceCounter = move(oldCounters); m_variableSequenceCounter = move(oldCounters);
m_pathCondition = move(oldPathCondition); m_pathCondition = move(oldPathCondition);