diff options
Diffstat (limited to 'libyul/optimiser/SSAReverser.cpp')
-rw-r--r-- | libyul/optimiser/SSAReverser.cpp | 88 |
1 files changed, 60 insertions, 28 deletions
diff --git a/libyul/optimiser/SSAReverser.cpp b/libyul/optimiser/SSAReverser.cpp index 313a677a..2cfa3d58 100644 --- a/libyul/optimiser/SSAReverser.cpp +++ b/libyul/optimiser/SSAReverser.cpp @@ -29,42 +29,74 @@ void SSAReverser::operator()(Block& _block) _block.statements, [&](Statement& _stmt1, Statement& _stmt2) -> boost::optional<vector<Statement>> { + auto* varDecl = boost::get<VariableDeclaration>(&_stmt1); + + if (!varDecl || varDecl->variables.size() != 1 || !varDecl->value) + return {}; + // Replaces // let a_1 := E // a := a_1 // with // a := E // let a_1 := a - - auto* varDecl = boost::get<VariableDeclaration>(&_stmt1); - auto* assignment = boost::get<Assignment>(&_stmt2); - - if (!varDecl || !assignment) - return {}; - - auto* identifier = boost::get<Identifier>(assignment->value.get()); - - if ( - varDecl->variables.size() == 1 && - varDecl->value && - assignment->variableNames.size() == 1 && - identifier && - identifier->name == varDecl->variables.front().name - ) + if (auto* assignment = boost::get<Assignment>(&_stmt2)) + { + auto* identifier = boost::get<Identifier>(assignment->value.get()); + if ( + assignment->variableNames.size() == 1 && + identifier && + identifier->name == varDecl->variables.front().name + ) + { + vector<Statement> result; + result.emplace_back(Assignment{ + std::move(assignment->location), + assignment->variableNames, + std::move(varDecl->value) + }); + result.emplace_back(VariableDeclaration{ + std::move(varDecl->location), + std::move(varDecl->variables), + std::make_unique<Expression>(std::move(assignment->variableNames.front())) + }); + return { std::move(result) }; + } + } + // Replaces + // let a_1 := E + // let a := a_1 + // with + // let a := E + // let a_1 := a + else if (auto* varDecl2 = boost::get<VariableDeclaration>(&_stmt2)) { - vector<Statement> result; - result.emplace_back(Assignment{ - std::move(assignment->location), - assignment->variableNames, - std::move(varDecl->value) - }); - result.emplace_back(VariableDeclaration{ - std::move(varDecl->location), - std::move(varDecl->variables), - std::make_unique<Expression>(std::move(assignment->variableNames.front())) - }); - return { std::move(result) }; + auto* identifier = boost::get<Identifier>(varDecl2->value.get()); + if ( + varDecl2->variables.size() == 1 && + identifier && + identifier->name == varDecl->variables.front().name + ) + { + vector<Statement> result; + auto varIdentifier2 = std::make_unique<Expression>(Identifier{ + varDecl2->variables.front().location, + varDecl2->variables.front().name + }); + result.emplace_back(VariableDeclaration{ + std::move(varDecl2->location), + std::move(varDecl2->variables), + std::move(varDecl->value) + }); + result.emplace_back(VariableDeclaration{ + std::move(varDecl->location), + std::move(varDecl->variables), + std::move(varIdentifier2) + }); + return { std::move(result) }; + } } + return {}; } ); |