diff options
author | chriseth <chris@ethereum.org> | 2018-12-05 19:25:03 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-12-05 19:25:03 +0800 |
commit | 1e6c368bbaea34ca172478d54e7160844eba8172 (patch) | |
tree | e141f15c0bfe4de0f9ec38e23b8d534581aa8799 | |
parent | a2105b1c5cfc4fcfc713a72aba549487abb60b45 (diff) | |
parent | 538d7074399ff6e98528313b83676b117187a0ac (diff) | |
download | dexon-solidity-1e6c368bbaea34ca172478d54e7160844eba8172.tar.gz dexon-solidity-1e6c368bbaea34ca172478d54e7160844eba8172.tar.zst dexon-solidity-1e6c368bbaea34ca172478d54e7160844eba8172.zip |
Merge pull request #5594 from ethereum/fullInlinerNoHoister
[Yul] Relax dependency of FullInliner on FunctionHoister.
-rw-r--r-- | libyul/optimiser/FullInliner.cpp | 24 | ||||
-rw-r--r-- | libyul/optimiser/FullInliner.h | 12 |
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); |