diff --git a/libyul/YulStack.cpp b/libyul/YulStack.cpp index 85709b987c59..bfd3f1f0ae52 100644 --- a/libyul/YulStack.cpp +++ b/libyul/YulStack.cpp @@ -394,15 +394,15 @@ Json YulStack::cfgJson() const yulAssert(m_parserResult->analysisInfo, ""); // FIXME: we should not regenerate the cfg, but for now this is sufficient for testing purposes auto exportCFGFromObject = [&](Object const& _object) -> Json { - // with this set to `true`, assignments of the type `let x := 42` are preserved and added as assignment - // operations to the control flow graphs - bool constexpr keepLiteralAssignments = true; + // with this set to `false`, all literals get their own variable assignments (except for immediate literal + // arguments of builtins) + bool constexpr treatLiteralsAsPushConstants = false; // NOTE: The block Ids are reset for each object std::unique_ptr controlFlow = SSAControlFlowGraphBuilder::build( *_object.analysisInfo, languageToDialect(m_language, m_evmVersion, m_eofVersion), _object.code()->root(), - keepLiteralAssignments + treatLiteralsAsPushConstants ); std::unique_ptr liveness = std::make_unique(*controlFlow); YulControlFlowGraphExporter exporter(*controlFlow, liveness.get()); diff --git a/libyul/backends/evm/SSAControlFlowGraphBuilder.cpp b/libyul/backends/evm/SSAControlFlowGraphBuilder.cpp index 101fd2eb361f..7282a707fca0 100644 --- a/libyul/backends/evm/SSAControlFlowGraphBuilder.cpp +++ b/libyul/backends/evm/SSAControlFlowGraphBuilder.cpp @@ -31,6 +31,7 @@ #include #include +#include #include #include #include @@ -52,14 +53,14 @@ SSAControlFlowGraphBuilder::SSAControlFlowGraphBuilder( AsmAnalysisInfo const& _analysisInfo, ControlFlowSideEffectsCollector const& _sideEffects, Dialect const& _dialect, - bool _keepLiteralAssignments + bool _literalsAsPushConstants ): m_controlFlow(_controlFlow), m_graph(_graph), m_info(_analysisInfo), m_sideEffects(_sideEffects), m_dialect(_dialect), - m_keepLiteralAssignments(_keepLiteralAssignments) + m_literalsAsPushConstants(_literalsAsPushConstants) { } @@ -67,13 +68,13 @@ std::unique_ptr SSAControlFlowGraphBuilder::build( AsmAnalysisInfo const& _analysisInfo, Dialect const& _dialect, Block const& _block, - bool _keepLiteralAssignments + bool _literalsAsPushConstants ) { ControlFlowSideEffectsCollector sideEffects(_dialect, _block); auto controlFlow = std::make_unique(); - SSAControlFlowGraphBuilder builder(*controlFlow, *controlFlow->mainGraph, _analysisInfo, sideEffects, _dialect, _keepLiteralAssignments); + SSAControlFlowGraphBuilder builder(*controlFlow, *controlFlow->mainGraph, _analysisInfo, sideEffects, _dialect, _literalsAsPushConstants); builder.m_currentBlock = controlFlow->mainGraph->makeBlock(debugDataOf(_block)); builder.sealBlock(builder.m_currentBlock); builder(_block); @@ -86,7 +87,6 @@ std::unique_ptr SSAControlFlowGraphBuilder::build( SSACFG::ValueId SSAControlFlowGraphBuilder::tryRemoveTrivialPhi(SSACFG::ValueId _phi) { - // TODO: double-check if this is sane auto const* phiInfo = std::get_if(&m_graph.valueInfo(_phi)); yulAssert(phiInfo); yulAssert(blockInfo(phiInfo->block).sealed); @@ -190,8 +190,8 @@ void SSAControlFlowGraphBuilder::cleanUnreachable() std::set maybeTrivialPhi; for (auto it = block.entries.begin(); it != block.entries.end();) - if (reachabilityCheck.visited.count(*it)) - it++; + if (reachabilityCheck.visited.contains(*it)) + ++it; else it = block.entries.erase(it); for (auto phi: block.phis) @@ -211,10 +211,7 @@ void SSAControlFlowGraphBuilder::cleanUnreachable() } } -void SSAControlFlowGraphBuilder::buildFunctionGraph( - Scope::Function const* _function, - FunctionDefinition const* _functionDefinition -) +void SSAControlFlowGraphBuilder::buildFunctionGraph(Scope::Function const* _function, FunctionDefinition const* _functionDefinition) { m_controlFlow.functionGraphs.emplace_back(std::make_unique()); auto& cfg = *m_controlFlow.functionGraphs.back(); @@ -240,7 +237,7 @@ void SSAControlFlowGraphBuilder::buildFunctionGraph( cfg.arguments = arguments; cfg.returns = returns; - SSAControlFlowGraphBuilder builder(m_controlFlow, cfg, m_info, m_sideEffects, m_dialect, m_keepLiteralAssignments); + SSAControlFlowGraphBuilder builder(m_controlFlow, cfg, m_info, m_sideEffects, m_dialect, m_literalsAsPushConstants); builder.m_currentBlock = cfg.entry; builder.m_functionDefinitions = m_functionDefinitions; for (auto&& [var, varId]: cfg.arguments) @@ -255,6 +252,19 @@ void SSAControlFlowGraphBuilder::buildFunctionGraph( builder.cleanUnreachable(); } +SSACFG::ValueId SSAControlFlowGraphBuilder::moveLiteralToVariable(SSACFG::ValueId const _value) +{ + yulAssert(!m_literalsAsPushConstants); + yulAssert(m_graph.isLiteralValue(_value)); + SSACFG::Operation assignment{ + .outputs = {m_graph.newVariable(m_currentBlock)}, + .kind = SSACFG::LiteralAssignment{}, + .inputs = {_value} + }; + currentBlock().operations.emplace_back(assignment); + return assignment.outputs.back(); +} + void SSAControlFlowGraphBuilder::operator()(ExpressionStatement const& _expressionStatement) { auto const* functionCall = std::get_if(&_expressionStatement.expression); @@ -541,16 +551,8 @@ void SSAControlFlowGraphBuilder::assign(std::vector SSAControlFlowGraphBuilder::visitFunctionCall(Funct SSACFG::Operation result{{}, SSACFG::BuiltinCall{_call.debugData, builtin, _call}, {}}; for (auto&& [idx, arg]: _call.arguments | ranges::views::enumerate | ranges::views::reverse) if (!builtin.literalArgument(idx).has_value()) - result.inputs.emplace_back(std::visit(*this, arg)); + { + if (!m_literalsAsPushConstants && std::holds_alternative(arg)) + { + auto const lit = m_graph.newLiteral(debugDataOf(currentBlock()), std::get(arg).value.value()); + result.inputs.emplace_back(moveLiteralToVariable(lit)); + } + else + result.inputs.emplace_back(std::visit(*this, arg)); + } for (size_t i = 0; i < builtin.numReturns; ++i) result.outputs.emplace_back(m_graph.newVariable(m_currentBlock)); canContinue = builtin.controlFlowSideEffects.canContinue; @@ -582,7 +592,15 @@ std::vector SSAControlFlowGraphBuilder::visitFunctionCall(Funct canContinue = m_sideEffects.functionSideEffects().at(definition).canContinue; SSACFG::Operation result{{}, SSACFG::Call{debugDataOf(_call), function, _call, canContinue}, {}}; for (auto const& arg: _call.arguments | ranges::views::reverse) - result.inputs.emplace_back(std::visit(*this, arg)); + { + if (!m_literalsAsPushConstants && std::holds_alternative(arg)) + { + auto const lit = m_graph.newLiteral(debugDataOf(currentBlock()), std::get(arg).value.value()); + result.inputs.emplace_back(moveLiteralToVariable(lit)); + } + else + result.inputs.emplace_back(std::visit(*this, arg)); + } for (size_t i = 0; i < function.numReturns; ++i) result.outputs.emplace_back(m_graph.newVariable(m_currentBlock)); return result; @@ -747,9 +765,8 @@ void SSAControlFlowGraphBuilder::tableJump( FunctionDefinition const* SSAControlFlowGraphBuilder::findFunctionDefinition(Scope::Function const* _function) const { - auto it = std::find_if( - m_functionDefinitions.begin(), - m_functionDefinitions.end(), + auto it = ranges::find_if( + m_functionDefinitions, [&_function](auto const& _entry) { return std::get<0>(_entry) == _function; } ); if (it != m_functionDefinitions.end()) diff --git a/libyul/backends/evm/SSAControlFlowGraphBuilder.h b/libyul/backends/evm/SSAControlFlowGraphBuilder.h index 8cd214146260..31dc571bd365 100644 --- a/libyul/backends/evm/SSAControlFlowGraphBuilder.h +++ b/libyul/backends/evm/SSAControlFlowGraphBuilder.h @@ -45,7 +45,7 @@ class SSAControlFlowGraphBuilder AsmAnalysisInfo const& _analysisInfo, ControlFlowSideEffectsCollector const& _sideEffects, Dialect const& _dialect, - bool _keepLiteralAssignments + bool _literalsAsPushConstants ); public: SSAControlFlowGraphBuilder(SSAControlFlowGraphBuilder const&) = delete; @@ -54,7 +54,7 @@ class SSAControlFlowGraphBuilder AsmAnalysisInfo const& _analysisInfo, Dialect const& _dialect, Block const& _block, - bool _keepLiteralAssignments + bool _literalsAsPushConstants ); void operator()(ExpressionStatement const& _statement); @@ -82,6 +82,7 @@ class SSAControlFlowGraphBuilder std::vector visitFunctionCall(FunctionCall const& _call); void registerFunctionDefinition(FunctionDefinition const& _functionDefinition); void buildFunctionGraph(Scope::Function const* _function, FunctionDefinition const* _functionDefinition); + SSACFG::ValueId moveLiteralToVariable(SSACFG::ValueId _value); SSACFG::ValueId zero(); SSACFG::ValueId readVariable(Scope::Variable const& _variable, SSACFG::BlockId _block); @@ -94,7 +95,7 @@ class SSAControlFlowGraphBuilder AsmAnalysisInfo const& m_info; ControlFlowSideEffectsCollector const& m_sideEffects; Dialect const& m_dialect; - bool const m_keepLiteralAssignments; + bool const m_literalsAsPushConstants; std::vector> m_functionDefinitions; SSACFG::BlockId m_currentBlock; SSACFG::BasicBlock& currentBlock() { return m_graph.block(m_currentBlock); } diff --git a/test/cmdlineTests/standard_yul_cfg_json_export/output.json b/test/cmdlineTests/standard_yul_cfg_json_export/output.json index a9c5ca7a6d4f..5eed6fc96921 100644 --- a/test/cmdlineTests/standard_yul_cfg_json_export/output.json +++ b/test/cmdlineTests/standard_yul_cfg_json_export/output.json @@ -7,7 +7,7 @@ "blocks": [ { "exit": { - "cond": "v2", + "cond": "v3", "targets": [ "Block2", "Block1" @@ -28,9 +28,17 @@ }, { "in": [ - "v0", "0x40" ], + "out": [ + "v2" + ] + }, + { + "in": [ + "v0", + "v2" + ], "op": "mstore", "out": [] }, @@ -38,7 +46,7 @@ "in": [], "op": "callvalue", "out": [ - "v2" + "v3" ] } ], @@ -63,7 +71,7 @@ "in": [], "op": "datasize", "out": [ - "v4" + "v7" ] }, { @@ -73,13 +81,13 @@ "in": [], "op": "dataoffset", "out": [ - "v5" + "v8" ] }, { "in": [ - "v4", - "v5", + "v7", + "v8", "v0" ], "op": "codecopy", @@ -87,7 +95,7 @@ }, { "in": [ - "v4", + "v7", "v0" ], "op": "return", @@ -110,9 +118,25 @@ "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v5" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v6" + ] + }, + { + "in": [ + "v5", + "v6" + ], "op": "revert", "out": [] } @@ -130,7 +154,7 @@ "blocks": [ { "exit": { - "cond": "v5", + "cond": "v7", "targets": [ "Block2", "Block1" @@ -151,36 +175,52 @@ }, { "in": [ - "v0", "0x40" ], + "out": [ + "v2" + ] + }, + { + "in": [ + "v0", + "v2" + ], "op": "mstore", "out": [] }, + { + "in": [ + "0x04" + ], + "out": [ + "v4" + ] + }, { "in": [], "op": "calldatasize", "out": [ - "v3" + "v5" ] }, { "in": [ - "0x04", - "v3" + "v4", + "v5" ], "op": "lt", "out": [ - "v4" + "v6" ] }, { "in": [ - "v4" + "v6" ], "op": "iszero", "out": [ - "v5" + "v7" ] } ], @@ -200,9 +240,25 @@ "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v38" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v39" + ] + }, + { + "in": [ + "v38", + "v39" + ], "op": "revert", "out": [] } @@ -215,7 +271,7 @@ }, { "exit": { - "cond": "v11", + "cond": "v16", "targets": [ "Block4", "Block3" @@ -228,29 +284,53 @@ "in": [ "0x00" ], + "out": [ + "v9" + ] + }, + { + "in": [ + "v9" + ], "op": "calldataload", "out": [ - "v7" + "v10" ] }, { "in": [ - "v7", "0xe0" ], + "out": [ + "v12" + ] + }, + { + "in": [ + "v10", + "v12" + ], "op": "shr", "out": [ - "v9" + "v13" ] }, { "in": [ - "v9", "0x26121ff0" ], + "out": [ + "v15" + ] + }, + { + "in": [ + "v13", + "v15" + ], "op": "eq", "out": [ - "v11" + "v16" ] } ], @@ -280,7 +360,7 @@ }, { "exit": { - "cond": "v12", + "cond": "v17", "targets": [ "Block6", "Block5" @@ -293,7 +373,7 @@ "in": [], "op": "callvalue", "out": [ - "v12" + "v17" ] } ], @@ -309,7 +389,7 @@ }, { "exit": { - "cond": "v17", + "cond": "v26", "targets": [ "Block9", "Block8" @@ -318,40 +398,56 @@ }, "id": "Block6", "instructions": [ + { + "in": [ + "0x00" + ], + "out": [ + "v20" + ] + }, { "in": [ "0x03" ], + "out": [ + "v22" + ] + }, + { + "in": [ + "v22" + ], "op": "not", "out": [ - "v14" + "v23" ] }, { "in": [], "op": "calldatasize", "out": [ - "v15" + "v24" ] }, { "in": [ - "v14", - "v15" + "v23", + "v24" ], "op": "add", "out": [ - "v16" + "v25" ] }, { "in": [ - "0x00", - "v16" + "v20", + "v25" ], "op": "slt", "out": [ - "v17" + "v26" ] } ], @@ -373,9 +469,25 @@ "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v18" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v19" + ] + }, + { + "in": [ + "v18", + "v19" + ], "op": "revert", "out": [] } @@ -394,7 +506,15 @@ "instructions": [ { "in": [ - "0x2a", + "0x2a" + ], + "out": [ + "v30" + ] + }, + { + "in": [ + "v30", "v0" ], "op": "mstore", @@ -402,7 +522,15 @@ }, { "in": [ - "0x20", + "0x20" + ], + "out": [ + "v37" + ] + }, + { + "in": [ + "v37", "v0" ], "op": "return", @@ -425,9 +553,25 @@ "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v27" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v28" + ] + }, + { + "in": [ + "v27", + "v28" + ], "op": "revert", "out": [] } @@ -454,7 +598,7 @@ "blocks": [ { "exit": { - "cond": "v2", + "cond": "v3", "targets": [ "Block2", "Block1" @@ -475,9 +619,17 @@ }, { "in": [ - "v0", "0x40" ], + "out": [ + "v2" + ] + }, + { + "in": [ + "v0", + "v2" + ], "op": "mstore", "out": [] }, @@ -485,7 +637,7 @@ "in": [], "op": "callvalue", "out": [ - "v2" + "v3" ] } ], @@ -510,7 +662,7 @@ "in": [], "op": "datasize", "out": [ - "v4" + "v7" ] }, { @@ -520,13 +672,13 @@ "in": [], "op": "dataoffset", "out": [ - "v5" + "v8" ] }, { "in": [ - "v4", - "v5", + "v7", + "v8", "v0" ], "op": "codecopy", @@ -534,7 +686,7 @@ }, { "in": [ - "v4", + "v7", "v0" ], "op": "return", @@ -557,9 +709,25 @@ "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v5" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v6" + ] + }, + { + "in": [ + "v5", + "v6" + ], "op": "revert", "out": [] } @@ -577,7 +745,7 @@ "blocks": [ { "exit": { - "cond": "v5", + "cond": "v7", "targets": [ "Block2", "Block1" @@ -598,36 +766,52 @@ }, { "in": [ - "v0", "0x40" ], + "out": [ + "v2" + ] + }, + { + "in": [ + "v0", + "v2" + ], "op": "mstore", "out": [] }, + { + "in": [ + "0x04" + ], + "out": [ + "v4" + ] + }, { "in": [], "op": "calldatasize", "out": [ - "v3" + "v5" ] }, { "in": [ - "0x04", - "v3" + "v4", + "v5" ], "op": "lt", "out": [ - "v4" + "v6" ] }, { "in": [ - "v4" + "v6" ], "op": "iszero", "out": [ - "v5" + "v7" ] } ], @@ -647,9 +831,25 @@ "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v147" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v148" + ] + }, + { + "in": [ + "v147", + "v148" + ], "op": "revert", "out": [] } @@ -662,7 +862,7 @@ }, { "exit": { - "cond": "v11", + "cond": "v16", "targets": [ "Block4", "Block3" @@ -675,29 +875,53 @@ "in": [ "0x00" ], + "out": [ + "v9" + ] + }, + { + "in": [ + "v9" + ], "op": "calldataload", "out": [ - "v7" + "v10" ] }, { "in": [ - "v7", "0xe0" ], + "out": [ + "v12" + ] + }, + { + "in": [ + "v10", + "v12" + ], "op": "shr", "out": [ - "v9" + "v13" ] }, { "in": [ - "v9", "0x26121ff0" ], + "out": [ + "v15" + ] + }, + { + "in": [ + "v13", + "v15" + ], "op": "eq", "out": [ - "v11" + "v16" ] } ], @@ -727,7 +951,7 @@ }, { "exit": { - "cond": "v12", + "cond": "v17", "targets": [ "Block6", "Block5" @@ -740,7 +964,7 @@ "in": [], "op": "callvalue", "out": [ - "v12" + "v17" ] } ], @@ -756,7 +980,7 @@ }, { "exit": { - "cond": "v17", + "cond": "v26", "targets": [ "Block9", "Block8" @@ -765,40 +989,56 @@ }, "id": "Block6", "instructions": [ + { + "in": [ + "0x00" + ], + "out": [ + "v20" + ] + }, { "in": [ "0x03" ], + "out": [ + "v22" + ] + }, + { + "in": [ + "v22" + ], "op": "not", "out": [ - "v14" + "v23" ] }, { "in": [], "op": "calldatasize", "out": [ - "v15" + "v24" ] }, { "in": [ - "v14", - "v15" + "v23", + "v24" ], "op": "add", "out": [ - "v16" + "v25" ] }, { "in": [ - "0x00", - "v16" + "v20", + "v25" ], "op": "slt", "out": [ - "v17" + "v26" ] } ], @@ -820,9 +1060,25 @@ "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v18" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v19" + ] + }, + { + "in": [ + "v18", + "v19" + ], "op": "revert", "out": [] } @@ -835,7 +1091,7 @@ }, { "exit": { - "cond": "v28", + "cond": "v40", "targets": [ "Block12", "Block11" @@ -851,47 +1107,55 @@ "in": [], "op": "datasize", "out": [ - "v18" + "v29" ] }, { "in": [ - "v18", + "v29", "v0" ], "op": "add", "out": [ - "v24" + "v35" ] }, { "in": [ "v0", - "v24" + "v35" ], "op": "lt", "out": [ - "v25" + "v36" ] }, { "in": [ - "0xffffffffffffffff", - "v24" + "0xffffffffffffffff" + ], + "out": [ + "v38" + ] + }, + { + "in": [ + "v38", + "v35" ], "op": "gt", "out": [ - "v27" + "v39" ] }, { "in": [ - "v25", - "v27" + "v36", + "v39" ], "op": "or", "out": [ - "v28" + "v40" ] } ], @@ -901,8 +1165,8 @@ ], "out": [ "v0", - "v18", - "v24" + "v29", + "v35" ] }, "type": "BuiltinCall" @@ -915,9 +1179,25 @@ "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v27" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v28" + ] + }, + { + "in": [ + "v27", + "v28" + ], "op": "revert", "out": [] } @@ -930,7 +1210,7 @@ }, { "exit": { - "cond": "v42", + "cond": "v62", "targets": [ "Block15", "Block14" @@ -946,13 +1226,13 @@ "in": [], "op": "dataoffset", "out": [ - "v35" + "v54" ] }, { "in": [ - "v18", - "v35", + "v29", + "v54", "v0" ], "op": "datacopy", @@ -961,42 +1241,50 @@ { "in": [ "v0", - "v24" + "v35" ], "op": "sub", "out": [ - "v40" + "v59" ] }, { "in": [ - "v40", - "v0", "0x00" ], + "out": [ + "v60" + ] + }, + { + "in": [ + "v59", + "v0", + "v60" + ], "op": "create", "out": [ - "v41" + "v61" ] }, { "in": [ - "v41" + "v61" ], "op": "iszero", "out": [ - "v42" + "v62" ] } ], "liveness": { "in": [ "v0", - "v18", - "v24" + "v29", + "v35" ], "out": [ - "v41" + "v61" ] }, "type": "BuiltinCall" @@ -1009,35 +1297,91 @@ "instructions": [ { "in": [ - "0x4e487b71", + "0x4e487b71" + ], + "out": [ + "v42" + ] + }, + { + "in": [ "0xe0" ], + "out": [ + "v43" + ] + }, + { + "in": [ + "v42", + "v43" + ], "op": "shl", "out": [ - "v30" + "v44" ] }, { "in": [ - "v30", "0x00" ], + "out": [ + "v45" + ] + }, + { + "in": [ + "v44", + "v45" + ], "op": "mstore", "out": [] }, { "in": [ - "0x41", + "0x41" + ], + "out": [ + "v47" + ] + }, + { + "in": [ "0x04" ], + "out": [ + "v48" + ] + }, + { + "in": [ + "v47", + "v48" + ], "op": "mstore", "out": [] }, { "in": [ - "0x24", + "0x24" + ], + "out": [ + "v50" + ] + }, + { + "in": [ "0x00" ], + "out": [ + "v51" + ] + }, + { + "in": [ + "v50", + "v51" + ], "op": "revert", "out": [] } @@ -1050,7 +1394,7 @@ }, { "exit": { - "cond": "v60", + "cond": "v90", "targets": [ "Block18", "Block17" @@ -1063,97 +1407,161 @@ "in": [ "0x40" ], + "out": [ + "v68" + ] + }, + { + "in": [ + "v68" + ], "op": "mload", "out": [ - "v46" + "v69" + ] + }, + { + "in": [ + "0x026121ff" + ], + "out": [ + "v71" ] }, { "in": [ - "0x026121ff", "0xe4" ], + "out": [ + "v73" + ] + }, + { + "in": [ + "v71", + "v73" + ], "op": "shl", "out": [ - "v49" + "v74" ] }, { "in": [ - "v49", - "v46" + "v74", + "v69" ], "op": "mstore", "out": [] }, { "in": [ - "0x01", + "0x20" + ], + "out": [ + "v76" + ] + }, + { + "in": [ + "0x04" + ], + "out": [ + "v77" + ] + }, + { + "in": [ + "0x01" + ], + "out": [ + "v79" + ] + }, + { + "in": [ + "0x01" + ], + "out": [ + "v80" + ] + }, + { + "in": [ "0xa0" ], + "out": [ + "v82" + ] + }, + { + "in": [ + "v80", + "v82" + ], "op": "shl", "out": [ - "v53" + "v83" ] }, { "in": [ - "0x01", - "v53" + "v79", + "v83" ], "op": "sub", "out": [ - "v54" + "v84" ] }, { "in": [ - "v54", - "v41" + "v84", + "v61" ], "op": "and", "out": [ - "v57" + "v87" ] }, { "in": [], "op": "gas", "out": [ - "v58" + "v88" ] }, { "in": [ - "0x20", - "v46", - "0x04", - "v46", - "v57", - "v58" + "v76", + "v69", + "v77", + "v69", + "v87", + "v88" ], "op": "staticcall", "out": [ - "v59" + "v89" ] }, { "in": [ - "v59" + "v89" ], "op": "iszero", "out": [ - "v60" + "v90" ] } ], "liveness": { "in": [ - "v41" + "v61" ], "out": [ - "v46", - "v59" + "v69", + "v89" ] }, "type": "BuiltinCall" @@ -1168,23 +1576,39 @@ "in": [ "0x40" ], + "out": [ + "v63" + ] + }, + { + "in": [ + "v63" + ], "op": "mload", "out": [ - "v43" + "v64" ] }, { "in": [], "op": "returndatasize", "out": [ - "v44" + "v65" ] }, { "in": [ - "v44", - "0x00", - "v43" + "0x00" + ], + "out": [ + "v66" + ] + }, + { + "in": [ + "v65", + "v66", + "v64" ], "op": "returndatacopy", "out": [] @@ -1193,13 +1617,13 @@ "in": [], "op": "returndatasize", "out": [ - "v45" + "v67" ] }, { "in": [ - "v45", - "v43" + "v67", + "v64" ], "op": "revert", "out": [] @@ -1213,7 +1637,7 @@ }, { "exit": { - "cond": "v59", + "cond": "v89", "targets": [ "Block21", "Block20" @@ -1227,18 +1651,18 @@ "0x00" ], "out": [ - "v64" + "v96" ] } ], "liveness": { "in": [ - "v46", - "v59" + "v69", + "v89" ], "out": [ - "v46", - "v64" + "v69", + "v96" ] }, "type": "LiteralAssignment" @@ -1253,23 +1677,39 @@ "in": [ "0x40" ], + "out": [ + "v91" + ] + }, + { + "in": [ + "v91" + ], "op": "mload", "out": [ - "v61" + "v92" ] }, { "in": [], "op": "returndatasize", "out": [ - "v62" + "v93" ] }, { "in": [ - "v62", - "0x00", - "v61" + "0x00" + ], + "out": [ + "v94" + ] + }, + { + "in": [ + "v93", + "v94", + "v92" ], "op": "returndatacopy", "out": [] @@ -1278,13 +1718,13 @@ "in": [], "op": "returndatasize", "out": [ - "v63" + "v95" ] }, { "in": [ - "v63", - "v61" + "v95", + "v92" ], "op": "revert", "out": [] @@ -1308,35 +1748,51 @@ "instructions": [ { "in": [ - "v64", - "v95" + "v96", + "v142" ], "op": "PhiFunction", "out": [ - "v97" + "v145" ] }, { "in": [ "0x40" ], + "out": [ + "v143" + ] + }, + { + "in": [ + "v143" + ], "op": "mload", "out": [ - "v96" + "v144" ] }, { "in": [ - "v97", - "v96" + "v145", + "v144" ], "op": "mstore", "out": [] }, { "in": [ - "0x20", - "v96" + "0x20" + ], + "out": [ + "v146" + ] + }, + { + "in": [ + "v146", + "v144" ], "op": "return", "out": [] @@ -1344,7 +1800,7 @@ ], "liveness": { "in": [ - "v97" + "v145" ], "out": [] }, @@ -1352,7 +1808,7 @@ }, { "exit": { - "cond": "v69", + "cond": "v102", "targets": [ "Block23", "Block22" @@ -1366,34 +1822,42 @@ "0x20" ], "out": [ - "v67" + "v99" ] }, { "in": [], "op": "returndatasize", "out": [ - "v68" + "v100" ] }, { "in": [ - "v68", "0x20" ], + "out": [ + "v101" + ] + }, + { + "in": [ + "v100", + "v101" + ], "op": "gt", "out": [ - "v69" + "v102" ] } ], "liveness": { "in": [ - "v46" + "v69" ], "out": [ - "v46", - "v67" + "v69", + "v99" ] }, "type": "BuiltinCall" @@ -1404,7 +1868,7 @@ "Block22" ], "exit": { - "cond": "v82", + "cond": "v118", "targets": [ "Block25", "Block24" @@ -1415,93 +1879,117 @@ "instructions": [ { "in": [ - "v67", - "v70" + "v99", + "v103" + ], + "op": "PhiFunction", + "out": [ + "v108" + ] + }, + { + "in": [ + "0x1f" ], - "op": "PhiFunction", "out": [ - "v73" + "v105" ] }, { "in": [ - "0x1f" + "v105" ], "op": "not", "out": [ - "v72" + "v106" ] }, { "in": [ - "0x1f", - "v73" + "0x1f" + ], + "out": [ + "v107" + ] + }, + { + "in": [ + "v107", + "v108" ], "op": "add", "out": [ - "v74" + "v109" ] }, { "in": [ - "v72", - "v74" + "v106", + "v109" ], "op": "and", "out": [ - "v75" + "v110" ] }, { "in": [ - "v75", - "v46" + "v110", + "v69" ], "op": "add", "out": [ - "v79" + "v114" ] }, { "in": [ - "v46", - "v79" + "v69", + "v114" ], "op": "lt", "out": [ - "v80" + "v115" ] }, { "in": [ - "0xffffffffffffffff", - "v79" + "0xffffffffffffffff" + ], + "out": [ + "v116" + ] + }, + { + "in": [ + "v116", + "v114" ], "op": "gt", "out": [ - "v81" + "v117" ] }, { "in": [ - "v80", - "v81" + "v115", + "v117" ], "op": "or", "out": [ - "v82" + "v118" ] } ], "liveness": { "in": [ - "v46", - "v73" + "v69", + "v108" ], "out": [ - "v46", - "v73", - "v79" + "v69", + "v108", + "v114" ] }, "type": "BuiltinCall" @@ -1519,24 +2007,24 @@ "in": [], "op": "returndatasize", "out": [ - "v70" + "v103" ] } ], "liveness": { "in": [ - "v46" + "v69" ], "out": [ - "v46", - "v70" + "v69", + "v103" ] }, "type": "BuiltinCall" }, { "exit": { - "cond": "v92", + "cond": "v137", "targets": [ "Block28", "Block27" @@ -1547,51 +2035,67 @@ "instructions": [ { "in": [ - "v79", "0x40" ], + "out": [ + "v129" + ] + }, + { + "in": [ + "v114", + "v129" + ], "op": "mstore", "out": [] }, { "in": [ - "v73", - "v46" + "0x20" + ], + "out": [ + "v130" + ] + }, + { + "in": [ + "v108", + "v69" ], "op": "add", "out": [ - "v90" + "v135" ] }, { "in": [ - "v46", - "v90" + "v69", + "v135" ], "op": "sub", "out": [ - "v91" + "v136" ] }, { "in": [ - "0x20", - "v91" + "v130", + "v136" ], "op": "slt", "out": [ - "v92" + "v137" ] } ], "liveness": { "in": [ - "v46", - "v73", - "v79" + "v69", + "v108", + "v114" ], "out": [ - "v46" + "v69" ] }, "type": "BuiltinCall" @@ -1604,35 +2108,91 @@ "instructions": [ { "in": [ - "0x4e487b71", + "0x4e487b71" + ], + "out": [ + "v119" + ] + }, + { + "in": [ "0xe0" ], + "out": [ + "v120" + ] + }, + { + "in": [ + "v119", + "v120" + ], "op": "shl", "out": [ - "v83" + "v121" ] }, { "in": [ - "v83", "0x00" ], + "out": [ + "v122" + ] + }, + { + "in": [ + "v121", + "v122" + ], "op": "mstore", "out": [] }, { "in": [ - "0x41", + "0x41" + ], + "out": [ + "v123" + ] + }, + { + "in": [ "0x04" ], + "out": [ + "v124" + ] + }, + { + "in": [ + "v123", + "v124" + ], "op": "mstore", "out": [] }, { "in": [ - "0x24", + "0x24" + ], + "out": [ + "v125" + ] + }, + { + "in": [ "0x00" ], + "out": [ + "v126" + ] + }, + { + "in": [ + "v125", + "v126" + ], "op": "revert", "out": [] } @@ -1654,20 +2214,20 @@ "instructions": [ { "in": [ - "v46" + "v69" ], "op": "mload", "out": [ - "v95" + "v142" ] } ], "liveness": { "in": [ - "v46" + "v69" ], "out": [ - "v95" + "v142" ] }, "type": "BuiltinCall" @@ -1680,9 +2240,25 @@ "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v138" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v139" + ] + }, + { + "in": [ + "v138", + "v139" + ], "op": "revert", "out": [] } @@ -1700,7 +2276,7 @@ "blocks": [ { "exit": { - "cond": "v2", + "cond": "v3", "targets": [ "Block2", "Block1" @@ -1721,9 +2297,17 @@ }, { "in": [ - "v0", "0x40" ], + "out": [ + "v2" + ] + }, + { + "in": [ + "v0", + "v2" + ], "op": "mstore", "out": [] }, @@ -1731,7 +2315,7 @@ "in": [], "op": "callvalue", "out": [ - "v2" + "v3" ] } ], @@ -1756,7 +2340,7 @@ "in": [], "op": "datasize", "out": [ - "v4" + "v7" ] }, { @@ -1766,13 +2350,13 @@ "in": [], "op": "dataoffset", "out": [ - "v5" + "v8" ] }, { "in": [ - "v4", - "v5", + "v7", + "v8", "v0" ], "op": "codecopy", @@ -1780,7 +2364,7 @@ }, { "in": [ - "v4", + "v7", "v0" ], "op": "return", @@ -1803,9 +2387,25 @@ "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v5" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v6" + ] + }, + { + "in": [ + "v5", + "v6" + ], "op": "revert", "out": [] } @@ -1823,7 +2423,7 @@ "blocks": [ { "exit": { - "cond": "v5", + "cond": "v7", "targets": [ "Block2", "Block1" @@ -1844,36 +2444,52 @@ }, { "in": [ - "v0", "0x40" ], + "out": [ + "v2" + ] + }, + { + "in": [ + "v0", + "v2" + ], "op": "mstore", "out": [] }, + { + "in": [ + "0x04" + ], + "out": [ + "v4" + ] + }, { "in": [], "op": "calldatasize", "out": [ - "v3" + "v5" ] }, { "in": [ - "0x04", - "v3" + "v4", + "v5" ], "op": "lt", "out": [ - "v4" + "v6" ] }, { "in": [ - "v4" + "v6" ], "op": "iszero", "out": [ - "v5" + "v7" ] } ], @@ -1893,9 +2509,25 @@ "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v38" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v39" + ] + }, + { + "in": [ + "v38", + "v39" + ], "op": "revert", "out": [] } @@ -1908,7 +2540,7 @@ }, { "exit": { - "cond": "v11", + "cond": "v16", "targets": [ "Block4", "Block3" @@ -1921,29 +2553,53 @@ "in": [ "0x00" ], + "out": [ + "v9" + ] + }, + { + "in": [ + "v9" + ], "op": "calldataload", "out": [ - "v7" + "v10" ] }, { "in": [ - "v7", "0xe0" ], + "out": [ + "v12" + ] + }, + { + "in": [ + "v10", + "v12" + ], "op": "shr", "out": [ - "v9" + "v13" ] }, { "in": [ - "v9", "0x26121ff0" ], + "out": [ + "v15" + ] + }, + { + "in": [ + "v13", + "v15" + ], "op": "eq", "out": [ - "v11" + "v16" ] } ], @@ -1973,7 +2629,7 @@ }, { "exit": { - "cond": "v12", + "cond": "v17", "targets": [ "Block6", "Block5" @@ -1986,7 +2642,7 @@ "in": [], "op": "callvalue", "out": [ - "v12" + "v17" ] } ], @@ -2002,7 +2658,7 @@ }, { "exit": { - "cond": "v17", + "cond": "v26", "targets": [ "Block9", "Block8" @@ -2011,40 +2667,56 @@ }, "id": "Block6", "instructions": [ + { + "in": [ + "0x00" + ], + "out": [ + "v20" + ] + }, { "in": [ "0x03" ], + "out": [ + "v22" + ] + }, + { + "in": [ + "v22" + ], "op": "not", "out": [ - "v14" + "v23" ] }, { "in": [], "op": "calldatasize", "out": [ - "v15" + "v24" ] }, { "in": [ - "v14", - "v15" + "v23", + "v24" ], "op": "add", "out": [ - "v16" + "v25" ] }, { "in": [ - "0x00", - "v16" + "v20", + "v25" ], "op": "slt", "out": [ - "v17" + "v26" ] } ], @@ -2066,9 +2738,25 @@ "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v18" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v19" + ] + }, + { + "in": [ + "v18", + "v19" + ], "op": "revert", "out": [] } @@ -2087,7 +2775,15 @@ "instructions": [ { "in": [ - "0x2a", + "0x2a" + ], + "out": [ + "v30" + ] + }, + { + "in": [ + "v30", "v0" ], "op": "mstore", @@ -2095,7 +2791,15 @@ }, { "in": [ - "0x20", + "0x20" + ], + "out": [ + "v37" + ] + }, + { + "in": [ + "v37", "v0" ], "op": "return", @@ -2118,9 +2822,25 @@ "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v27" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v28" + ] + }, + { + "in": [ + "v27", + "v28" + ], "op": "revert", "out": [] } diff --git a/test/cmdlineTests/strict_asm_yul_cfg_json_export/output b/test/cmdlineTests/strict_asm_yul_cfg_json_export/output index e0bb1af40952..7ad6de7cba0f 100644 --- a/test/cmdlineTests/strict_asm_yul_cfg_json_export/output +++ b/test/cmdlineTests/strict_asm_yul_cfg_json_export/output @@ -7,7 +7,7 @@ Yul Control Flow Graph: "blocks": [ { "exit": { - "cond": "v2", + "cond": "v3", "targets": [ "Block2", "Block1" @@ -28,9 +28,17 @@ Yul Control Flow Graph: }, { "in": [ - "v0", "0x40" ], + "out": [ + "v2" + ] + }, + { + "in": [ + "v0", + "v2" + ], "op": "mstore", "out": [] }, @@ -38,7 +46,7 @@ Yul Control Flow Graph: "in": [], "op": "callvalue", "out": [ - "v2" + "v3" ] } ], @@ -63,7 +71,7 @@ Yul Control Flow Graph: "in": [], "op": "datasize", "out": [ - "v4" + "v7" ] }, { @@ -73,13 +81,13 @@ Yul Control Flow Graph: "in": [], "op": "dataoffset", "out": [ - "v5" + "v8" ] }, { "in": [ - "v4", - "v5", + "v7", + "v8", "v0" ], "op": "codecopy", @@ -87,7 +95,7 @@ Yul Control Flow Graph: }, { "in": [ - "v4", + "v7", "v0" ], "op": "return", @@ -110,9 +118,25 @@ Yul Control Flow Graph: "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v5" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v6" + ] + }, + { + "in": [ + "v5", + "v6" + ], "op": "revert", "out": [] } @@ -130,7 +154,7 @@ Yul Control Flow Graph: "blocks": [ { "exit": { - "cond": "v5", + "cond": "v7", "targets": [ "Block2", "Block1" @@ -151,36 +175,52 @@ Yul Control Flow Graph: }, { "in": [ - "v0", "0x40" ], + "out": [ + "v2" + ] + }, + { + "in": [ + "v0", + "v2" + ], "op": "mstore", "out": [] }, + { + "in": [ + "0x04" + ], + "out": [ + "v4" + ] + }, { "in": [], "op": "calldatasize", "out": [ - "v3" + "v5" ] }, { "in": [ - "0x04", - "v3" + "v4", + "v5" ], "op": "lt", "out": [ - "v4" + "v6" ] }, { "in": [ - "v4" + "v6" ], "op": "iszero", "out": [ - "v5" + "v7" ] } ], @@ -200,9 +240,25 @@ Yul Control Flow Graph: "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v38" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v39" + ] + }, + { + "in": [ + "v38", + "v39" + ], "op": "revert", "out": [] } @@ -215,7 +271,7 @@ Yul Control Flow Graph: }, { "exit": { - "cond": "v11", + "cond": "v16", "targets": [ "Block4", "Block3" @@ -228,29 +284,53 @@ Yul Control Flow Graph: "in": [ "0x00" ], + "out": [ + "v9" + ] + }, + { + "in": [ + "v9" + ], "op": "calldataload", "out": [ - "v7" + "v10" ] }, { "in": [ - "v7", "0xe0" ], + "out": [ + "v12" + ] + }, + { + "in": [ + "v10", + "v12" + ], "op": "shr", "out": [ - "v9" + "v13" ] }, { "in": [ - "v9", "0x26121ff0" ], + "out": [ + "v15" + ] + }, + { + "in": [ + "v13", + "v15" + ], "op": "eq", "out": [ - "v11" + "v16" ] } ], @@ -280,7 +360,7 @@ Yul Control Flow Graph: }, { "exit": { - "cond": "v12", + "cond": "v17", "targets": [ "Block6", "Block5" @@ -293,7 +373,7 @@ Yul Control Flow Graph: "in": [], "op": "callvalue", "out": [ - "v12" + "v17" ] } ], @@ -309,7 +389,7 @@ Yul Control Flow Graph: }, { "exit": { - "cond": "v17", + "cond": "v26", "targets": [ "Block9", "Block8" @@ -318,40 +398,56 @@ Yul Control Flow Graph: }, "id": "Block6", "instructions": [ + { + "in": [ + "0x00" + ], + "out": [ + "v20" + ] + }, { "in": [ "0x03" ], + "out": [ + "v22" + ] + }, + { + "in": [ + "v22" + ], "op": "not", "out": [ - "v14" + "v23" ] }, { "in": [], "op": "calldatasize", "out": [ - "v15" + "v24" ] }, { "in": [ - "v14", - "v15" + "v23", + "v24" ], "op": "add", "out": [ - "v16" + "v25" ] }, { "in": [ - "0x00", - "v16" + "v20", + "v25" ], "op": "slt", "out": [ - "v17" + "v26" ] } ], @@ -373,9 +469,25 @@ Yul Control Flow Graph: "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v18" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v19" + ] + }, + { + "in": [ + "v18", + "v19" + ], "op": "revert", "out": [] } @@ -394,7 +506,15 @@ Yul Control Flow Graph: "instructions": [ { "in": [ - "0x2a", + "0x2a" + ], + "out": [ + "v30" + ] + }, + { + "in": [ + "v30", "v0" ], "op": "mstore", @@ -402,7 +522,15 @@ Yul Control Flow Graph: }, { "in": [ - "0x20", + "0x20" + ], + "out": [ + "v37" + ] + }, + { + "in": [ + "v37", "v0" ], "op": "return", @@ -425,9 +553,25 @@ Yul Control Flow Graph: "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v27" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v28" + ] + }, + { + "in": [ + "v27", + "v28" + ], "op": "revert", "out": [] } diff --git a/test/cmdlineTests/yul_cfg_json_export/output b/test/cmdlineTests/yul_cfg_json_export/output index 2620d53a96ab..cdb0e2d7ee69 100644 --- a/test/cmdlineTests/yul_cfg_json_export/output +++ b/test/cmdlineTests/yul_cfg_json_export/output @@ -6,7 +6,7 @@ Yul Control Flow Graph: "blocks": [ { "exit": { - "cond": "v2", + "cond": "v3", "targets": [ "Block2", "Block1" @@ -27,9 +27,17 @@ Yul Control Flow Graph: }, { "in": [ - "v0", "0x40" ], + "out": [ + "v2" + ] + }, + { + "in": [ + "v0", + "v2" + ], "op": "mstore", "out": [] }, @@ -37,7 +45,7 @@ Yul Control Flow Graph: "in": [], "op": "callvalue", "out": [ - "v2" + "v3" ] } ], @@ -62,7 +70,7 @@ Yul Control Flow Graph: "in": [], "op": "datasize", "out": [ - "v4" + "v7" ] }, { @@ -72,13 +80,13 @@ Yul Control Flow Graph: "in": [], "op": "dataoffset", "out": [ - "v5" + "v8" ] }, { "in": [ - "v4", - "v5", + "v7", + "v8", "v0" ], "op": "codecopy", @@ -86,7 +94,7 @@ Yul Control Flow Graph: }, { "in": [ - "v4", + "v7", "v0" ], "op": "return", @@ -109,9 +117,25 @@ Yul Control Flow Graph: "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v5" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v6" + ] + }, + { + "in": [ + "v5", + "v6" + ], "op": "revert", "out": [] } @@ -129,7 +153,7 @@ Yul Control Flow Graph: "blocks": [ { "exit": { - "cond": "v5", + "cond": "v7", "targets": [ "Block2", "Block1" @@ -150,36 +174,52 @@ Yul Control Flow Graph: }, { "in": [ - "v0", "0x40" ], + "out": [ + "v2" + ] + }, + { + "in": [ + "v0", + "v2" + ], "op": "mstore", "out": [] }, + { + "in": [ + "0x04" + ], + "out": [ + "v4" + ] + }, { "in": [], "op": "calldatasize", "out": [ - "v3" + "v5" ] }, { "in": [ - "0x04", - "v3" + "v4", + "v5" ], "op": "lt", "out": [ - "v4" + "v6" ] }, { "in": [ - "v4" + "v6" ], "op": "iszero", "out": [ - "v5" + "v7" ] } ], @@ -199,9 +239,25 @@ Yul Control Flow Graph: "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v38" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v39" + ] + }, + { + "in": [ + "v38", + "v39" + ], "op": "revert", "out": [] } @@ -214,7 +270,7 @@ Yul Control Flow Graph: }, { "exit": { - "cond": "v11", + "cond": "v16", "targets": [ "Block4", "Block3" @@ -227,29 +283,53 @@ Yul Control Flow Graph: "in": [ "0x00" ], + "out": [ + "v9" + ] + }, + { + "in": [ + "v9" + ], "op": "calldataload", "out": [ - "v7" + "v10" ] }, { "in": [ - "v7", "0xe0" ], + "out": [ + "v12" + ] + }, + { + "in": [ + "v10", + "v12" + ], "op": "shr", "out": [ - "v9" + "v13" ] }, { "in": [ - "v9", "0x26121ff0" ], + "out": [ + "v15" + ] + }, + { + "in": [ + "v13", + "v15" + ], "op": "eq", "out": [ - "v11" + "v16" ] } ], @@ -279,7 +359,7 @@ Yul Control Flow Graph: }, { "exit": { - "cond": "v12", + "cond": "v17", "targets": [ "Block6", "Block5" @@ -292,7 +372,7 @@ Yul Control Flow Graph: "in": [], "op": "callvalue", "out": [ - "v12" + "v17" ] } ], @@ -308,7 +388,7 @@ Yul Control Flow Graph: }, { "exit": { - "cond": "v17", + "cond": "v26", "targets": [ "Block9", "Block8" @@ -317,40 +397,56 @@ Yul Control Flow Graph: }, "id": "Block6", "instructions": [ + { + "in": [ + "0x00" + ], + "out": [ + "v20" + ] + }, { "in": [ "0x03" ], + "out": [ + "v22" + ] + }, + { + "in": [ + "v22" + ], "op": "not", "out": [ - "v14" + "v23" ] }, { "in": [], "op": "calldatasize", "out": [ - "v15" + "v24" ] }, { "in": [ - "v14", - "v15" + "v23", + "v24" ], "op": "add", "out": [ - "v16" + "v25" ] }, { "in": [ - "0x00", - "v16" + "v20", + "v25" ], "op": "slt", "out": [ - "v17" + "v26" ] } ], @@ -372,9 +468,25 @@ Yul Control Flow Graph: "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v18" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v19" + ] + }, + { + "in": [ + "v18", + "v19" + ], "op": "revert", "out": [] } @@ -393,7 +505,15 @@ Yul Control Flow Graph: "instructions": [ { "in": [ - "0x2a", + "0x2a" + ], + "out": [ + "v30" + ] + }, + { + "in": [ + "v30", "v0" ], "op": "mstore", @@ -401,7 +521,15 @@ Yul Control Flow Graph: }, { "in": [ - "0x20", + "0x20" + ], + "out": [ + "v37" + ] + }, + { + "in": [ + "v37", "v0" ], "op": "return", @@ -424,9 +552,25 @@ Yul Control Flow Graph: "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v27" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v28" + ] + }, + { + "in": [ + "v27", + "v28" + ], "op": "revert", "out": [] } @@ -454,7 +598,7 @@ Yul Control Flow Graph: "blocks": [ { "exit": { - "cond": "v2", + "cond": "v3", "targets": [ "Block2", "Block1" @@ -475,9 +619,17 @@ Yul Control Flow Graph: }, { "in": [ - "v0", "0x40" ], + "out": [ + "v2" + ] + }, + { + "in": [ + "v0", + "v2" + ], "op": "mstore", "out": [] }, @@ -485,7 +637,7 @@ Yul Control Flow Graph: "in": [], "op": "callvalue", "out": [ - "v2" + "v3" ] } ], @@ -510,7 +662,7 @@ Yul Control Flow Graph: "in": [], "op": "datasize", "out": [ - "v4" + "v7" ] }, { @@ -520,13 +672,13 @@ Yul Control Flow Graph: "in": [], "op": "dataoffset", "out": [ - "v5" + "v8" ] }, { "in": [ - "v4", - "v5", + "v7", + "v8", "v0" ], "op": "codecopy", @@ -534,7 +686,7 @@ Yul Control Flow Graph: }, { "in": [ - "v4", + "v7", "v0" ], "op": "return", @@ -557,9 +709,25 @@ Yul Control Flow Graph: "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v5" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v6" + ] + }, + { + "in": [ + "v5", + "v6" + ], "op": "revert", "out": [] } @@ -577,7 +745,7 @@ Yul Control Flow Graph: "blocks": [ { "exit": { - "cond": "v5", + "cond": "v7", "targets": [ "Block2", "Block1" @@ -598,36 +766,52 @@ Yul Control Flow Graph: }, { "in": [ - "v0", "0x40" ], + "out": [ + "v2" + ] + }, + { + "in": [ + "v0", + "v2" + ], "op": "mstore", "out": [] }, + { + "in": [ + "0x04" + ], + "out": [ + "v4" + ] + }, { "in": [], "op": "calldatasize", "out": [ - "v3" + "v5" ] }, { "in": [ - "0x04", - "v3" + "v4", + "v5" ], "op": "lt", "out": [ - "v4" + "v6" ] }, { "in": [ - "v4" + "v6" ], "op": "iszero", "out": [ - "v5" + "v7" ] } ], @@ -647,9 +831,25 @@ Yul Control Flow Graph: "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v147" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v148" + ] + }, + { + "in": [ + "v147", + "v148" + ], "op": "revert", "out": [] } @@ -662,7 +862,7 @@ Yul Control Flow Graph: }, { "exit": { - "cond": "v11", + "cond": "v16", "targets": [ "Block4", "Block3" @@ -675,29 +875,53 @@ Yul Control Flow Graph: "in": [ "0x00" ], + "out": [ + "v9" + ] + }, + { + "in": [ + "v9" + ], "op": "calldataload", "out": [ - "v7" + "v10" ] }, { "in": [ - "v7", "0xe0" ], + "out": [ + "v12" + ] + }, + { + "in": [ + "v10", + "v12" + ], "op": "shr", "out": [ - "v9" + "v13" ] }, { "in": [ - "v9", "0x26121ff0" ], + "out": [ + "v15" + ] + }, + { + "in": [ + "v13", + "v15" + ], "op": "eq", "out": [ - "v11" + "v16" ] } ], @@ -727,7 +951,7 @@ Yul Control Flow Graph: }, { "exit": { - "cond": "v12", + "cond": "v17", "targets": [ "Block6", "Block5" @@ -740,7 +964,7 @@ Yul Control Flow Graph: "in": [], "op": "callvalue", "out": [ - "v12" + "v17" ] } ], @@ -756,7 +980,7 @@ Yul Control Flow Graph: }, { "exit": { - "cond": "v17", + "cond": "v26", "targets": [ "Block9", "Block8" @@ -765,40 +989,56 @@ Yul Control Flow Graph: }, "id": "Block6", "instructions": [ + { + "in": [ + "0x00" + ], + "out": [ + "v20" + ] + }, { "in": [ "0x03" ], + "out": [ + "v22" + ] + }, + { + "in": [ + "v22" + ], "op": "not", "out": [ - "v14" + "v23" ] }, { "in": [], "op": "calldatasize", "out": [ - "v15" + "v24" ] }, { "in": [ - "v14", - "v15" + "v23", + "v24" ], "op": "add", "out": [ - "v16" + "v25" ] }, { "in": [ - "0x00", - "v16" + "v20", + "v25" ], "op": "slt", "out": [ - "v17" + "v26" ] } ], @@ -820,9 +1060,25 @@ Yul Control Flow Graph: "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v18" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v19" + ] + }, + { + "in": [ + "v18", + "v19" + ], "op": "revert", "out": [] } @@ -835,7 +1091,7 @@ Yul Control Flow Graph: }, { "exit": { - "cond": "v28", + "cond": "v40", "targets": [ "Block12", "Block11" @@ -851,47 +1107,55 @@ Yul Control Flow Graph: "in": [], "op": "datasize", "out": [ - "v18" + "v29" ] }, { "in": [ - "v18", + "v29", "v0" ], "op": "add", "out": [ - "v24" + "v35" ] }, { "in": [ "v0", - "v24" + "v35" ], "op": "lt", "out": [ - "v25" + "v36" ] }, { "in": [ - "0xffffffffffffffff", - "v24" + "0xffffffffffffffff" + ], + "out": [ + "v38" + ] + }, + { + "in": [ + "v38", + "v35" ], "op": "gt", "out": [ - "v27" + "v39" ] }, { "in": [ - "v25", - "v27" + "v36", + "v39" ], "op": "or", "out": [ - "v28" + "v40" ] } ], @@ -901,8 +1165,8 @@ Yul Control Flow Graph: ], "out": [ "v0", - "v18", - "v24" + "v29", + "v35" ] }, "type": "BuiltinCall" @@ -915,9 +1179,25 @@ Yul Control Flow Graph: "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v27" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v28" + ] + }, + { + "in": [ + "v27", + "v28" + ], "op": "revert", "out": [] } @@ -930,7 +1210,7 @@ Yul Control Flow Graph: }, { "exit": { - "cond": "v42", + "cond": "v62", "targets": [ "Block15", "Block14" @@ -946,13 +1226,13 @@ Yul Control Flow Graph: "in": [], "op": "dataoffset", "out": [ - "v35" + "v54" ] }, { "in": [ - "v18", - "v35", + "v29", + "v54", "v0" ], "op": "datacopy", @@ -961,42 +1241,50 @@ Yul Control Flow Graph: { "in": [ "v0", - "v24" + "v35" ], "op": "sub", "out": [ - "v40" + "v59" ] }, { "in": [ - "v40", - "v0", "0x00" ], + "out": [ + "v60" + ] + }, + { + "in": [ + "v59", + "v0", + "v60" + ], "op": "create", "out": [ - "v41" + "v61" ] }, { "in": [ - "v41" + "v61" ], "op": "iszero", "out": [ - "v42" + "v62" ] } ], "liveness": { "in": [ "v0", - "v18", - "v24" + "v29", + "v35" ], "out": [ - "v41" + "v61" ] }, "type": "BuiltinCall" @@ -1009,35 +1297,91 @@ Yul Control Flow Graph: "instructions": [ { "in": [ - "0x4e487b71", + "0x4e487b71" + ], + "out": [ + "v42" + ] + }, + { + "in": [ "0xe0" ], + "out": [ + "v43" + ] + }, + { + "in": [ + "v42", + "v43" + ], "op": "shl", "out": [ - "v30" + "v44" ] }, { "in": [ - "v30", "0x00" ], + "out": [ + "v45" + ] + }, + { + "in": [ + "v44", + "v45" + ], "op": "mstore", "out": [] }, { "in": [ - "0x41", + "0x41" + ], + "out": [ + "v47" + ] + }, + { + "in": [ "0x04" ], + "out": [ + "v48" + ] + }, + { + "in": [ + "v47", + "v48" + ], "op": "mstore", "out": [] }, { "in": [ - "0x24", + "0x24" + ], + "out": [ + "v50" + ] + }, + { + "in": [ "0x00" ], + "out": [ + "v51" + ] + }, + { + "in": [ + "v50", + "v51" + ], "op": "revert", "out": [] } @@ -1050,7 +1394,7 @@ Yul Control Flow Graph: }, { "exit": { - "cond": "v60", + "cond": "v90", "targets": [ "Block18", "Block17" @@ -1063,97 +1407,161 @@ Yul Control Flow Graph: "in": [ "0x40" ], + "out": [ + "v68" + ] + }, + { + "in": [ + "v68" + ], "op": "mload", "out": [ - "v46" + "v69" + ] + }, + { + "in": [ + "0x026121ff" + ], + "out": [ + "v71" ] }, { "in": [ - "0x026121ff", "0xe4" ], + "out": [ + "v73" + ] + }, + { + "in": [ + "v71", + "v73" + ], "op": "shl", "out": [ - "v49" + "v74" ] }, { "in": [ - "v49", - "v46" + "v74", + "v69" ], "op": "mstore", "out": [] }, { "in": [ - "0x01", + "0x20" + ], + "out": [ + "v76" + ] + }, + { + "in": [ + "0x04" + ], + "out": [ + "v77" + ] + }, + { + "in": [ + "0x01" + ], + "out": [ + "v79" + ] + }, + { + "in": [ + "0x01" + ], + "out": [ + "v80" + ] + }, + { + "in": [ "0xa0" ], + "out": [ + "v82" + ] + }, + { + "in": [ + "v80", + "v82" + ], "op": "shl", "out": [ - "v53" + "v83" ] }, { "in": [ - "0x01", - "v53" + "v79", + "v83" ], "op": "sub", "out": [ - "v54" + "v84" ] }, { "in": [ - "v54", - "v41" + "v84", + "v61" ], "op": "and", "out": [ - "v57" + "v87" ] }, { "in": [], "op": "gas", "out": [ - "v58" + "v88" ] }, { "in": [ - "0x20", - "v46", - "0x04", - "v46", - "v57", - "v58" + "v76", + "v69", + "v77", + "v69", + "v87", + "v88" ], "op": "staticcall", "out": [ - "v59" + "v89" ] }, { "in": [ - "v59" + "v89" ], "op": "iszero", "out": [ - "v60" + "v90" ] } ], "liveness": { "in": [ - "v41" + "v61" ], "out": [ - "v46", - "v59" + "v69", + "v89" ] }, "type": "BuiltinCall" @@ -1168,23 +1576,39 @@ Yul Control Flow Graph: "in": [ "0x40" ], + "out": [ + "v63" + ] + }, + { + "in": [ + "v63" + ], "op": "mload", "out": [ - "v43" + "v64" ] }, { "in": [], "op": "returndatasize", "out": [ - "v44" + "v65" ] }, { "in": [ - "v44", - "0x00", - "v43" + "0x00" + ], + "out": [ + "v66" + ] + }, + { + "in": [ + "v65", + "v66", + "v64" ], "op": "returndatacopy", "out": [] @@ -1193,13 +1617,13 @@ Yul Control Flow Graph: "in": [], "op": "returndatasize", "out": [ - "v45" + "v67" ] }, { "in": [ - "v45", - "v43" + "v67", + "v64" ], "op": "revert", "out": [] @@ -1213,7 +1637,7 @@ Yul Control Flow Graph: }, { "exit": { - "cond": "v59", + "cond": "v89", "targets": [ "Block21", "Block20" @@ -1227,18 +1651,18 @@ Yul Control Flow Graph: "0x00" ], "out": [ - "v64" + "v96" ] } ], "liveness": { "in": [ - "v46", - "v59" + "v69", + "v89" ], "out": [ - "v46", - "v64" + "v69", + "v96" ] }, "type": "LiteralAssignment" @@ -1253,23 +1677,39 @@ Yul Control Flow Graph: "in": [ "0x40" ], + "out": [ + "v91" + ] + }, + { + "in": [ + "v91" + ], "op": "mload", "out": [ - "v61" + "v92" ] }, { "in": [], "op": "returndatasize", "out": [ - "v62" + "v93" ] }, { "in": [ - "v62", - "0x00", - "v61" + "0x00" + ], + "out": [ + "v94" + ] + }, + { + "in": [ + "v93", + "v94", + "v92" ], "op": "returndatacopy", "out": [] @@ -1278,13 +1718,13 @@ Yul Control Flow Graph: "in": [], "op": "returndatasize", "out": [ - "v63" + "v95" ] }, { "in": [ - "v63", - "v61" + "v95", + "v92" ], "op": "revert", "out": [] @@ -1308,35 +1748,51 @@ Yul Control Flow Graph: "instructions": [ { "in": [ - "v64", - "v95" + "v96", + "v142" ], "op": "PhiFunction", "out": [ - "v97" + "v145" ] }, { "in": [ "0x40" ], + "out": [ + "v143" + ] + }, + { + "in": [ + "v143" + ], "op": "mload", "out": [ - "v96" + "v144" ] }, { "in": [ - "v97", - "v96" + "v145", + "v144" ], "op": "mstore", "out": [] }, { "in": [ - "0x20", - "v96" + "0x20" + ], + "out": [ + "v146" + ] + }, + { + "in": [ + "v146", + "v144" ], "op": "return", "out": [] @@ -1344,7 +1800,7 @@ Yul Control Flow Graph: ], "liveness": { "in": [ - "v97" + "v145" ], "out": [] }, @@ -1352,7 +1808,7 @@ Yul Control Flow Graph: }, { "exit": { - "cond": "v69", + "cond": "v102", "targets": [ "Block23", "Block22" @@ -1366,34 +1822,42 @@ Yul Control Flow Graph: "0x20" ], "out": [ - "v67" + "v99" ] }, { "in": [], "op": "returndatasize", "out": [ - "v68" + "v100" ] }, { "in": [ - "v68", "0x20" ], + "out": [ + "v101" + ] + }, + { + "in": [ + "v100", + "v101" + ], "op": "gt", "out": [ - "v69" + "v102" ] } ], "liveness": { "in": [ - "v46" + "v69" ], "out": [ - "v46", - "v67" + "v69", + "v99" ] }, "type": "BuiltinCall" @@ -1404,7 +1868,7 @@ Yul Control Flow Graph: "Block22" ], "exit": { - "cond": "v82", + "cond": "v118", "targets": [ "Block25", "Block24" @@ -1415,93 +1879,117 @@ Yul Control Flow Graph: "instructions": [ { "in": [ - "v67", - "v70" + "v99", + "v103" + ], + "op": "PhiFunction", + "out": [ + "v108" + ] + }, + { + "in": [ + "0x1f" ], - "op": "PhiFunction", "out": [ - "v73" + "v105" ] }, { "in": [ - "0x1f" + "v105" ], "op": "not", "out": [ - "v72" + "v106" ] }, { "in": [ - "0x1f", - "v73" + "0x1f" + ], + "out": [ + "v107" + ] + }, + { + "in": [ + "v107", + "v108" ], "op": "add", "out": [ - "v74" + "v109" ] }, { "in": [ - "v72", - "v74" + "v106", + "v109" ], "op": "and", "out": [ - "v75" + "v110" ] }, { "in": [ - "v75", - "v46" + "v110", + "v69" ], "op": "add", "out": [ - "v79" + "v114" ] }, { "in": [ - "v46", - "v79" + "v69", + "v114" ], "op": "lt", "out": [ - "v80" + "v115" ] }, { "in": [ - "0xffffffffffffffff", - "v79" + "0xffffffffffffffff" + ], + "out": [ + "v116" + ] + }, + { + "in": [ + "v116", + "v114" ], "op": "gt", "out": [ - "v81" + "v117" ] }, { "in": [ - "v80", - "v81" + "v115", + "v117" ], "op": "or", "out": [ - "v82" + "v118" ] } ], "liveness": { "in": [ - "v46", - "v73" + "v69", + "v108" ], "out": [ - "v46", - "v73", - "v79" + "v69", + "v108", + "v114" ] }, "type": "BuiltinCall" @@ -1519,24 +2007,24 @@ Yul Control Flow Graph: "in": [], "op": "returndatasize", "out": [ - "v70" + "v103" ] } ], "liveness": { "in": [ - "v46" + "v69" ], "out": [ - "v46", - "v70" + "v69", + "v103" ] }, "type": "BuiltinCall" }, { "exit": { - "cond": "v92", + "cond": "v137", "targets": [ "Block28", "Block27" @@ -1547,51 +2035,67 @@ Yul Control Flow Graph: "instructions": [ { "in": [ - "v79", "0x40" ], + "out": [ + "v129" + ] + }, + { + "in": [ + "v114", + "v129" + ], "op": "mstore", "out": [] }, { "in": [ - "v73", - "v46" + "0x20" + ], + "out": [ + "v130" + ] + }, + { + "in": [ + "v108", + "v69" ], "op": "add", "out": [ - "v90" + "v135" ] }, { "in": [ - "v46", - "v90" + "v69", + "v135" ], "op": "sub", "out": [ - "v91" + "v136" ] }, { "in": [ - "0x20", - "v91" + "v130", + "v136" ], "op": "slt", "out": [ - "v92" + "v137" ] } ], "liveness": { "in": [ - "v46", - "v73", - "v79" + "v69", + "v108", + "v114" ], "out": [ - "v46" + "v69" ] }, "type": "BuiltinCall" @@ -1604,35 +2108,91 @@ Yul Control Flow Graph: "instructions": [ { "in": [ - "0x4e487b71", + "0x4e487b71" + ], + "out": [ + "v119" + ] + }, + { + "in": [ "0xe0" ], + "out": [ + "v120" + ] + }, + { + "in": [ + "v119", + "v120" + ], "op": "shl", "out": [ - "v83" + "v121" ] }, { "in": [ - "v83", "0x00" ], + "out": [ + "v122" + ] + }, + { + "in": [ + "v121", + "v122" + ], "op": "mstore", "out": [] }, { "in": [ - "0x41", + "0x41" + ], + "out": [ + "v123" + ] + }, + { + "in": [ "0x04" ], + "out": [ + "v124" + ] + }, + { + "in": [ + "v123", + "v124" + ], "op": "mstore", "out": [] }, { "in": [ - "0x24", + "0x24" + ], + "out": [ + "v125" + ] + }, + { + "in": [ "0x00" ], + "out": [ + "v126" + ] + }, + { + "in": [ + "v125", + "v126" + ], "op": "revert", "out": [] } @@ -1654,20 +2214,20 @@ Yul Control Flow Graph: "instructions": [ { "in": [ - "v46" + "v69" ], "op": "mload", "out": [ - "v95" + "v142" ] } ], "liveness": { "in": [ - "v46" + "v69" ], "out": [ - "v95" + "v142" ] }, "type": "BuiltinCall" @@ -1680,9 +2240,25 @@ Yul Control Flow Graph: "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v138" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v139" + ] + }, + { + "in": [ + "v138", + "v139" + ], "op": "revert", "out": [] } @@ -1700,7 +2276,7 @@ Yul Control Flow Graph: "blocks": [ { "exit": { - "cond": "v2", + "cond": "v3", "targets": [ "Block2", "Block1" @@ -1721,9 +2297,17 @@ Yul Control Flow Graph: }, { "in": [ - "v0", "0x40" ], + "out": [ + "v2" + ] + }, + { + "in": [ + "v0", + "v2" + ], "op": "mstore", "out": [] }, @@ -1731,7 +2315,7 @@ Yul Control Flow Graph: "in": [], "op": "callvalue", "out": [ - "v2" + "v3" ] } ], @@ -1756,7 +2340,7 @@ Yul Control Flow Graph: "in": [], "op": "datasize", "out": [ - "v4" + "v7" ] }, { @@ -1766,13 +2350,13 @@ Yul Control Flow Graph: "in": [], "op": "dataoffset", "out": [ - "v5" + "v8" ] }, { "in": [ - "v4", - "v5", + "v7", + "v8", "v0" ], "op": "codecopy", @@ -1780,7 +2364,7 @@ Yul Control Flow Graph: }, { "in": [ - "v4", + "v7", "v0" ], "op": "return", @@ -1803,9 +2387,25 @@ Yul Control Flow Graph: "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v5" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v6" + ] + }, + { + "in": [ + "v5", + "v6" + ], "op": "revert", "out": [] } @@ -1823,7 +2423,7 @@ Yul Control Flow Graph: "blocks": [ { "exit": { - "cond": "v5", + "cond": "v7", "targets": [ "Block2", "Block1" @@ -1844,36 +2444,52 @@ Yul Control Flow Graph: }, { "in": [ - "v0", "0x40" ], + "out": [ + "v2" + ] + }, + { + "in": [ + "v0", + "v2" + ], "op": "mstore", "out": [] }, + { + "in": [ + "0x04" + ], + "out": [ + "v4" + ] + }, { "in": [], "op": "calldatasize", "out": [ - "v3" + "v5" ] }, { "in": [ - "0x04", - "v3" + "v4", + "v5" ], "op": "lt", "out": [ - "v4" + "v6" ] }, { "in": [ - "v4" + "v6" ], "op": "iszero", "out": [ - "v5" + "v7" ] } ], @@ -1893,9 +2509,25 @@ Yul Control Flow Graph: "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v38" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v39" + ] + }, + { + "in": [ + "v38", + "v39" + ], "op": "revert", "out": [] } @@ -1908,7 +2540,7 @@ Yul Control Flow Graph: }, { "exit": { - "cond": "v11", + "cond": "v16", "targets": [ "Block4", "Block3" @@ -1921,29 +2553,53 @@ Yul Control Flow Graph: "in": [ "0x00" ], + "out": [ + "v9" + ] + }, + { + "in": [ + "v9" + ], "op": "calldataload", "out": [ - "v7" + "v10" ] }, { "in": [ - "v7", "0xe0" ], + "out": [ + "v12" + ] + }, + { + "in": [ + "v10", + "v12" + ], "op": "shr", "out": [ - "v9" + "v13" ] }, { "in": [ - "v9", "0x26121ff0" ], + "out": [ + "v15" + ] + }, + { + "in": [ + "v13", + "v15" + ], "op": "eq", "out": [ - "v11" + "v16" ] } ], @@ -1973,7 +2629,7 @@ Yul Control Flow Graph: }, { "exit": { - "cond": "v12", + "cond": "v17", "targets": [ "Block6", "Block5" @@ -1986,7 +2642,7 @@ Yul Control Flow Graph: "in": [], "op": "callvalue", "out": [ - "v12" + "v17" ] } ], @@ -2002,7 +2658,7 @@ Yul Control Flow Graph: }, { "exit": { - "cond": "v17", + "cond": "v26", "targets": [ "Block9", "Block8" @@ -2011,40 +2667,56 @@ Yul Control Flow Graph: }, "id": "Block6", "instructions": [ + { + "in": [ + "0x00" + ], + "out": [ + "v20" + ] + }, { "in": [ "0x03" ], + "out": [ + "v22" + ] + }, + { + "in": [ + "v22" + ], "op": "not", "out": [ - "v14" + "v23" ] }, { "in": [], "op": "calldatasize", "out": [ - "v15" + "v24" ] }, { "in": [ - "v14", - "v15" + "v23", + "v24" ], "op": "add", "out": [ - "v16" + "v25" ] }, { "in": [ - "0x00", - "v16" + "v20", + "v25" ], "op": "slt", "out": [ - "v17" + "v26" ] } ], @@ -2066,9 +2738,25 @@ Yul Control Flow Graph: "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v18" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v19" + ] + }, + { + "in": [ + "v18", + "v19" + ], "op": "revert", "out": [] } @@ -2087,7 +2775,15 @@ Yul Control Flow Graph: "instructions": [ { "in": [ - "0x2a", + "0x2a" + ], + "out": [ + "v30" + ] + }, + { + "in": [ + "v30", "v0" ], "op": "mstore", @@ -2095,7 +2791,15 @@ Yul Control Flow Graph: }, { "in": [ - "0x20", + "0x20" + ], + "out": [ + "v37" + ] + }, + { + "in": [ + "v37", "v0" ], "op": "return", @@ -2118,9 +2822,25 @@ Yul Control Flow Graph: "instructions": [ { "in": [ - "0x00", "0x00" ], + "out": [ + "v27" + ] + }, + { + "in": [ + "0x00" + ], + "out": [ + "v28" + ] + }, + { + "in": [ + "v27", + "v28" + ], "op": "revert", "out": [] } diff --git a/test/libyul/SSAControlFlowGraphTest.cpp b/test/libyul/SSAControlFlowGraphTest.cpp index 087a79e974af..1277bc2983b7 100644 --- a/test/libyul/SSAControlFlowGraphTest.cpp +++ b/test/libyul/SSAControlFlowGraphTest.cpp @@ -74,7 +74,7 @@ TestCase::TestResult SSAControlFlowGraphTest::run(std::ostream& _stream, std::st *yulStack.parserResult()->analysisInfo, yulStack.dialect(), yulStack.parserResult()->code()->root(), - true + false ); ControlFlowLiveness liveness(*controlFlow); m_obtainedResult = controlFlow->toDot(&liveness); diff --git a/test/libyul/yulSSAControlFlowGraph/complex.yul b/test/libyul/yulSSAControlFlowGraph/complex.yul index ecb1b7cfeacd..5c4481cb5c9b 100644 --- a/test/libyul/yulSSAControlFlowGraph/complex.yul +++ b/test/libyul/yulSSAControlFlowGraph/complex.yul @@ -53,8 +53,10 @@ // Entry0 -> Block0_0; // Block0_0 [label="\ // Block 0; (0, max 0)\nLiveIn: \l\ -// LiveOut: \l\nv2 := f(2, 1)\l\ -// pop(v2)\l\ +// LiveOut: \l\nv1 := 2\l\ +// v3 := 1\l\ +// v4 := f(v1, v3)\l\ +// pop(v4)\l\ // "]; // Block0_0Exit [label="MainExit"]; // Block0_0 -> Block0_0Exit; @@ -72,7 +74,7 @@ // Block 1; (1, max 17)\nLiveIn: v0,v1,v6\l\ // LiveOut: v0,v1,v6\l\nv6 := φ(\l\ // Block 0 => v4,\l\ -// Block 21 => v44\l\ +// Block 21 => v69\l\ // )\l\ // v7 := lt(v0, v6)\l\ // "]; @@ -91,107 +93,129 @@ // Block1_2Exit:1 -> Block1_6 [style="solid"]; // Block1_4 [label="\ // Block 4; (4, max 4)\nLiveIn: \l\ -// LiveOut: \l\nsstore(3084, 12)\l\ +// LiveOut: \l\nv106 := 3084\l\ +// v108 := 12\l\ +// sstore(v106, v108)\l\ // "]; // Block1_4Exit [label="FunctionReturn[0]"]; // Block1_4 -> Block1_4Exit; // Block1_6 [label="\ // Block 6; (3, max 4)\nLiveIn: \l\ -// LiveOut: \l\nsstore(514, 2)\l\ +// LiveOut: \l\nv11 := 514\l\ +// v13 := 2\l\ +// sstore(v11, v13)\l\ // "]; // Block1_6 -> Block1_6Exit [arrowhead=none]; // Block1_6Exit [label="Jump" shape=oval]; // Block1_6Exit -> Block1_4 [style="solid"]; // Block1_7 [label="\ // Block 7; (5, max 17)\nLiveIn: v0,v1,v6,v8\l\ -// LiveOut: v0,v1,v6,v8\l\nv14 := eq(1, v8)\l\ +// LiveOut: v0,v1,v6,v8\l\nv18 := eq(1, v8)\l\ // "]; // Block1_7 -> Block1_7Exit; -// Block1_7Exit [label="{ If v14 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; +// Block1_7Exit [label="{ If v18 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; // Block1_7Exit:0 -> Block1_10 [style="solid"]; // Block1_7Exit:1 -> Block1_9 [style="solid"]; // Block1_9 [label="\ // Block 9; (6, max 6)\nLiveIn: \l\ -// LiveOut: \l\nsstore(1028, 4)\l\ +// LiveOut: \l\nv21 := 1028\l\ +// v23 := 4\l\ +// sstore(v21, v23)\l\ // "]; // Block1_9Exit [label="FunctionReturn[0]"]; // Block1_9 -> Block1_9Exit; // Block1_10 [label="\ // Block 10; (7, max 17)\nLiveIn: v0,v1,v6,v8\l\ -// LiveOut: v0,v1,v6,v8\l\nv21 := eq(2, v8)\l\ +// LiveOut: v0,v1,v6,v8\l\nv29 := eq(2, v8)\l\ // "]; // Block1_10 -> Block1_10Exit; -// Block1_10Exit [label="{ If v21 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; +// Block1_10Exit [label="{ If v29 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; // Block1_10Exit:0 -> Block1_13 [style="solid"]; // Block1_10Exit:1 -> Block1_12 [style="solid"]; // Block1_12 [label="\ // Block 12; (8, max 8)\nLiveIn: \l\ -// LiveOut: \l\nsstore(1542, 6)\l\ -// revert(0, 0)\l\ +// LiveOut: \l\nv31 := 1542\l\ +// v33 := 6\l\ +// sstore(v31, v33)\l\ +// v34 := 0\l\ +// v35 := 0\l\ +// revert(v34, v35)\l\ // "]; // Block1_12Exit [label="Terminated"]; // Block1_12 -> Block1_12Exit; // Block1_13 [label="\ // Block 13; (9, max 17)\nLiveIn: v0,v1,v6,v8\l\ -// LiveOut: v0,v1,v6\l\nv26 := eq(3, v8)\l\ +// LiveOut: v0,v1,v6\l\nv40 := eq(3, v8)\l\ // "]; // Block1_13 -> Block1_13Exit; -// Block1_13Exit [label="{ If v26 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; +// Block1_13Exit [label="{ If v40 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; // Block1_13Exit:0 -> Block1_16 [style="solid"]; // Block1_13Exit:1 -> Block1_15 [style="solid"]; // Block1_15 [label="\ // Block 15; (10, max 14)\nLiveIn: v0,v1,v6\l\ -// LiveOut: v0,v1,v6\l\nsstore(2056, 8)\l\ +// LiveOut: v0,v1,v6\l\nv42 := 2056\l\ +// v44 := 8\l\ +// sstore(v42, v44)\l\ // "]; // Block1_15 -> Block1_15Exit [arrowhead=none]; // Block1_15Exit [label="Jump" shape=oval]; // Block1_15Exit -> Block1_5 [style="solid"]; // Block1_16 [label="\ // Block 16; (15, max 17)\nLiveIn: v0,v1,v6\l\ -// LiveOut: v0,v1,v6\l\nv30 := mload(v1)\l\ +// LiveOut: v0,v1,v6\l\nv46 := mload(v1)\l\ // "]; // Block1_16 -> Block1_16Exit; -// Block1_16Exit [label="{ If v30 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; +// Block1_16Exit [label="{ If v46 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; // Block1_16Exit:0 -> Block1_18 [style="solid"]; // Block1_16Exit:1 -> Block1_17 [style="solid"]; // Block1_5 [label="\ // Block 5; (11, max 14)\nLiveIn: v0,v1,v6\l\ -// LiveOut: v0,v1,v6\l\nsstore(2827, 11)\l\ +// LiveOut: v0,v1,v6\l\nv58 := 2827\l\ +// v60 := 11\l\ +// sstore(v58, v60)\l\ // "]; // Block1_5 -> Block1_5Exit [arrowhead=none]; // Block1_5Exit [label="Jump" shape=oval]; // Block1_5Exit -> Block1_3 [style="solid"]; // Block1_17 [label="\ // Block 17; (16, max 16)\nLiveIn: \l\ -// LiveOut: \l\nreturn(0, 0)\l\ +// LiveOut: \l\nv47 := 0\l\ +// v48 := 0\l\ +// return(v47, v48)\l\ // "]; // Block1_17Exit [label="Terminated"]; // Block1_17 -> Block1_17Exit; // Block1_18 [label="\ // Block 18; (17, max 17)\nLiveIn: v0,v1,v6\l\ -// LiveOut: v0,v1,v6\l\nsstore(2570, 10)\l\ +// LiveOut: v0,v1,v6\l\nv54 := 2570\l\ +// v56 := 10\l\ +// sstore(v54, v56)\l\ // "]; // Block1_18 -> Block1_18Exit [arrowhead=none]; // Block1_18Exit [label="Jump" shape=oval]; // Block1_18Exit -> Block1_5 [style="solid"]; // Block1_3 [label="\ // Block 3; (12, max 14)\nLiveIn: v0,v1,v6\l\ -// LiveOut: v0,v1,v44\l\nv44 := add(1, v6)\l\ -// v45 := calldataload(v44)\l\ +// LiveOut: v0,v1,v69\l\nv61 := 1\l\ +// v69 := add(v61, v6)\l\ +// v70 := calldataload(v69)\l\ // "]; // Block1_3 -> Block1_3Exit; -// Block1_3Exit [label="{ If v45 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; +// Block1_3Exit [label="{ If v70 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; // Block1_3Exit:0 -> Block1_21 [style="solid"]; // Block1_3Exit:1 -> Block1_20 [style="solid"]; // Block1_20 [label="\ -// Block 20; (13, max 13)\nLiveIn: v44\l\ -// LiveOut: \l\nsstore(v44, 0)\l\ +// Block 20; (13, max 13)\nLiveIn: v69\l\ +// LiveOut: \l\nv71 := 0\l\ +// sstore(v69, v71)\l\ // "]; // Block1_20Exit [label="FunctionReturn[0]"]; // Block1_20 -> Block1_20Exit; // Block1_21 [label="\ -// Block 21; (14, max 14)\nLiveIn: v0,v1,v44\l\ -// LiveOut: v0,v1,v44\l\nsstore(65535, 255)\l\ +// Block 21; (14, max 14)\nLiveIn: v0,v1,v69\l\ +// LiveOut: v0,v1,v69\l\nv82 := 65535\l\ +// v84 := 255\l\ +// sstore(v82, v84)\l\ // "]; // Block1_21 -> Block1_21Exit [arrowhead=none]; // Block1_21Exit [label="Jump" shape=oval]; diff --git a/test/libyul/yulSSAControlFlowGraph/complex2.yul b/test/libyul/yulSSAControlFlowGraph/complex2.yul index d4e8b432d608..f856db68f816 100644 --- a/test/libyul/yulSSAControlFlowGraph/complex2.yul +++ b/test/libyul/yulSSAControlFlowGraph/complex2.yul @@ -60,17 +60,26 @@ // Entry0 -> Block0_0; // Block0_0 [label="\ // Block 0; (0, max 0)\nLiveIn: \l\ -// LiveOut: \l\nsstore(1, 1)\l\ -// v2 := f(2, 1)\l\ -// pop(v2)\l\ -// v4 := sload(0)\l\ -// v6 := add(v4, 5)\l\ -// v8 := sload(4)\l\ -// v9 := f(v8, v6)\l\ -// sstore(v9, v6)\l\ -// v10 := sload(5)\l\ -// v11 := f(v10, v9)\l\ -// sstore(v11, 1)\l\ +// LiveOut: \l\nv1 := 1\l\ +// v2 := 1\l\ +// sstore(v1, v2)\l\ +// v4 := 2\l\ +// v5 := 1\l\ +// v6 := f(v4, v5)\l\ +// pop(v6)\l\ +// v8 := 0\l\ +// v9 := sload(v8)\l\ +// v11 := 5\l\ +// v12 := add(v9, v11)\l\ +// v14 := 4\l\ +// v15 := sload(v14)\l\ +// v16 := f(v15, v12)\l\ +// sstore(v16, v12)\l\ +// v17 := 5\l\ +// v18 := sload(v17)\l\ +// v19 := f(v18, v16)\l\ +// v20 := 1\l\ +// sstore(v19, v20)\l\ // "]; // Block0_0Exit [label="MainExit"]; // Block0_0 -> Block0_0Exit; @@ -88,7 +97,7 @@ // Block 1; (1, max 17)\nLiveIn: v0,v1,v6\l\ // LiveOut: v0,v1,v6\l\nv6 := φ(\l\ // Block 0 => v4,\l\ -// Block 21 => v44\l\ +// Block 21 => v69\l\ // )\l\ // v7 := lt(v0, v6)\l\ // "]; @@ -107,108 +116,130 @@ // Block1_2Exit:1 -> Block1_6 [style="solid"]; // Block1_4 [label="\ // Block 4; (4, max 4)\nLiveIn: \l\ -// LiveOut: v78\l\nsstore(3084, 12)\l\ -// v78 := 27\l\ +// LiveOut: v110\l\nv106 := 3084\l\ +// v108 := 12\l\ +// sstore(v106, v108)\l\ +// v110 := 27\l\ // "]; -// Block1_4Exit [label="FunctionReturn[v78]"]; +// Block1_4Exit [label="FunctionReturn[v110]"]; // Block1_4 -> Block1_4Exit; // Block1_6 [label="\ // Block 6; (3, max 4)\nLiveIn: \l\ -// LiveOut: \l\nsstore(514, 2)\l\ +// LiveOut: \l\nv11 := 514\l\ +// v13 := 2\l\ +// sstore(v11, v13)\l\ // "]; // Block1_6 -> Block1_6Exit [arrowhead=none]; // Block1_6Exit [label="Jump" shape=oval]; // Block1_6Exit -> Block1_4 [style="solid"]; // Block1_7 [label="\ // Block 7; (5, max 17)\nLiveIn: v0,v1,v6,v8\l\ -// LiveOut: v0,v1,v6,v8\l\nv14 := eq(1, v8)\l\ +// LiveOut: v0,v1,v6,v8\l\nv18 := eq(1, v8)\l\ // "]; // Block1_7 -> Block1_7Exit; -// Block1_7Exit [label="{ If v14 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; +// Block1_7Exit [label="{ If v18 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; // Block1_7Exit:0 -> Block1_10 [style="solid"]; // Block1_7Exit:1 -> Block1_9 [style="solid"]; // Block1_9 [label="\ // Block 9; (6, max 6)\nLiveIn: \l\ -// LiveOut: \l\nsstore(1028, 4)\l\ +// LiveOut: \l\nv21 := 1028\l\ +// v23 := 4\l\ +// sstore(v21, v23)\l\ // "]; // Block1_9Exit [label="FunctionReturn[0]"]; // Block1_9 -> Block1_9Exit; // Block1_10 [label="\ // Block 10; (7, max 17)\nLiveIn: v0,v1,v6,v8\l\ -// LiveOut: v0,v1,v6,v8\l\nv21 := eq(2, v8)\l\ +// LiveOut: v0,v1,v6,v8\l\nv29 := eq(2, v8)\l\ // "]; // Block1_10 -> Block1_10Exit; -// Block1_10Exit [label="{ If v21 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; +// Block1_10Exit [label="{ If v29 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; // Block1_10Exit:0 -> Block1_13 [style="solid"]; // Block1_10Exit:1 -> Block1_12 [style="solid"]; // Block1_12 [label="\ // Block 12; (8, max 8)\nLiveIn: \l\ -// LiveOut: \l\nsstore(1542, 6)\l\ -// revert(0, 0)\l\ +// LiveOut: \l\nv31 := 1542\l\ +// v33 := 6\l\ +// sstore(v31, v33)\l\ +// v34 := 0\l\ +// v35 := 0\l\ +// revert(v34, v35)\l\ // "]; // Block1_12Exit [label="Terminated"]; // Block1_12 -> Block1_12Exit; // Block1_13 [label="\ // Block 13; (9, max 17)\nLiveIn: v0,v1,v6,v8\l\ -// LiveOut: v0,v1,v6\l\nv26 := eq(3, v8)\l\ +// LiveOut: v0,v1,v6\l\nv40 := eq(3, v8)\l\ // "]; // Block1_13 -> Block1_13Exit; -// Block1_13Exit [label="{ If v26 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; +// Block1_13Exit [label="{ If v40 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; // Block1_13Exit:0 -> Block1_16 [style="solid"]; // Block1_13Exit:1 -> Block1_15 [style="solid"]; // Block1_15 [label="\ // Block 15; (10, max 14)\nLiveIn: v0,v1,v6\l\ -// LiveOut: v0,v1,v6\l\nsstore(2056, 8)\l\ +// LiveOut: v0,v1,v6\l\nv42 := 2056\l\ +// v44 := 8\l\ +// sstore(v42, v44)\l\ // "]; // Block1_15 -> Block1_15Exit [arrowhead=none]; // Block1_15Exit [label="Jump" shape=oval]; // Block1_15Exit -> Block1_5 [style="solid"]; // Block1_16 [label="\ // Block 16; (15, max 17)\nLiveIn: v0,v1,v6\l\ -// LiveOut: v0,v1,v6\l\nv30 := mload(v1)\l\ +// LiveOut: v0,v1,v6\l\nv46 := mload(v1)\l\ // "]; // Block1_16 -> Block1_16Exit; -// Block1_16Exit [label="{ If v30 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; +// Block1_16Exit [label="{ If v46 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; // Block1_16Exit:0 -> Block1_18 [style="solid"]; // Block1_16Exit:1 -> Block1_17 [style="solid"]; // Block1_5 [label="\ // Block 5; (11, max 14)\nLiveIn: v0,v1,v6\l\ -// LiveOut: v0,v1,v6\l\nsstore(2827, 11)\l\ +// LiveOut: v0,v1,v6\l\nv58 := 2827\l\ +// v60 := 11\l\ +// sstore(v58, v60)\l\ // "]; // Block1_5 -> Block1_5Exit [arrowhead=none]; // Block1_5Exit [label="Jump" shape=oval]; // Block1_5Exit -> Block1_3 [style="solid"]; // Block1_17 [label="\ // Block 17; (16, max 16)\nLiveIn: \l\ -// LiveOut: \l\nreturn(0, 0)\l\ +// LiveOut: \l\nv47 := 0\l\ +// v48 := 0\l\ +// return(v47, v48)\l\ // "]; // Block1_17Exit [label="Terminated"]; // Block1_17 -> Block1_17Exit; // Block1_18 [label="\ // Block 18; (17, max 17)\nLiveIn: v0,v1,v6\l\ -// LiveOut: v0,v1,v6\l\nsstore(2570, 10)\l\ +// LiveOut: v0,v1,v6\l\nv54 := 2570\l\ +// v56 := 10\l\ +// sstore(v54, v56)\l\ // "]; // Block1_18 -> Block1_18Exit [arrowhead=none]; // Block1_18Exit [label="Jump" shape=oval]; // Block1_18Exit -> Block1_5 [style="solid"]; // Block1_3 [label="\ // Block 3; (12, max 14)\nLiveIn: v0,v1,v6\l\ -// LiveOut: v0,v1,v44\l\nv44 := add(1, v6)\l\ -// v45 := calldataload(v44)\l\ +// LiveOut: v0,v1,v69\l\nv61 := 1\l\ +// v69 := add(v61, v6)\l\ +// v70 := calldataload(v69)\l\ // "]; // Block1_3 -> Block1_3Exit; -// Block1_3Exit [label="{ If v45 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; +// Block1_3Exit [label="{ If v70 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; // Block1_3Exit:0 -> Block1_21 [style="solid"]; // Block1_3Exit:1 -> Block1_20 [style="solid"]; // Block1_20 [label="\ -// Block 20; (13, max 13)\nLiveIn: v44\l\ -// LiveOut: \l\nsstore(v44, 0)\l\ +// Block 20; (13, max 13)\nLiveIn: v69\l\ +// LiveOut: \l\nv71 := 0\l\ +// sstore(v69, v71)\l\ // "]; // Block1_20Exit [label="FunctionReturn[0]"]; // Block1_20 -> Block1_20Exit; // Block1_21 [label="\ -// Block 21; (14, max 14)\nLiveIn: v0,v1,v44\l\ -// LiveOut: v0,v1,v44\l\nsstore(65535, 255)\l\ +// Block 21; (14, max 14)\nLiveIn: v0,v1,v69\l\ +// LiveOut: v0,v1,v69\l\nv82 := 65535\l\ +// v84 := 255\l\ +// sstore(v82, v84)\l\ // "]; // Block1_21 -> Block1_21Exit [arrowhead=none]; // Block1_21Exit [label="Jump" shape=oval]; diff --git a/test/libyul/yulSSAControlFlowGraph/default_initialized_variable.yul b/test/libyul/yulSSAControlFlowGraph/default_initialized_variable.yul index 92ea33382b10..c71bcec09f35 100644 --- a/test/libyul/yulSSAControlFlowGraph/default_initialized_variable.yul +++ b/test/libyul/yulSSAControlFlowGraph/default_initialized_variable.yul @@ -16,26 +16,27 @@ // Block0_0 [label="\ // Block 0; (0, max 2)\nLiveIn: \l\ // LiveOut: v1\l\nv1 := 0\l\ -// v3 := mload(42)\l\ +// v3 := 42\l\ +// v4 := mload(v3)\l\ // "]; // Block0_0 -> Block0_0Exit; -// Block0_0Exit [label="{ If v3 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; +// Block0_0Exit [label="{ If v4 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; // Block0_0Exit:0 -> Block0_2 [style="solid"]; // Block0_0Exit:1 -> Block0_1 [style="solid"]; // Block0_1 [label="\ // Block 1; (1, max 2)\nLiveIn: \l\ -// LiveOut: v5\l\nv5 := 5\l\ +// LiveOut: v6\l\nv6 := 5\l\ // "]; // Block0_1 -> Block0_1Exit [arrowhead=none]; // Block0_1Exit [label="Jump" shape=oval]; // Block0_1Exit -> Block0_2 [style="solid"]; // Block0_2 [label="\ -// Block 2; (2, max 2)\nLiveIn: v6\l\ -// LiveOut: \l\nv6 := φ(\l\ +// Block 2; (2, max 2)\nLiveIn: v7\l\ +// LiveOut: \l\nv7 := φ(\l\ // Block 0 => v1,\l\ -// Block 1 => v5\l\ +// Block 1 => v6\l\ // )\l\ -// sstore(v6, v6)\l\ +// sstore(v7, v7)\l\ // "]; // Block0_2Exit [label="MainExit"]; // Block0_2 -> Block0_2Exit; diff --git a/test/libyul/yulSSAControlFlowGraph/function.yul b/test/libyul/yulSSAControlFlowGraph/function.yul index e2d8c1d52328..02a6110c8b6d 100644 --- a/test/libyul/yulSSAControlFlowGraph/function.yul +++ b/test/libyul/yulSSAControlFlowGraph/function.yul @@ -48,7 +48,9 @@ // FunctionEntry_g_0 -> Block2_0; // Block2_0 [label="\ // Block 0; (0, max 0)\nLiveIn: \l\ -// LiveOut: \l\nsstore(257, 1)\l\ +// LiveOut: \l\nv1 := 257\l\ +// v3 := 1\l\ +// sstore(v1, v3)\l\ // "]; // Block2_0Exit [label="FunctionReturn[]"]; // Block2_0 -> Block2_0Exit; @@ -57,8 +59,9 @@ // FunctionEntry_h_0 -> Block3_0; // Block3_0 [label="\ // Block 0; (0, max 0)\nLiveIn: v0\l\ -// LiveOut: \l\nv2 := f(0, v0)\l\ -// h(v2)\l\ +// LiveOut: \l\nv2 := 0\l\ +// v3 := f(v2, v0)\l\ +// h(v3)\l\ // "]; // Block3_0Exit [label="Terminated"]; // Block3_0 -> Block3_0Exit; diff --git a/test/libyul/yulSSAControlFlowGraph/if.yul b/test/libyul/yulSSAControlFlowGraph/if.yul index e2a66ab74fba..010cc919c113 100644 --- a/test/libyul/yulSSAControlFlowGraph/if.yul +++ b/test/libyul/yulSSAControlFlowGraph/if.yul @@ -16,7 +16,8 @@ // Entry0 -> Block0_0; // Block0_0 [label="\ // Block 0; (0, max 2)\nLiveIn: \l\ -// LiveOut: v1\l\nv1 := calldataload(3)\l\ +// LiveOut: v2\l\nv1 := 3\l\ +// v2 := calldataload(v1)\l\ // "]; // Block0_0 -> Block0_0Exit; // Block0_0Exit [label="{ If 0 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; @@ -24,19 +25,21 @@ // Block0_0Exit:1 -> Block0_1 [style="solid"]; // Block0_1 [label="\ // Block 1; (1, max 2)\nLiveIn: \l\ -// LiveOut: v4\l\nv4 := calldataload(77)\l\ +// LiveOut: v6\l\nv5 := 77\l\ +// v6 := calldataload(v5)\l\ // "]; // Block0_1 -> Block0_1Exit [arrowhead=none]; // Block0_1Exit [label="Jump" shape=oval]; // Block0_1Exit -> Block0_2 [style="solid"]; // Block0_2 [label="\ -// Block 2; (2, max 2)\nLiveIn: v5\l\ -// LiveOut: \l\nv5 := φ(\l\ -// Block 0 => v1,\l\ -// Block 1 => v4\l\ +// Block 2; (2, max 2)\nLiveIn: v7\l\ +// LiveOut: \l\nv7 := φ(\l\ +// Block 0 => v2,\l\ +// Block 1 => v6\l\ // )\l\ -// v6 := calldataload(v5)\l\ -// sstore(0, v6)\l\ +// v8 := calldataload(v7)\l\ +// v9 := 0\l\ +// sstore(v9, v8)\l\ // "]; // Block0_2Exit [label="MainExit"]; // Block0_2 -> Block0_2Exit; diff --git a/test/libyul/yulSSAControlFlowGraph/nested_for.yul b/test/libyul/yulSSAControlFlowGraph/nested_for.yul index f57a5ca29a5b..62e6e93b4622 100644 --- a/test/libyul/yulSSAControlFlowGraph/nested_for.yul +++ b/test/libyul/yulSSAControlFlowGraph/nested_for.yul @@ -33,20 +33,21 @@ // Block0_0Exit [label="Jump" shape=oval]; // Block0_0Exit -> Block0_1 [style="solid"]; // Block0_1 [label="\ -// Block 1; (1, max 24)\nLiveIn: v3\l\ -// LiveOut: v3\l\nv3 := φ(\l\ +// Block 1; (1, max 24)\nLiveIn: v4\l\ +// LiveOut: v4\l\nv4 := φ(\l\ // Block 0 => v1,\l\ -// Block 3 => v41\l\ +// Block 3 => v51\l\ // )\l\ -// v4 := lt(3, v3)\l\ +// v3 := 3\l\ +// v5 := lt(v3, v4)\l\ // "]; // Block0_1 -> Block0_1Exit; -// Block0_1Exit [label="{ If v4 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; +// Block0_1Exit [label="{ If v5 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; // Block0_1Exit:0 -> Block0_4 [style="solid"]; // Block0_1Exit:1 -> Block0_2 [style="solid"]; // Block0_2 [label="\ -// Block 2; (2, max 23)\nLiveIn: v3\l\ -// LiveOut: v3,v5\l\nv5 := 0\l\ +// Block 2; (2, max 23)\nLiveIn: v4\l\ +// LiveOut: v4,v6\l\nv6 := 0\l\ // "]; // Block0_2 -> Block0_2Exit [arrowhead=none]; // Block0_2Exit [label="Jump" shape=oval]; @@ -57,167 +58,176 @@ // Block0_4Exit [label="MainExit"]; // Block0_4 -> Block0_4Exit; // Block0_5 [label="\ -// Block 5; (3, max 23)\nLiveIn: v3,v6\l\ -// LiveOut: v3,v6\l\nv6 := φ(\l\ -// Block 2 => v5,\l\ -// Block 7 => v40\l\ +// Block 5; (3, max 23)\nLiveIn: v4,v8\l\ +// LiveOut: v4,v8\l\nv8 := φ(\l\ +// Block 2 => v6,\l\ +// Block 7 => v49\l\ // )\l\ -// v7 := lt(3, v6)\l\ +// v7 := 3\l\ +// v9 := lt(v7, v8)\l\ // "]; // Block0_5 -> Block0_5Exit; -// Block0_5Exit [label="{ If v7 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; +// Block0_5Exit [label="{ If v9 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; // Block0_5Exit:0 -> Block0_8 [style="solid"]; // Block0_5Exit:1 -> Block0_6 [style="solid"]; // Block0_6 [label="\ -// Block 6; (4, max 21)\nLiveIn: v3,v6\l\ -// LiveOut: v3,v6,v8\l\nv8 := 0\l\ +// Block 6; (4, max 21)\nLiveIn: v4,v8\l\ +// LiveOut: v4,v8,v10\l\nv10 := 0\l\ // "]; // Block0_6 -> Block0_6Exit [arrowhead=none]; // Block0_6Exit [label="Jump" shape=oval]; // Block0_6Exit -> Block0_9 [style="solid"]; // Block0_8 [label="\ -// Block 8; (22, max 23)\nLiveIn: v3\l\ -// LiveOut: v3\l\n"]; +// Block 8; (22, max 23)\nLiveIn: v4\l\ +// LiveOut: v4\l\n"]; // Block0_8 -> Block0_8Exit [arrowhead=none]; // Block0_8Exit [label="Jump" shape=oval]; // Block0_8Exit -> Block0_3 [style="solid"]; // Block0_9 [label="\ -// Block 9; (5, max 21)\nLiveIn: v3,v6,v9\l\ -// LiveOut: v3,v6,v9\l\nv9 := φ(\l\ -// Block 6 => v8,\l\ -// Block 11 => v36\l\ +// Block 9; (5, max 21)\nLiveIn: v4,v8,v12\l\ +// LiveOut: v4,v8,v12\l\nv12 := φ(\l\ +// Block 6 => v10,\l\ +// Block 11 => v44\l\ // )\l\ -// v10 := lt(3, v9)\l\ +// v11 := 3\l\ +// v13 := lt(v11, v12)\l\ // "]; // Block0_9 -> Block0_9Exit; -// Block0_9Exit [label="{ If v10 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; +// Block0_9Exit [label="{ If v13 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; // Block0_9Exit:0 -> Block0_12 [style="solid"]; // Block0_9Exit:1 -> Block0_10 [style="solid"]; // Block0_3 [label="\ -// Block 3; (23, max 23)\nLiveIn: v3\l\ -// LiveOut: v41\l\nv41 := add(1, v3)\l\ +// Block 3; (23, max 23)\nLiveIn: v4\l\ +// LiveOut: v51\l\nv50 := 1\l\ +// v51 := add(v50, v4)\l\ // "]; // Block0_3 -> Block0_3Exit [arrowhead=none]; // Block0_3Exit [label="Jump" shape=oval]; // Block0_3Exit -> Block0_1 [style="dashed"]; // Block0_10 [label="\ -// Block 10; (6, max 19)\nLiveIn: v3,v6,v9\l\ -// LiveOut: v3,v6,v9\l\n"]; +// Block 10; (6, max 19)\nLiveIn: v4,v8,v12\l\ +// LiveOut: v4,v8,v12\l\n"]; // Block0_10 -> Block0_10Exit; // Block0_10Exit [label="{ If 0 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; // Block0_10Exit:0 -> Block0_14 [style="solid"]; // Block0_10Exit:1 -> Block0_13 [style="solid"]; // Block0_12 [label="\ -// Block 12; (20, max 21)\nLiveIn: v3,v6\l\ -// LiveOut: v3,v6\l\n"]; +// Block 12; (20, max 21)\nLiveIn: v4,v8\l\ +// LiveOut: v4,v8\l\n"]; // Block0_12 -> Block0_12Exit [arrowhead=none]; // Block0_12Exit [label="Jump" shape=oval]; // Block0_12Exit -> Block0_7 [style="solid"]; // Block0_13 [label="\ -// Block 13; (7, max 19)\nLiveIn: v3,v6,v9\l\ -// LiveOut: v3,v6,v9,v11\l\nv11 := 0\l\ +// Block 13; (7, max 19)\nLiveIn: v4,v8,v12\l\ +// LiveOut: v4,v8,v12,v14\l\nv14 := 0\l\ // "]; // Block0_13 -> Block0_13Exit [arrowhead=none]; // Block0_13Exit [label="Jump" shape=oval]; // Block0_13Exit -> Block0_15 [style="solid"]; // Block0_14 [label="\ -// Block 14; (12, max 19)\nLiveIn: v3,v6,v9\l\ -// LiveOut: v3,v6,v9\l\n"]; +// Block 14; (12, max 19)\nLiveIn: v4,v8,v12\l\ +// LiveOut: v4,v8,v12\l\n"]; // Block0_14 -> Block0_14Exit; // Block0_14Exit [label="{ If 1 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; // Block0_14Exit:0 -> Block0_20 [style="solid"]; // Block0_14Exit:1 -> Block0_19 [style="solid"]; // Block0_7 [label="\ -// Block 7; (21, max 21)\nLiveIn: v3,v6\l\ -// LiveOut: v3,v40\l\nv40 := add(1, v6)\l\ +// Block 7; (21, max 21)\nLiveIn: v4,v8\l\ +// LiveOut: v4,v49\l\nv48 := 1\l\ +// v49 := add(v48, v8)\l\ // "]; // Block0_7 -> Block0_7Exit [arrowhead=none]; // Block0_7Exit [label="Jump" shape=oval]; // Block0_7Exit -> Block0_5 [style="dashed"]; // Block0_15 [label="\ -// Block 15; (8, max 19)\nLiveIn: v3,v6,v9,v12\l\ -// LiveOut: v3,v6,v9,v12\l\nv12 := φ(\l\ -// Block 13 => v11,\l\ -// Block 17 => v20\l\ +// Block 15; (8, max 19)\nLiveIn: v4,v8,v12,v16\l\ +// LiveOut: v4,v8,v12,v16\l\nv16 := φ(\l\ +// Block 13 => v14,\l\ +// Block 17 => v25\l\ // )\l\ -// v13 := lt(3, v12)\l\ +// v15 := 3\l\ +// v17 := lt(v15, v16)\l\ // "]; // Block0_15 -> Block0_15Exit; -// Block0_15Exit [label="{ If v13 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; +// Block0_15Exit [label="{ If v17 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; // Block0_15Exit:0 -> Block0_18 [style="solid"]; // Block0_15Exit:1 -> Block0_16 [style="solid"]; // Block0_19 [label="\ -// Block 19; (13, max 19)\nLiveIn: v3,v6,v9\l\ -// LiveOut: v3,v6,v9,v23\l\nv23 := 0\l\ +// Block 19; (13, max 19)\nLiveIn: v4,v8,v12\l\ +// LiveOut: v4,v8,v12,v28\l\nv28 := 0\l\ // "]; // Block0_19 -> Block0_19Exit [arrowhead=none]; // Block0_19Exit [label="Jump" shape=oval]; // Block0_19Exit -> Block0_21 [style="solid"]; // Block0_20 [label="\ -// Block 20; (18, max 19)\nLiveIn: v3,v6,v9\l\ -// LiveOut: v3,v6,v9\l\n"]; +// Block 20; (18, max 19)\nLiveIn: v4,v8,v12\l\ +// LiveOut: v4,v8,v12\l\n"]; // Block0_20 -> Block0_20Exit [arrowhead=none]; // Block0_20Exit [label="Jump" shape=oval]; // Block0_20Exit -> Block0_11 [style="solid"]; // Block0_16 [label="\ -// Block 16; (9, max 10)\nLiveIn: v3,v6,v9,v12\l\ -// LiveOut: v3,v6,v9,v12\l\nv17 := add(v6, v3)\l\ -// v18 := add(v9, v17)\l\ -// sstore(v18, v12)\l\ +// Block 16; (9, max 10)\nLiveIn: v4,v8,v12,v16\l\ +// LiveOut: v4,v8,v12,v16\l\nv21 := add(v8, v4)\l\ +// v22 := add(v12, v21)\l\ +// sstore(v22, v16)\l\ // "]; // Block0_16 -> Block0_16Exit [arrowhead=none]; // Block0_16Exit [label="Jump" shape=oval]; // Block0_16Exit -> Block0_17 [style="solid"]; // Block0_18 [label="\ -// Block 18; (11, max 19)\nLiveIn: v3,v6,v9\l\ -// LiveOut: v3,v6,v9\l\n"]; +// Block 18; (11, max 19)\nLiveIn: v4,v8,v12\l\ +// LiveOut: v4,v8,v12\l\n"]; // Block0_18 -> Block0_18Exit [arrowhead=none]; // Block0_18Exit [label="Jump" shape=oval]; // Block0_18Exit -> Block0_14 [style="solid"]; // Block0_21 [label="\ -// Block 21; (14, max 19)\nLiveIn: v3,v6,v9,v24\l\ -// LiveOut: v3,v6,v9,v24\l\nv24 := φ(\l\ -// Block 19 => v23,\l\ -// Block 23 => v31\l\ +// Block 21; (14, max 19)\nLiveIn: v4,v8,v12,v30\l\ +// LiveOut: v4,v8,v12,v30\l\nv30 := φ(\l\ +// Block 19 => v28,\l\ +// Block 23 => v38\l\ // )\l\ -// v25 := lt(3, v24)\l\ +// v29 := 3\l\ +// v31 := lt(v29, v30)\l\ // "]; // Block0_21 -> Block0_21Exit; -// Block0_21Exit [label="{ If v25 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; +// Block0_21Exit [label="{ If v31 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; // Block0_21Exit:0 -> Block0_24 [style="solid"]; // Block0_21Exit:1 -> Block0_22 [style="solid"]; // Block0_11 [label="\ -// Block 11; (19, max 19)\nLiveIn: v3,v6,v9\l\ -// LiveOut: v3,v6,v36\l\nv36 := add(1, v9)\l\ +// Block 11; (19, max 19)\nLiveIn: v4,v8,v12\l\ +// LiveOut: v4,v8,v44\l\nv42 := 1\l\ +// v44 := add(v42, v12)\l\ // "]; // Block0_11 -> Block0_11Exit [arrowhead=none]; // Block0_11Exit [label="Jump" shape=oval]; // Block0_11Exit -> Block0_9 [style="dashed"]; // Block0_17 [label="\ -// Block 17; (10, max 10)\nLiveIn: v3,v6,v9,v12\l\ -// LiveOut: v3,v6,v9,v20\l\nv20 := add(1, v12)\l\ +// Block 17; (10, max 10)\nLiveIn: v4,v8,v12,v16\l\ +// LiveOut: v4,v8,v12,v25\l\nv24 := 1\l\ +// v25 := add(v24, v16)\l\ // "]; // Block0_17 -> Block0_17Exit [arrowhead=none]; // Block0_17Exit [label="Jump" shape=oval]; // Block0_17Exit -> Block0_15 [style="dashed"]; // Block0_22 [label="\ -// Block 22; (15, max 16)\nLiveIn: v3,v6,v9,v24\l\ -// LiveOut: v3,v6,v9,v24\l\nv29 := add(v6, v3)\l\ -// v30 := add(v9, v29)\l\ -// sstore(v30, v24)\l\ +// Block 22; (15, max 16)\nLiveIn: v4,v8,v12,v30\l\ +// LiveOut: v4,v8,v12,v30\l\nv35 := add(v8, v4)\l\ +// v36 := add(v12, v35)\l\ +// sstore(v36, v30)\l\ // "]; // Block0_22 -> Block0_22Exit [arrowhead=none]; // Block0_22Exit [label="Jump" shape=oval]; // Block0_22Exit -> Block0_23 [style="solid"]; // Block0_24 [label="\ -// Block 24; (17, max 19)\nLiveIn: v3,v6,v9\l\ -// LiveOut: v3,v6,v9\l\n"]; +// Block 24; (17, max 19)\nLiveIn: v4,v8,v12\l\ +// LiveOut: v4,v8,v12\l\n"]; // Block0_24 -> Block0_24Exit [arrowhead=none]; // Block0_24Exit [label="Jump" shape=oval]; // Block0_24Exit -> Block0_20 [style="solid"]; // Block0_23 [label="\ -// Block 23; (16, max 16)\nLiveIn: v3,v6,v9,v24\l\ -// LiveOut: v3,v6,v9,v31\l\nv31 := add(1, v24)\l\ +// Block 23; (16, max 16)\nLiveIn: v4,v8,v12,v30\l\ +// LiveOut: v4,v8,v12,v38\l\nv37 := 1\l\ +// v38 := add(v37, v30)\l\ // "]; // Block0_23 -> Block0_23Exit [arrowhead=none]; // Block0_23Exit [label="Jump" shape=oval]; diff --git a/test/libyul/yulSSAControlFlowGraph/nested_function.yul b/test/libyul/yulSSAControlFlowGraph/nested_function.yul index 037e1f006c45..ac3a0be756f9 100644 --- a/test/libyul/yulSSAControlFlowGraph/nested_function.yul +++ b/test/libyul/yulSSAControlFlowGraph/nested_function.yul @@ -57,10 +57,11 @@ // FunctionEntry_g_0 -> Block2_0; // Block2_0 [label="\ // Block 0; (0, max 0)\nLiveIn: \l\ -// LiveOut: \l\nv1 := v()\l\ -// v2 := f(2, v1)\l\ -// v3 := z()\l\ -// sstore(v2, v3)\l\ +// LiveOut: \l\nv1 := 2\l\ +// v2 := v()\l\ +// v3 := f(v1, v2)\l\ +// v4 := z()\l\ +// sstore(v3, v4)\l\ // "]; // Block2_0Exit [label="FunctionReturn[]"]; // Block2_0 -> Block2_0Exit; @@ -105,53 +106,55 @@ // FunctionEntry_cycle1_0 -> Block7_0; // Block7_0 [label="\ // Block 0; (0, max 2)\nLiveIn: \l\ -// LiveOut: \l\nv2 := mload(3)\l\ +// LiveOut: \l\nv2 := 3\l\ +// v3 := mload(v2)\l\ // "]; // Block7_0 -> Block7_0Exit; -// Block7_0Exit [label="{ If v2 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; +// Block7_0Exit [label="{ If v3 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; // Block7_0Exit:0 -> Block7_2 [style="solid"]; // Block7_0Exit:1 -> Block7_1 [style="solid"]; // Block7_1 [label="\ // Block 1; (1, max 2)\nLiveIn: \l\ -// LiveOut: v3\l\nv3 := cycle2()\l\ +// LiveOut: v4\l\nv4 := cycle2()\l\ // "]; // Block7_1 -> Block7_1Exit [arrowhead=none]; // Block7_1Exit [label="Jump" shape=oval]; // Block7_1Exit -> Block7_2 [style="solid"]; // Block7_2 [label="\ -// Block 2; (2, max 2)\nLiveIn: v4\l\ -// LiveOut: v4\l\nv4 := φ(\l\ +// Block 2; (2, max 2)\nLiveIn: v5\l\ +// LiveOut: v5\l\nv5 := φ(\l\ // Block 0 => 0,\l\ -// Block 1 => v3\l\ +// Block 1 => v4\l\ // )\l\ // "]; -// Block7_2Exit [label="FunctionReturn[v4]"]; +// Block7_2Exit [label="FunctionReturn[v5]"]; // Block7_2 -> Block7_2Exit; // FunctionEntry_cycle2_0 [label="function cycle2: // r := cycle2()"]; // FunctionEntry_cycle2_0 -> Block8_0; // Block8_0 [label="\ // Block 0; (0, max 2)\nLiveIn: \l\ -// LiveOut: \l\nv2 := mload(4)\l\ +// LiveOut: \l\nv2 := 4\l\ +// v3 := mload(v2)\l\ // "]; // Block8_0 -> Block8_0Exit; -// Block8_0Exit [label="{ If v2 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; +// Block8_0Exit [label="{ If v3 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; // Block8_0Exit:0 -> Block8_2 [style="solid"]; // Block8_0Exit:1 -> Block8_1 [style="solid"]; // Block8_1 [label="\ // Block 1; (1, max 2)\nLiveIn: \l\ -// LiveOut: v3\l\nv3 := cycle1()\l\ +// LiveOut: v4\l\nv4 := cycle1()\l\ // "]; // Block8_1 -> Block8_1Exit [arrowhead=none]; // Block8_1Exit [label="Jump" shape=oval]; // Block8_1Exit -> Block8_2 [style="solid"]; // Block8_2 [label="\ -// Block 2; (2, max 2)\nLiveIn: v4\l\ -// LiveOut: v4\l\nv4 := φ(\l\ +// Block 2; (2, max 2)\nLiveIn: v5\l\ +// LiveOut: v5\l\nv5 := φ(\l\ // Block 0 => 0,\l\ -// Block 1 => v3\l\ +// Block 1 => v4\l\ // )\l\ // "]; -// Block8_2Exit [label="FunctionReturn[v4]"]; +// Block8_2Exit [label="FunctionReturn[v5]"]; // Block8_2 -> Block8_2Exit; // } diff --git a/test/libyul/yulSSAControlFlowGraph/switch.yul b/test/libyul/yulSSAControlFlowGraph/switch.yul index 10573b012298..8c7fea75e4b6 100644 --- a/test/libyul/yulSSAControlFlowGraph/switch.yul +++ b/test/libyul/yulSSAControlFlowGraph/switch.yul @@ -23,50 +23,56 @@ // Entry0 -> Block0_0; // Block0_0 [label="\ // Block 0; (0, max 5)\nLiveIn: \l\ -// LiveOut: v3\l\nv1 := calldataload(3)\l\ -// v3 := sload(0)\l\ -// v4 := eq(0, v3)\l\ +// LiveOut: v5\l\nv1 := 3\l\ +// v2 := calldataload(v1)\l\ +// v4 := 0\l\ +// v5 := sload(v4)\l\ +// v6 := eq(0, v5)\l\ // "]; // Block0_0 -> Block0_0Exit; -// Block0_0Exit [label="{ If v4 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; +// Block0_0Exit [label="{ If v6 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; // Block0_0Exit:0 -> Block0_3 [style="solid"]; // Block0_0Exit:1 -> Block0_2 [style="solid"]; // Block0_2 [label="\ // Block 2; (1, max 2)\nLiveIn: \l\ -// LiveOut: v6\l\nv6 := calldataload(77)\l\ +// LiveOut: v9\l\nv8 := 77\l\ +// v9 := calldataload(v8)\l\ // "]; // Block0_2 -> Block0_2Exit [arrowhead=none]; // Block0_2Exit [label="Jump" shape=oval]; // Block0_2Exit -> Block0_1 [style="solid"]; // Block0_3 [label="\ -// Block 3; (3, max 5)\nLiveIn: v3\l\ -// LiveOut: \l\nv7 := eq(1, v3)\l\ +// Block 3; (3, max 5)\nLiveIn: v5\l\ +// LiveOut: \l\nv10 := eq(1, v5)\l\ // "]; // Block0_3 -> Block0_3Exit; -// Block0_3Exit [label="{ If v7 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; +// Block0_3Exit [label="{ If v10 | { <0> Zero | <1> NonZero }}" shape=Mrecord]; // Block0_3Exit:0 -> Block0_5 [style="solid"]; // Block0_3Exit:1 -> Block0_4 [style="solid"]; // Block0_1 [label="\ -// Block 1; (2, max 2)\nLiveIn: v13\l\ -// LiveOut: \l\nv13 := φ(\l\ -// Block 2 => v6,\l\ -// Block 4 => v10,\l\ -// Block 5 => v12\l\ +// Block 1; (2, max 2)\nLiveIn: v19\l\ +// LiveOut: \l\nv19 := φ(\l\ +// Block 2 => v9,\l\ +// Block 4 => v14,\l\ +// Block 5 => v17\l\ // )\l\ -// sstore(0, v13)\l\ +// v18 := 0\l\ +// sstore(v18, v19)\l\ // "]; // Block0_1Exit [label="MainExit"]; // Block0_1 -> Block0_1Exit; // Block0_4 [label="\ // Block 4; (4, max 4)\nLiveIn: \l\ -// LiveOut: v10\l\nv10 := calldataload(88)\l\ +// LiveOut: v14\l\nv13 := 88\l\ +// v14 := calldataload(v13)\l\ // "]; // Block0_4 -> Block0_4Exit [arrowhead=none]; // Block0_4Exit [label="Jump" shape=oval]; // Block0_4Exit -> Block0_1 [style="solid"]; // Block0_5 [label="\ // Block 5; (5, max 5)\nLiveIn: \l\ -// LiveOut: v12\l\nv12 := calldataload(99)\l\ +// LiveOut: v17\l\nv16 := 99\l\ +// v17 := calldataload(v16)\l\ // "]; // Block0_5 -> Block0_5Exit [arrowhead=none]; // Block0_5Exit [label="Jump" shape=oval];