aboutsummaryrefslogtreecommitdiffstats
path: root/libyul/optimiser/FullInliner.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libyul/optimiser/FullInliner.cpp')
-rw-r--r--libyul/optimiser/FullInliner.cpp31
1 files changed, 12 insertions, 19 deletions
diff --git a/libyul/optimiser/FullInliner.cpp b/libyul/optimiser/FullInliner.cpp
index aa069506..280d625a 100644
--- a/libyul/optimiser/FullInliner.cpp
+++ b/libyul/optimiser/FullInliner.cpp
@@ -40,13 +40,9 @@ using namespace dev;
using namespace dev::yul;
using namespace dev::solidity;
-FullInliner::FullInliner(Block& _ast):
- m_ast(_ast)
+FullInliner::FullInliner(Block& _ast, NameDispenser& _dispenser):
+ m_ast(_ast), m_nameDispenser(_dispenser)
{
- assertThrow(m_ast.statements.size() >= 1, OptimizerException, "");
- assertThrow(m_ast.statements.front().type() == typeid(Block), OptimizerException, "");
- m_nameDispenser.m_usedNames = NameCollector(m_ast).names();
-
// Determine constants
SSAValueTracker tracker;
tracker(m_ast);
@@ -55,10 +51,11 @@ FullInliner::FullInliner(Block& _ast):
m_constants.insert(ssaValue.first);
map<string, size_t> references = ReferencesCounter::countReferences(m_ast);
- for (size_t i = 1; i < m_ast.statements.size(); ++i)
+ for (auto& statement: m_ast.statements)
{
- assertThrow(m_ast.statements.at(i).type() == typeid(FunctionDefinition), OptimizerException, "");
- FunctionDefinition& fun = boost::get<FunctionDefinition>(m_ast.statements.at(i));
+ if (statement.type() != typeid(FunctionDefinition))
+ continue;
+ FunctionDefinition& fun = boost::get<FunctionDefinition>(statement);
m_functions[fun.name] = &fun;
// Always inline functions that are only called once.
if (references[fun.name] == 1)
@@ -69,9 +66,10 @@ FullInliner::FullInliner(Block& _ast):
void FullInliner::run()
{
- assertThrow(m_ast.statements[0].type() == typeid(Block), OptimizerException, "");
+ for (auto& statement: m_ast.statements)
+ if (statement.type() == typeid(Block))
+ handleBlock("", boost::get<Block>(statement));
- handleBlock("", boost::get<Block>(m_ast.statements[0]));
// TODO it might be good to determine a visiting order:
// first handle functions that are called from many places.
for (auto const& fun: m_functions)
@@ -157,7 +155,7 @@ vector<Statement> InlineModifier::performInline(Statement& _statement, FunctionC
// helper function to create a new variable that is supposed to model
// an existing variable.
auto newVariable = [&](TypedName const& _existingVariable, Expression* _value) {
- string newName = m_nameDispenser.newName(function.name + "_" + _existingVariable.name);
+ string newName = m_nameDispenser.newName(_existingVariable.name, function.name);
variableReplacements[_existingVariable.name] = newName;
VariableDeclaration varDecl{_funCall.location, {{_funCall.location, newName, _existingVariable.type}}, {}};
if (_value)
@@ -170,7 +168,7 @@ vector<Statement> InlineModifier::performInline(Statement& _statement, FunctionC
for (auto const& var: function.returnVariables)
newVariable(var, nullptr);
- Statement newBody = BodyCopier(m_nameDispenser, function.name + "_", variableReplacements)(function.body);
+ Statement newBody = BodyCopier(m_nameDispenser, function.name, variableReplacements)(function.body);
newStatements += std::move(boost::get<Block>(newBody).statements);
boost::apply_visitor(GenericFallbackVisitor<Assignment, VariableDeclaration>{
@@ -203,15 +201,10 @@ vector<Statement> InlineModifier::performInline(Statement& _statement, FunctionC
return newStatements;
}
-string InlineModifier::newName(string const& _prefix)
-{
- return m_nameDispenser.newName(_prefix);
-}
-
Statement BodyCopier::operator()(VariableDeclaration const& _varDecl)
{
for (auto const& var: _varDecl.variables)
- m_variableReplacements[var.name] = m_nameDispenser.newName(m_varNamePrefix + var.name);
+ m_variableReplacements[var.name] = m_nameDispenser.newName(var.name, m_varNamePrefix);
return ASTCopier::operator()(_varDecl);
}