aboutsummaryrefslogtreecommitdiffstats
path: root/libyul
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2018-12-05 19:25:03 +0800
committerGitHub <noreply@github.com>2018-12-05 19:25:03 +0800
commit1e6c368bbaea34ca172478d54e7160844eba8172 (patch)
treee141f15c0bfe4de0f9ec38e23b8d534581aa8799 /libyul
parenta2105b1c5cfc4fcfc713a72aba549487abb60b45 (diff)
parent538d7074399ff6e98528313b83676b117187a0ac (diff)
downloaddexon-solidity-1e6c368bbaea34ca172478d54e7160844eba8172.tar
dexon-solidity-1e6c368bbaea34ca172478d54e7160844eba8172.tar.gz
dexon-solidity-1e6c368bbaea34ca172478d54e7160844eba8172.tar.bz2
dexon-solidity-1e6c368bbaea34ca172478d54e7160844eba8172.tar.lz
dexon-solidity-1e6c368bbaea34ca172478d54e7160844eba8172.tar.xz
dexon-solidity-1e6c368bbaea34ca172478d54e7160844eba8172.tar.zst
dexon-solidity-1e6c368bbaea34ca172478d54e7160844eba8172.zip
Merge pull request #5594 from ethereum/fullInlinerNoHoister
[Yul] Relax dependency of FullInliner on FunctionHoister.
Diffstat (limited to 'libyul')
-rw-r--r--libyul/optimiser/FullInliner.cpp24
-rw-r--r--libyul/optimiser/FullInliner.h12
2 files changed, 23 insertions, 13 deletions
diff --git a/libyul/optimiser/FullInliner.cpp b/libyul/optimiser/FullInliner.cpp
index 8ae26fbb..f69f7cdd 100644
--- a/libyul/optimiser/FullInliner.cpp
+++ b/libyul/optimiser/FullInliner.cpp
@@ -94,8 +94,11 @@ bool FullInliner::shallInline(FunctionCall const& _funCall, YulString _callSite)
if (_funCall.functionName.name == _callSite)
return false;
- FunctionDefinition& calledFunction = function(_funCall.functionName.name);
- if (m_alwaysInline.count(calledFunction.name))
+ FunctionDefinition* calledFunction = function(_funCall.functionName.name);
+ if (!calledFunction)
+ return false;
+
+ if (m_alwaysInline.count(calledFunction->name))
return true;
// Constant arguments might provide a means for further optimization, so they cause a bonus.
@@ -110,7 +113,7 @@ bool FullInliner::shallInline(FunctionCall const& _funCall, YulString _callSite)
break;
}
- size_t size = m_functionSizes.at(calledFunction.name);
+ size_t size = m_functionSizes.at(calledFunction->name);
return (size < 10 || (constantArg && size < 50));
}
@@ -149,12 +152,13 @@ vector<Statement> InlineModifier::performInline(Statement& _statement, FunctionC
vector<Statement> newStatements;
map<YulString, YulString> variableReplacements;
- FunctionDefinition& function = m_driver.function(_funCall.functionName.name);
+ FunctionDefinition* function = m_driver.function(_funCall.functionName.name);
+ assertThrow(!!function, OptimizerException, "Attempt to inline invalid function.");
// helper function to create a new variable that is supposed to model
// an existing variable.
auto newVariable = [&](TypedName const& _existingVariable, Expression* _value) {
- YulString newName = m_nameDispenser.newName(_existingVariable.name, function.name);
+ YulString newName = m_nameDispenser.newName(_existingVariable.name, function->name);
variableReplacements[_existingVariable.name] = newName;
VariableDeclaration varDecl{_funCall.location, {{_funCall.location, newName, _existingVariable.type}}, {}};
if (_value)
@@ -163,11 +167,11 @@ vector<Statement> InlineModifier::performInline(Statement& _statement, FunctionC
};
for (size_t i = 0; i < _funCall.arguments.size(); ++i)
- newVariable(function.parameters[i], &_funCall.arguments[i]);
- for (auto const& var: function.returnVariables)
+ newVariable(function->parameters[i], &_funCall.arguments[i]);
+ 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>{
@@ -179,7 +183,7 @@ vector<Statement> InlineModifier::performInline(Statement& _statement, FunctionC
{_assignment.variableNames[i]},
make_shared<Expression>(Identifier{
_assignment.location,
- variableReplacements.at(function.returnVariables[i].name)
+ variableReplacements.at(function->returnVariables[i].name)
})
});
},
@@ -191,7 +195,7 @@ vector<Statement> InlineModifier::performInline(Statement& _statement, FunctionC
{std::move(_varDecl.variables[i])},
make_shared<Expression>(Identifier{
_varDecl.location,
- variableReplacements.at(function.returnVariables[i].name)
+ variableReplacements.at(function->returnVariables[i].name)
})
});
}
diff --git a/libyul/optimiser/FullInliner.h b/libyul/optimiser/FullInliner.h
index a8fe76c6..8f6211c8 100644
--- a/libyul/optimiser/FullInliner.h
+++ b/libyul/optimiser/FullInliner.h
@@ -63,8 +63,8 @@ class NameCollector;
* code of f, with replacements: a -> f_a, b -> f_b, c -> f_c
* let z := f_c
*
- * Prerequisites: Disambiguator, Function Hoister
- * More efficient if run after: Expression Splitter
+ * Prerequisites: Disambiguator
+ * More efficient if run after: Function Hoister, Expression Splitter
*/
class FullInliner: public ASTModifier
{
@@ -77,7 +77,13 @@ public:
/// @param _callSite the name of the function in which the function call is located.
bool shallInline(FunctionCall const& _funCall, YulString _callSite);
- FunctionDefinition& function(YulString _name) { return *m_functions.at(_name); }
+ FunctionDefinition* function(YulString _name)
+ {
+ auto it = m_functions.find(_name);
+ if (it != m_functions.end())
+ return it->second;
+ return nullptr;
+ }
private:
void updateCodeSize(FunctionDefinition& fun);