Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion libyul/backends/evm/ssa/CodeTransform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ void CodeTransform::operator()(InstId _instId, StackData const& _operationInputL
yulAssert(m_stack.size() >= _inst.inputs.size());
for (auto const& [stackEntry, input]: ranges::views::zip(
m_stack | ranges::views::take_last(_inst.inputs.size()),
_inst.inputs
_inst.inputs | ranges::views::reverse
))
yulAssert(stackEntry.isValue() && stackEntry.value() == input);

Expand Down
9 changes: 8 additions & 1 deletion libyul/backends/evm/ssa/SSACFGBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
#include <libsolutil/StringUtils.h>
#include <libsolutil/Visitor.h>

#include <range/v3/algorithm/reverse.hpp>
#include <range/v3/range/conversion.hpp>
#include <range/v3/view/drop_last.hpp>
#include <range/v3/view/enumerate.hpp>
Expand Down Expand Up @@ -235,7 +236,7 @@ void SSACFGBuilder::operator()(Switch const& _switch)
return m_graph.makeBuiltinCallWithProjections(
m_currentBlock,
SSACFG::BuiltinCall{*equalityBuiltinHandle, {}},
{m_graph.newLiteral(debugDataOf(_case), _case.value->value.value()), expression},
{expression, m_graph.newLiteral(debugDataOf(_case), _case.value->value.value())},
static_cast<InstructionStore::NumReturnsSizeType>(equalityBuiltin.numReturns),
debugDataOf(_case)
);
Expand Down Expand Up @@ -477,10 +478,13 @@ InstId SSACFGBuilder::visitFunctionCall(FunctionCall const& _call)
yulAssert(std::holds_alternative<Literal>(arg));
literalArguments.emplace_back(std::get<Literal>(arg));
}
// Arguments must be evaluated from right to left, according to Yul specification
std::vector<InstId> inputs;
for (auto&& [idx, arg]: _call.arguments | ranges::views::enumerate | ranges::views::reverse)
if (!builtin.literalArgument(idx).has_value())
inputs.emplace_back(std::visit(*this, arg));
// But we want to store them in the original order
ranges::reverse(inputs);
canContinue = builtin.controlFlowSideEffects.canContinue;
return m_graph.makeBuiltinCallWithProjections(
m_currentBlock,
Expand All @@ -497,9 +501,12 @@ InstId SSACFGBuilder::visitFunctionCall(FunctionCall const& _call)
auto const calleeIt = m_functionRegistry.find(&function);
yulAssert(calleeIt != m_functionRegistry.end(), "Called function has no registered graph id.");
canContinue = m_sideEffects.functionSideEffects().at(calleeIt->second.definition).canContinue;
// Arguments must be evaluated from right to left, according to Yul specification
std::vector<InstId> inputs;
for (auto const& arg: _call.arguments | ranges::views::reverse)
inputs.emplace_back(std::visit(*this, arg));
// But we want to store them in the original order
ranges::reverse(inputs);
return m_graph.makeCallWithProjections(
m_currentBlock,
SSACFG::Call{calleeIt->second.id, canContinue, function.numReturns},
Expand Down
5 changes: 4 additions & 1 deletion libyul/backends/evm/ssa/StackLayoutGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,10 @@ void StackLayoutGenerator::visitBlock(SSACFG::BlockId const& _blockId)
requiredStackTop.emplace_back(Slot::makeFunctionCallReturnLabel(*callSiteID));
}
}
requiredStackTop += _inst.inputs | ranges::views::transform([this](InstId const& _id) { return StackSlot::makeValue(m_cfg, _id); });
requiredStackTop +=
_inst.inputs
| ranges::views::reverse
| ranges::views::transform([this](InstId const& _id) { return StackSlot::makeValue(m_cfg, _id); });

for (StackType::Depth depth{0}; depth < stack.size(); ++depth.value)
if (
Expand Down
9 changes: 4 additions & 5 deletions libyul/backends/evm/ssa/io/Printer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
#include <fmt/format.h>
#include <fmt/ranges.h>

#include <range/v3/view/reverse.hpp>
#include <range/v3/view/transform.hpp>
#include <range/v3/view/zip.hpp>

Expand Down Expand Up @@ -74,7 +73,7 @@ void printBuiltinOperands(
_out << ' ';

auto litIt = payload.literalArguments.begin();
auto valIt = _inst.inputs.rbegin();
auto valIt = _inst.inputs.begin();
for (std::size_t i = 0; i < builtin.numParameters; ++i)
{
if (i > 0)
Expand All @@ -86,7 +85,7 @@ void printBuiltinOperands(
}
else
{
yulAssert(valIt != _inst.inputs.rend());
yulAssert(valIt != _inst.inputs.end());
_out << formatValueRef(*valIt++);
}
}
Expand All @@ -111,12 +110,12 @@ void printCallOperands(

_out << ' ';
bool first = true;
for (auto it = _inst.inputs.rbegin(); it != _inst.inputs.rend(); ++it)
for (auto const input: _inst.inputs)
{
if (!first)
_out << ", ";
first = false;
_out << formatValueRef(*it);
_out << formatValueRef(input);
}
}

Expand Down
Loading