Skip to content

Commit

Permalink
Changes after review.
Browse files Browse the repository at this point in the history
  • Loading branch information
chriseth committed Nov 3, 2021
1 parent 89dbc9b commit 4be8f36
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 13 deletions.
9 changes: 4 additions & 5 deletions libyul/backends/evm/ControlFlowGraphBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -425,7 +425,7 @@ Stack const& ControlFlowGraphBuilder::visitFunctionCall(FunctionCall const& _cal
yulAssert(m_currentBlock, "");

Stack const* output = nullptr;
bool terminates = false;
bool canContinue = true;
if (BuiltinFunction const* builtin = m_dialect.builtin(_call.functionName.name))
{
Stack inputs;
Expand All @@ -444,15 +444,14 @@ Stack const& ControlFlowGraphBuilder::visitFunctionCall(FunctionCall const& _cal
// operation
move(builtinCall)
}).output;
terminates = builtin->controlFlowSideEffects.terminatesOrReverts();
canContinue = builtin->controlFlowSideEffects.canContinue;
}
else
{
Scope::Function const& function = lookupFunction(_call.functionName.name);
Stack inputs{FunctionCallReturnLabelSlot{_call}};
for (auto const& arg: _call.arguments | ranges::views::reverse)
inputs.emplace_back(std::visit(*this, arg));
// TODO incorporate side-effects (especially "does not continue")
output = &m_currentBlock->operations.emplace_back(CFG::Operation{
// input
std::move(inputs),
Expand All @@ -464,9 +463,9 @@ Stack const& ControlFlowGraphBuilder::visitFunctionCall(FunctionCall const& _cal
CFG::FunctionCall{_call.debugData, function, _call}
}).output;
// TODO what if it does not exist?
terminates = m_functionSideEffects.at(_call.functionName.name).terminatesOrReverts();
canContinue = m_functionSideEffects.at(_call.functionName.name).canContinue;
}
if (terminates)
if (!canContinue)
{
m_currentBlock->exit = CFG::BasicBlock::Terminated{};
m_currentBlock = &m_graph.makeBlock(debugDataOf(*m_currentBlock));
Expand Down
9 changes: 1 addition & 8 deletions libyul/backends/evm/OptimizedEVMCodeTransform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -478,14 +478,7 @@ void OptimizedEVMCodeTransform::operator()(CFG::BasicBlock const& _block)
createStackLayout(debugDataOf(_functionReturn), exitStack);
m_assembly.appendJump(0, AbstractAssembly::JumpType::OutOfFunction);
},
[&](CFG::BasicBlock::Terminated const&)
{
// Assert that the last builtin call was in fact terminating.
yulAssert(!_block.operations.empty(), "");
CFG::BuiltinCall const* builtinCall = get_if<CFG::BuiltinCall>(&_block.operations.back().operation);
yulAssert(builtinCall, "");
yulAssert(builtinCall->builtin.get().controlFlowSideEffects.terminatesOrReverts(), "");
}
[&](CFG::BasicBlock::Terminated const&) { }
}, _block.exit);
// TODO: We could assert that the last emitted assembly item terminated or was an (unconditional) jump.
// But currently AbstractAssembly does not allow peeking at the last emitted assembly item.
Expand Down

0 comments on commit 4be8f36

Please sign in to comment.