3232#include < libsolutil/StringUtils.h>
3333#include < libsolutil/Visitor.h>
3434
35+ #include < range/v3/algorithm/reverse.hpp>
3536#include < range/v3/range/conversion.hpp>
3637#include < range/v3/view/drop_last.hpp>
3738#include < range/v3/view/enumerate.hpp>
@@ -235,7 +236,7 @@ void SSACFGBuilder::operator()(Switch const& _switch)
235236 return m_graph.makeBuiltinCallWithProjections (
236237 m_currentBlock,
237238 SSACFG ::BuiltinCall{*equalityBuiltinHandle, {}},
238- {m_graph.newLiteral (debugDataOf (_case), _case.value ->value .value ()), expression },
239+ {expression, m_graph.newLiteral (debugDataOf (_case), _case.value ->value .value ())},
239240 static_cast <InstructionStore::NumReturnsSizeType>(equalityBuiltin.numReturns ),
240241 debugDataOf (_case)
241242 );
@@ -477,10 +478,13 @@ InstId SSACFGBuilder::visitFunctionCall(FunctionCall const& _call)
477478 yulAssert (std::holds_alternative<Literal>(arg));
478479 literalArguments.emplace_back (std::get<Literal>(arg));
479480 }
481+ // Arguments must be evaluated from right to left, according to Yul specification
480482 std::vector<InstId> inputs;
481483 for (auto && [idx, arg]: _call.arguments | ranges::views::enumerate | ranges::views::reverse)
482484 if (!builtin.literalArgument (idx).has_value ())
483485 inputs.emplace_back (std::visit (*this , arg));
486+ // But we want to store them in the original order
487+ ranges::reverse (inputs);
484488 canContinue = builtin.controlFlowSideEffects .canContinue ;
485489 return m_graph.makeBuiltinCallWithProjections (
486490 m_currentBlock,
@@ -497,9 +501,12 @@ InstId SSACFGBuilder::visitFunctionCall(FunctionCall const& _call)
497501 auto const calleeIt = m_functionRegistry.find (&function);
498502 yulAssert (calleeIt != m_functionRegistry.end (), " Called function has no registered graph id." );
499503 canContinue = m_sideEffects.functionSideEffects ().at (calleeIt->second .definition ).canContinue ;
504+ // Arguments must be evaluated from right to left, according to Yul specification
500505 std::vector<InstId> inputs;
501506 for (auto const & arg: _call.arguments | ranges::views::reverse)
502507 inputs.emplace_back (std::visit (*this , arg));
508+ // But we want to store them in the original order
509+ ranges::reverse (inputs);
503510 return m_graph.makeCallWithProjections (
504511 m_currentBlock,
505512 SSACFG ::Call{calleeIt->second .id , canContinue, function.numReturns },
0 commit comments