From f6f0d6a3602ba2c83ecfd7608fb9a27c20835eb2 Mon Sep 17 00:00:00 2001 From: Nikola Matic Date: Wed, 10 Aug 2022 15:57:01 +0200 Subject: [PATCH] Make hardcoded parts of the optimizer sequence configurable --- libsolidity/codegen/CompilerContext.cpp | 1 + libsolidity/interface/OptimiserSettings.h | 7 ++++ libsolidity/interface/StandardCompiler.cpp | 11 +++-- libyul/YulStack.cpp | 1 + libyul/optimiser/Suite.cpp | 11 ++++- libyul/optimiser/Suite.h | 3 +- solc/CommandLineParser.cpp | 9 +++- .../args | 1 + .../in.sol | 6 +++ .../input.json | 16 +++++++ .../output.json | 12 ++++++ .../args | 1 + .../in.sol | 6 +++ .../input.json | 16 +++++++ .../output.json | 12 ++++++ .../args | 1 + .../in.sol | 6 +++ .../input.json | 16 +++++++ .../output.json | 9 ++++ .../args | 1 + .../in.sol | 6 +++ .../input.json | 16 +++++++ .../output.json | 9 ++++ .../args | 1 + .../in.sol | 6 +++ .../input.json | 16 +++++++ .../output.json | 9 ++++ .../args | 1 + .../in.sol | 6 +++ .../input.json | 16 +++++++ .../output.json | 9 ++++ .../args | 1 + .../err | 1 + .../exit | 1 + .../input.sol | 7 ++++ .../args | 1 + .../err | 1 + .../exit | 1 + .../input.sol | 7 ++++ .../yul_optimizer_steps_short_sequence/args | 1 + .../input.sol | 12 ++++++ .../yul_optimizer_steps_short_sequence/output | 24 +++++++++++ .../args | 1 + .../input.sol | 8 ++++ .../output | 34 +++++++++++++++ .../args | 1 + .../input.sol | 12 ++++++ .../output | 24 +++++++++++ .../args | 1 + .../input.sol | 12 ++++++ .../output | 24 +++++++++++ .../args | 1 + .../input.sol | 8 ++++ .../output | 42 +++++++++++++++++++ test/libyul/YulOptimizerTestCommon.cpp | 1 + 55 files changed, 461 insertions(+), 6 deletions(-) create mode 100644 test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_invalid_nested_delimiter/args create mode 100644 test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_invalid_nested_delimiter/in.sol create mode 100644 test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_invalid_nested_delimiter/input.json create mode 100644 test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_invalid_nested_delimiter/output.json create mode 100644 test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_mutliple_delimiters/args create mode 100644 test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_mutliple_delimiters/in.sol create mode 100644 test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_mutliple_delimiters/input.json create mode 100644 test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_mutliple_delimiters/output.json create mode 100644 test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_cleanup_sequence/args create mode 100644 test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_cleanup_sequence/in.sol create mode 100644 test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_cleanup_sequence/input.json create mode 100644 test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_cleanup_sequence/output.json create mode 100644 test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_cleanup_sequence/args create mode 100644 test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_cleanup_sequence/in.sol create mode 100644 test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_cleanup_sequence/input.json create mode 100644 test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_cleanup_sequence/output.json create mode 100644 test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_optimisation_sequence/args create mode 100644 test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_optimisation_sequence/in.sol create mode 100644 test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_optimisation_sequence/input.json create mode 100644 test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_optimisation_sequence/output.json create mode 100644 test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_sequence/args create mode 100644 test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_sequence/in.sol create mode 100644 test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_sequence/input.json create mode 100644 test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_sequence/output.json create mode 100644 test/cmdlineTests/yul_optimizer_steps_invalid_nested_delimiter/args create mode 100644 test/cmdlineTests/yul_optimizer_steps_invalid_nested_delimiter/err create mode 100644 test/cmdlineTests/yul_optimizer_steps_invalid_nested_delimiter/exit create mode 100644 test/cmdlineTests/yul_optimizer_steps_invalid_nested_delimiter/input.sol create mode 100644 test/cmdlineTests/yul_optimizer_steps_multiple_delimiters/args create mode 100644 test/cmdlineTests/yul_optimizer_steps_multiple_delimiters/err create mode 100644 test/cmdlineTests/yul_optimizer_steps_multiple_delimiters/exit create mode 100644 test/cmdlineTests/yul_optimizer_steps_multiple_delimiters/input.sol create mode 100644 test/cmdlineTests/yul_optimizer_steps_short_sequence/args create mode 100644 test/cmdlineTests/yul_optimizer_steps_short_sequence/input.sol create mode 100644 test/cmdlineTests/yul_optimizer_steps_short_sequence/output create mode 100644 test/cmdlineTests/yul_optimizer_steps_with_cleanup_sequence/args create mode 100644 test/cmdlineTests/yul_optimizer_steps_with_cleanup_sequence/input.sol create mode 100644 test/cmdlineTests/yul_optimizer_steps_with_cleanup_sequence/output create mode 100644 test/cmdlineTests/yul_optimizer_steps_with_empty_cleanup_sequence/args create mode 100644 test/cmdlineTests/yul_optimizer_steps_with_empty_cleanup_sequence/input.sol create mode 100644 test/cmdlineTests/yul_optimizer_steps_with_empty_cleanup_sequence/output create mode 100644 test/cmdlineTests/yul_optimizer_steps_with_empty_optimization_sequence/args create mode 100644 test/cmdlineTests/yul_optimizer_steps_with_empty_optimization_sequence/input.sol create mode 100644 test/cmdlineTests/yul_optimizer_steps_with_empty_optimization_sequence/output create mode 100644 test/cmdlineTests/yul_optimizer_steps_with_empty_sequences/args create mode 100644 test/cmdlineTests/yul_optimizer_steps_with_empty_sequences/input.sol create mode 100644 test/cmdlineTests/yul_optimizer_steps_with_empty_sequences/output diff --git a/libsolidity/codegen/CompilerContext.cpp b/libsolidity/codegen/CompilerContext.cpp index f1cc5b6dd..948502e69 100644 --- a/libsolidity/codegen/CompilerContext.cpp +++ b/libsolidity/codegen/CompilerContext.cpp @@ -547,6 +547,7 @@ void CompilerContext::optimizeYul(yul::Object& _object, yul::EVMDialect const& _ _object, _optimiserSettings.optimizeStackAllocation, _optimiserSettings.yulOptimiserSteps, + _optimiserSettings.yulOptimiserCleanupSteps, isCreation? nullopt : make_optional(_optimiserSettings.expectedExecutionsPerDeployment), _externalIdentifiers ); diff --git a/libsolidity/interface/OptimiserSettings.h b/libsolidity/interface/OptimiserSettings.h index e233048c1..82324d3f7 100644 --- a/libsolidity/interface/OptimiserSettings.h +++ b/libsolidity/interface/OptimiserSettings.h @@ -59,6 +59,8 @@ struct OptimiserSettings "]" "jmul[jul] VcTOcul jmul"; // Make source short and pretty + static char constexpr DefaultYulOptimiserCleanupSteps[] = "fDnTOc"; + /// No optimisations at all - not recommended. static OptimiserSettings none() { @@ -146,6 +148,11 @@ struct OptimiserSettings /// them just by setting this to an empty string. Set @a runYulOptimiser to false if you want /// no optimisations. std::string yulOptimiserSteps = DefaultYulOptimiserSteps; + /// Sequence of clean up optimisation steps after the above (default or user supplied) set of + /// optimisation steps is completed. Note that if the string is left empty, there will still + /// be hard-coded optimisation steps that will run regardless. Set @a runYulOptimiser to false + /// if you want no optimisations. + std::string yulOptimiserCleanupSteps = DefaultYulOptimiserCleanupSteps; /// This specifies an estimate on how often each opcode in this assembly will be executed, /// i.e. use a small value to optimise for size and a large value to optimise for runtime gas usage. size_t expectedExecutionsPerDeployment = 200; diff --git a/libsolidity/interface/StandardCompiler.cpp b/libsolidity/interface/StandardCompiler.cpp index c6cd741c1..7ccb71d78 100644 --- a/libsolidity/interface/StandardCompiler.cpp +++ b/libsolidity/interface/StandardCompiler.cpp @@ -472,7 +472,7 @@ std::optional checkOptimizerDetail(Json::Value const& _details, std return {}; } -std::optional checkOptimizerDetailSteps(Json::Value const& _details, std::string const& _name, string& _setting) +std::optional checkOptimizerDetailSteps(Json::Value const& _details, std::string const& _name, string& _optimiserSetting, string& _cleanupSetting) { if (_details.isMember(_name)) { @@ -490,7 +490,12 @@ std::optional checkOptimizerDetailSteps(Json::Value const& _details ); } - _setting = _details[_name].asString(); + std::string const fullSequence = _details[_name].asString(); + auto const delimiterPos = fullSequence.find(":"); + _optimiserSetting = fullSequence.substr(0, delimiterPos); + + if (delimiterPos != string::npos) + _cleanupSetting = fullSequence.substr(delimiterPos + 1); } else return formatFatalError("JSONError", "\"settings.optimizer.details." + _name + "\" must be a string"); @@ -616,7 +621,7 @@ std::variant parseOptimizerSettings(Json::Value return *result; if (auto error = checkOptimizerDetail(details["yulDetails"], "stackAllocation", settings.optimizeStackAllocation)) return *error; - if (auto error = checkOptimizerDetailSteps(details["yulDetails"], "optimizerSteps", settings.yulOptimiserSteps)) + if (auto error = checkOptimizerDetailSteps(details["yulDetails"], "optimizerSteps", settings.yulOptimiserSteps, settings.yulOptimiserCleanupSteps)) return *error; } } diff --git a/libyul/YulStack.cpp b/libyul/YulStack.cpp index 3bca7288c..7553ee469 100644 --- a/libyul/YulStack.cpp +++ b/libyul/YulStack.cpp @@ -209,6 +209,7 @@ void YulStack::optimize(Object& _object, bool _isCreation) _object, m_optimiserSettings.optimizeStackAllocation, m_optimiserSettings.yulOptimiserSteps, + m_optimiserSettings.yulOptimiserCleanupSteps, _isCreation ? nullopt : make_optional(m_optimiserSettings.expectedExecutionsPerDeployment), {} ); diff --git a/libyul/optimiser/Suite.cpp b/libyul/optimiser/Suite.cpp index 181c9bdcb..ae32b25c3 100644 --- a/libyul/optimiser/Suite.cpp +++ b/libyul/optimiser/Suite.cpp @@ -93,6 +93,7 @@ void OptimiserSuite::run( Object& _object, bool _optimizeStackAllocation, string_view _optimisationSequence, + string_view _optimisationCleanupSequence, optional _expectedExecutionsPerDeployment, set const& _externallyUsedIdentifiers ) @@ -139,7 +140,10 @@ void OptimiserSuite::run( _optimizeStackAllocation, stackCompressorMaxIterations ); - suite.runSequence("fDnTOc g", ast); + + // Run the user supplied (otherwise default) clean up sequence + suite.runSequence(_optimisationCleanupSequence, ast); + suite.runSequence("g", ast); if (evmDialect) { @@ -296,6 +300,7 @@ map const& OptimiserSuite::stepAbbreviationToNameMap() void OptimiserSuite::validateSequence(string_view _stepAbbreviations) { int8_t nestingLevel = 0; + int8_t colonDelimiters = 0; for (char abbreviation: _stepAbbreviations) switch (abbreviation) { @@ -310,6 +315,10 @@ void OptimiserSuite::validateSequence(string_view _stepAbbreviations) nestingLevel--; assertThrow(nestingLevel >= 0, OptimizerException, "Unbalanced brackets"); break; + case ':': + assertThrow(nestingLevel == 0, OptimizerException, "Cleanup delimiter may only be placed at nesting level zero"); + assertThrow(++colonDelimiters <=1, OptimizerException, "Too many colon delimiters"); + break; default: { yulAssert( diff --git a/libyul/optimiser/Suite.h b/libyul/optimiser/Suite.h index 3c85fc559..2db6288c0 100644 --- a/libyul/optimiser/Suite.h +++ b/libyul/optimiser/Suite.h @@ -51,7 +51,7 @@ public: /// Special characters that do not represent optimiser steps but are allowed in abbreviation sequences. /// Some of them (like whitespace) are ignored, others (like brackets) are a part of the syntax. - static constexpr char NonStepAbbreviations[] = " \n[]"; + static constexpr char NonStepAbbreviations[] = " \n[]:"; enum class Debug { @@ -68,6 +68,7 @@ public: Object& _object, bool _optimizeStackAllocation, std::string_view _optimisationSequence, + std::string_view _optimisationCleanupSequence, std::optional _expectedExecutionsPerDeployment, std::set const& _externallyUsedIdentifiers = {} ); diff --git a/solc/CommandLineParser.cpp b/solc/CommandLineParser.cpp index 2c765d0e3..ce2d4d044 100644 --- a/solc/CommandLineParser.cpp +++ b/solc/CommandLineParser.cpp @@ -266,7 +266,14 @@ OptimiserSettings CommandLineOptions::optimiserSettings() const settings.expectedExecutionsPerDeployment = optimizer.expectedExecutionsPerDeployment.value(); if (optimizer.yulSteps.has_value()) - settings.yulOptimiserSteps = optimizer.yulSteps.value(); + { + std::string const fullSequence = optimizer.yulSteps.value(); + auto const delimiterPos = fullSequence.find(":"); + settings.yulOptimiserSteps = fullSequence.substr(0, delimiterPos); + + if (delimiterPos != string::npos) + settings.yulOptimiserCleanupSteps = fullSequence.substr(delimiterPos + 1); + } return settings; } diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_invalid_nested_delimiter/args b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_invalid_nested_delimiter/args new file mode 100644 index 000000000..a905f1fe6 --- /dev/null +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_invalid_nested_delimiter/args @@ -0,0 +1 @@ +--pretty-json --json-indent 4 diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_invalid_nested_delimiter/in.sol b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_invalid_nested_delimiter/in.sol new file mode 100644 index 000000000..9e5350072 --- /dev/null +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_invalid_nested_delimiter/in.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.0; + +contract C { + function f() public pure {} +} diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_invalid_nested_delimiter/input.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_invalid_nested_delimiter/input.json new file mode 100644 index 000000000..5be769f76 --- /dev/null +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_invalid_nested_delimiter/input.json @@ -0,0 +1,16 @@ +{ + "language": "Solidity", + "sources": { + "A": {"urls": ["standard_optimizer_yulDetails_optimiserSteps_invalid_nested_delimiter/in.sol"]} + }, + "settings": { + "optimizer": { + "details": { + "yul": true, + "yulDetails": { + "optimizerSteps": "dhfoDgvulfnTUtnIf\n[ xar:rscLM\n]\njmuljuljul VcTOcul jmul" + } + } + } + } +} diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_invalid_nested_delimiter/output.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_invalid_nested_delimiter/output.json new file mode 100644 index 000000000..41c8a307f --- /dev/null +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_invalid_nested_delimiter/output.json @@ -0,0 +1,12 @@ +{ + "errors": + [ + { + "component": "general", + "formattedMessage": "Invalid optimizer step sequence in \"settings.optimizer.details.optimizerSteps\": Cleanup delimiter may only be placed at nesting level zero", + "message": "Invalid optimizer step sequence in \"settings.optimizer.details.optimizerSteps\": Cleanup delimiter may only be placed at nesting level zero", + "severity": "error", + "type": "JSONError" + } + ] +} diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_mutliple_delimiters/args b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_mutliple_delimiters/args new file mode 100644 index 000000000..a905f1fe6 --- /dev/null +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_mutliple_delimiters/args @@ -0,0 +1 @@ +--pretty-json --json-indent 4 diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_mutliple_delimiters/in.sol b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_mutliple_delimiters/in.sol new file mode 100644 index 000000000..9e5350072 --- /dev/null +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_mutliple_delimiters/in.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.0; + +contract C { + function f() public pure {} +} diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_mutliple_delimiters/input.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_mutliple_delimiters/input.json new file mode 100644 index 000000000..0bddd9d9d --- /dev/null +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_mutliple_delimiters/input.json @@ -0,0 +1,16 @@ +{ + "language": "Solidity", + "sources": { + "A": {"urls": ["standard_optimizer_yulDetails_optimiserSteps_mutliple_delimiters/in.sol"]} + }, + "settings": { + "optimizer": { + "details": { + "yul": true, + "yulDetails": { + "optimizerSteps": "dhfoDgvu:lfnTUtnIf\n[ xarrscLM\n]\njmuljulj:ul VcTOcul jmul" + } + } + } + } +} diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_mutliple_delimiters/output.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_mutliple_delimiters/output.json new file mode 100644 index 000000000..b6778a492 --- /dev/null +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_mutliple_delimiters/output.json @@ -0,0 +1,12 @@ +{ + "errors": + [ + { + "component": "general", + "formattedMessage": "Invalid optimizer step sequence in \"settings.optimizer.details.optimizerSteps\": Too many colon delimiters", + "message": "Invalid optimizer step sequence in \"settings.optimizer.details.optimizerSteps\": Too many colon delimiters", + "severity": "error", + "type": "JSONError" + } + ] +} diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_cleanup_sequence/args b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_cleanup_sequence/args new file mode 100644 index 000000000..a905f1fe6 --- /dev/null +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_cleanup_sequence/args @@ -0,0 +1 @@ +--pretty-json --json-indent 4 diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_cleanup_sequence/in.sol b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_cleanup_sequence/in.sol new file mode 100644 index 000000000..9e5350072 --- /dev/null +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_cleanup_sequence/in.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.0; + +contract C { + function f() public pure {} +} diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_cleanup_sequence/input.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_cleanup_sequence/input.json new file mode 100644 index 000000000..b557a9662 --- /dev/null +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_cleanup_sequence/input.json @@ -0,0 +1,16 @@ +{ + "language": "Solidity", + "sources": { + "A": {"urls": ["standard_optimizer_yulDetails_optimiserSteps_with_cleanup_sequence/in.sol"]} + }, + "settings": { + "optimizer": { + "details": { + "yul": true, + "yulDetails": { + "optimizerSteps": "dhfoDgvulfnTUtnIf\n[ xarrscLM\n]\njmuljuljul VcTOcul jmul:fDnTOc" + } + } + } + } +} diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_cleanup_sequence/output.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_cleanup_sequence/output.json new file mode 100644 index 000000000..acf3b74ef --- /dev/null +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_cleanup_sequence/output.json @@ -0,0 +1,9 @@ +{ + "sources": + { + "A": + { + "id": 0 + } + } +} diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_cleanup_sequence/args b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_cleanup_sequence/args new file mode 100644 index 000000000..a905f1fe6 --- /dev/null +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_cleanup_sequence/args @@ -0,0 +1 @@ +--pretty-json --json-indent 4 diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_cleanup_sequence/in.sol b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_cleanup_sequence/in.sol new file mode 100644 index 000000000..9e5350072 --- /dev/null +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_cleanup_sequence/in.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.0; + +contract C { + function f() public pure {} +} diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_cleanup_sequence/input.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_cleanup_sequence/input.json new file mode 100644 index 000000000..0903ccfeb --- /dev/null +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_cleanup_sequence/input.json @@ -0,0 +1,16 @@ +{ + "language": "Solidity", + "sources": { + "A": {"urls": ["standard_optimizer_yulDetails_optimiserSteps_with_cleanup_sequence/in.sol"]} + }, + "settings": { + "optimizer": { + "details": { + "yul": true, + "yulDetails": { + "optimizerSteps": "dhfoDgvulfnTUtnIf\n[ xarrscLM\n]\njmuljuljul VcTOcul jmul:" + } + } + } + } +} diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_cleanup_sequence/output.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_cleanup_sequence/output.json new file mode 100644 index 000000000..acf3b74ef --- /dev/null +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_cleanup_sequence/output.json @@ -0,0 +1,9 @@ +{ + "sources": + { + "A": + { + "id": 0 + } + } +} diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_optimisation_sequence/args b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_optimisation_sequence/args new file mode 100644 index 000000000..a905f1fe6 --- /dev/null +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_optimisation_sequence/args @@ -0,0 +1 @@ +--pretty-json --json-indent 4 diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_optimisation_sequence/in.sol b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_optimisation_sequence/in.sol new file mode 100644 index 000000000..9e5350072 --- /dev/null +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_optimisation_sequence/in.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.0; + +contract C { + function f() public pure {} +} diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_optimisation_sequence/input.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_optimisation_sequence/input.json new file mode 100644 index 000000000..4086aff9f --- /dev/null +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_optimisation_sequence/input.json @@ -0,0 +1,16 @@ +{ + "language": "Solidity", + "sources": { + "A": {"urls": ["standard_optimizer_yulDetails_optimiserSteps_with_cleanup_sequence/in.sol"]} + }, + "settings": { + "optimizer": { + "details": { + "yul": true, + "yulDetails": { + "optimizerSteps": ":dhfoDgvulfnTUtnIf\n[ xarrscLM\n]\njmuljuljul VcTOcul jmul" + } + } + } + } +} diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_optimisation_sequence/output.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_optimisation_sequence/output.json new file mode 100644 index 000000000..acf3b74ef --- /dev/null +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_optimisation_sequence/output.json @@ -0,0 +1,9 @@ +{ + "sources": + { + "A": + { + "id": 0 + } + } +} diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_sequence/args b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_sequence/args new file mode 100644 index 000000000..a905f1fe6 --- /dev/null +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_sequence/args @@ -0,0 +1 @@ +--pretty-json --json-indent 4 diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_sequence/in.sol b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_sequence/in.sol new file mode 100644 index 000000000..9e5350072 --- /dev/null +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_sequence/in.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.0; + +contract C { + function f() public pure {} +} diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_sequence/input.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_sequence/input.json new file mode 100644 index 000000000..4f6668222 --- /dev/null +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_sequence/input.json @@ -0,0 +1,16 @@ +{ + "language": "Solidity", + "sources": { + "A": {"urls": ["standard_optimizer_yulDetails_optimiserSteps_with_cleanup_sequence/in.sol"]} + }, + "settings": { + "optimizer": { + "details": { + "yul": true, + "yulDetails": { + "optimizerSteps": ":" + } + } + } + } +} diff --git a/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_sequence/output.json b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_sequence/output.json new file mode 100644 index 000000000..acf3b74ef --- /dev/null +++ b/test/cmdlineTests/standard_optimizer_yulDetails_optimiserSteps_with_empty_sequence/output.json @@ -0,0 +1,9 @@ +{ + "sources": + { + "A": + { + "id": 0 + } + } +} diff --git a/test/cmdlineTests/yul_optimizer_steps_invalid_nested_delimiter/args b/test/cmdlineTests/yul_optimizer_steps_invalid_nested_delimiter/args new file mode 100644 index 000000000..c7bdc6563 --- /dev/null +++ b/test/cmdlineTests/yul_optimizer_steps_invalid_nested_delimiter/args @@ -0,0 +1 @@ +--ir-optimized --optimize --yul-optimizations dhfo[Dg:vu]lfnTUtnIf diff --git a/test/cmdlineTests/yul_optimizer_steps_invalid_nested_delimiter/err b/test/cmdlineTests/yul_optimizer_steps_invalid_nested_delimiter/err new file mode 100644 index 000000000..cb7b570f1 --- /dev/null +++ b/test/cmdlineTests/yul_optimizer_steps_invalid_nested_delimiter/err @@ -0,0 +1 @@ +Invalid optimizer step sequence in --yul-optimizations: Cleanup delimiter may only be placed at nesting level zero diff --git a/test/cmdlineTests/yul_optimizer_steps_invalid_nested_delimiter/exit b/test/cmdlineTests/yul_optimizer_steps_invalid_nested_delimiter/exit new file mode 100644 index 000000000..d00491fd7 --- /dev/null +++ b/test/cmdlineTests/yul_optimizer_steps_invalid_nested_delimiter/exit @@ -0,0 +1 @@ +1 diff --git a/test/cmdlineTests/yul_optimizer_steps_invalid_nested_delimiter/input.sol b/test/cmdlineTests/yul_optimizer_steps_invalid_nested_delimiter/input.sol new file mode 100644 index 000000000..0279d3b7d --- /dev/null +++ b/test/cmdlineTests/yul_optimizer_steps_invalid_nested_delimiter/input.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.0; + +contract C +{ + function f() public pure {} +} diff --git a/test/cmdlineTests/yul_optimizer_steps_multiple_delimiters/args b/test/cmdlineTests/yul_optimizer_steps_multiple_delimiters/args new file mode 100644 index 000000000..4214dbbd1 --- /dev/null +++ b/test/cmdlineTests/yul_optimizer_steps_multiple_delimiters/args @@ -0,0 +1 @@ +--ir-optimized --optimize --yul-optimizations dhfoDg:vulfn:TUtnIf diff --git a/test/cmdlineTests/yul_optimizer_steps_multiple_delimiters/err b/test/cmdlineTests/yul_optimizer_steps_multiple_delimiters/err new file mode 100644 index 000000000..70b1b2c21 --- /dev/null +++ b/test/cmdlineTests/yul_optimizer_steps_multiple_delimiters/err @@ -0,0 +1 @@ +Invalid optimizer step sequence in --yul-optimizations: Too many colon delimiters diff --git a/test/cmdlineTests/yul_optimizer_steps_multiple_delimiters/exit b/test/cmdlineTests/yul_optimizer_steps_multiple_delimiters/exit new file mode 100644 index 000000000..d00491fd7 --- /dev/null +++ b/test/cmdlineTests/yul_optimizer_steps_multiple_delimiters/exit @@ -0,0 +1 @@ +1 diff --git a/test/cmdlineTests/yul_optimizer_steps_multiple_delimiters/input.sol b/test/cmdlineTests/yul_optimizer_steps_multiple_delimiters/input.sol new file mode 100644 index 000000000..0279d3b7d --- /dev/null +++ b/test/cmdlineTests/yul_optimizer_steps_multiple_delimiters/input.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.0; + +contract C +{ + function f() public pure {} +} diff --git a/test/cmdlineTests/yul_optimizer_steps_short_sequence/args b/test/cmdlineTests/yul_optimizer_steps_short_sequence/args new file mode 100644 index 000000000..ba2f47ebe --- /dev/null +++ b/test/cmdlineTests/yul_optimizer_steps_short_sequence/args @@ -0,0 +1 @@ +--ir-optimized --optimize --yul-optimizations iDu diff --git a/test/cmdlineTests/yul_optimizer_steps_short_sequence/input.sol b/test/cmdlineTests/yul_optimizer_steps_short_sequence/input.sol new file mode 100644 index 000000000..2d82716f0 --- /dev/null +++ b/test/cmdlineTests/yul_optimizer_steps_short_sequence/input.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.0; +pragma abicoder v2; + +contract C { + constructor() payable { + assembly ("memory-safe") { + let a := 0 + revert(0, a) + } + } +} diff --git a/test/cmdlineTests/yul_optimizer_steps_short_sequence/output b/test/cmdlineTests/yul_optimizer_steps_short_sequence/output new file mode 100644 index 000000000..0a4a2c5a2 --- /dev/null +++ b/test/cmdlineTests/yul_optimizer_steps_short_sequence/output @@ -0,0 +1,24 @@ +Optimized IR: +/// @use-src 0:"yul_optimizer_steps_short_sequence/input.sol" +object "C_8" { + code { + { + /// @src 0:80:221 "contract C {..." + mstore(64, memoryguard(0x80)) + /// @src 0:129:213 "assembly (\"memory-safe\") {..." + let usr$a := 0 + revert(usr$a, usr$a) + } + } + /// @use-src 0:"yul_optimizer_steps_short_sequence/input.sol" + object "C_8_deployed" { + code { + { + /// @src 0:80:221 "contract C {..." + mstore(64, memoryguard(0x80)) + revert(0, 0) + } + } + data ".metadata" hex"" + } +} diff --git a/test/cmdlineTests/yul_optimizer_steps_with_cleanup_sequence/args b/test/cmdlineTests/yul_optimizer_steps_with_cleanup_sequence/args new file mode 100644 index 000000000..872a81048 --- /dev/null +++ b/test/cmdlineTests/yul_optimizer_steps_with_cleanup_sequence/args @@ -0,0 +1 @@ +--ir-optimized --optimize --yul-optimizations dhfoDgvulfnTUtnIf:fDnTOc diff --git a/test/cmdlineTests/yul_optimizer_steps_with_cleanup_sequence/input.sol b/test/cmdlineTests/yul_optimizer_steps_with_cleanup_sequence/input.sol new file mode 100644 index 000000000..ab0d98d67 --- /dev/null +++ b/test/cmdlineTests/yul_optimizer_steps_with_cleanup_sequence/input.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.0; +pragma abicoder v2; + +contract C +{ + constructor() {} +} diff --git a/test/cmdlineTests/yul_optimizer_steps_with_cleanup_sequence/output b/test/cmdlineTests/yul_optimizer_steps_with_cleanup_sequence/output new file mode 100644 index 000000000..32c0eba2e --- /dev/null +++ b/test/cmdlineTests/yul_optimizer_steps_with_cleanup_sequence/output @@ -0,0 +1,34 @@ +Optimized IR: +/// @use-src 0:"yul_optimizer_steps_with_cleanup_sequence/input.sol" +object "C_7" { + code { + { + /// @src 0:80:115 "contract C..." + mstore(64, memoryguard(0x80)) + if callvalue() + { + revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb() + } + let _1 := allocate_unbounded() + codecopy(_1, dataoffset("C_7_deployed"), datasize("C_7_deployed")) + return(_1, datasize("C_7_deployed")) + } + function allocate_unbounded() -> memPtr + { memPtr := mload(64) } + function revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb() + { revert(0, 0) } + } + /// @use-src 0:"yul_optimizer_steps_with_cleanup_sequence/input.sol" + object "C_7_deployed" { + code { + { + /// @src 0:80:115 "contract C..." + mstore(64, memoryguard(0x80)) + revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74() + } + function revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74() + { revert(0, 0) } + } + data ".metadata" hex"" + } +} diff --git a/test/cmdlineTests/yul_optimizer_steps_with_empty_cleanup_sequence/args b/test/cmdlineTests/yul_optimizer_steps_with_empty_cleanup_sequence/args new file mode 100644 index 000000000..6673a776a --- /dev/null +++ b/test/cmdlineTests/yul_optimizer_steps_with_empty_cleanup_sequence/args @@ -0,0 +1 @@ +--ir-optimized --optimize --yul-optimizations iDu: diff --git a/test/cmdlineTests/yul_optimizer_steps_with_empty_cleanup_sequence/input.sol b/test/cmdlineTests/yul_optimizer_steps_with_empty_cleanup_sequence/input.sol new file mode 100644 index 000000000..2d82716f0 --- /dev/null +++ b/test/cmdlineTests/yul_optimizer_steps_with_empty_cleanup_sequence/input.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.0; +pragma abicoder v2; + +contract C { + constructor() payable { + assembly ("memory-safe") { + let a := 0 + revert(0, a) + } + } +} diff --git a/test/cmdlineTests/yul_optimizer_steps_with_empty_cleanup_sequence/output b/test/cmdlineTests/yul_optimizer_steps_with_empty_cleanup_sequence/output new file mode 100644 index 000000000..3f865bfe5 --- /dev/null +++ b/test/cmdlineTests/yul_optimizer_steps_with_empty_cleanup_sequence/output @@ -0,0 +1,24 @@ +Optimized IR: +/// @use-src 0:"yul_optimizer_steps_with_empty_cleanup_sequence/input.sol" +object "C_8" { + code { + { + /// @src 0:80:221 "contract C {..." + mstore(64, memoryguard(0x80)) + /// @src 0:129:213 "assembly (\"memory-safe\") {..." + let usr$a := 0 + revert(0, usr$a) + } + } + /// @use-src 0:"yul_optimizer_steps_with_empty_cleanup_sequence/input.sol" + object "C_8_deployed" { + code { + { + /// @src 0:80:221 "contract C {..." + mstore(64, memoryguard(0x80)) + revert(0, 0) + } + } + data ".metadata" hex"" + } +} diff --git a/test/cmdlineTests/yul_optimizer_steps_with_empty_optimization_sequence/args b/test/cmdlineTests/yul_optimizer_steps_with_empty_optimization_sequence/args new file mode 100644 index 000000000..b5d1d3c65 --- /dev/null +++ b/test/cmdlineTests/yul_optimizer_steps_with_empty_optimization_sequence/args @@ -0,0 +1 @@ +--ir-optimized --optimize --yul-optimizations :iDu diff --git a/test/cmdlineTests/yul_optimizer_steps_with_empty_optimization_sequence/input.sol b/test/cmdlineTests/yul_optimizer_steps_with_empty_optimization_sequence/input.sol new file mode 100644 index 000000000..2d82716f0 --- /dev/null +++ b/test/cmdlineTests/yul_optimizer_steps_with_empty_optimization_sequence/input.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.0; +pragma abicoder v2; + +contract C { + constructor() payable { + assembly ("memory-safe") { + let a := 0 + revert(0, a) + } + } +} diff --git a/test/cmdlineTests/yul_optimizer_steps_with_empty_optimization_sequence/output b/test/cmdlineTests/yul_optimizer_steps_with_empty_optimization_sequence/output new file mode 100644 index 000000000..9685b4312 --- /dev/null +++ b/test/cmdlineTests/yul_optimizer_steps_with_empty_optimization_sequence/output @@ -0,0 +1,24 @@ +Optimized IR: +/// @use-src 0:"yul_optimizer_steps_with_empty_optimization_sequence/input.sol" +object "C_8" { + code { + { + /// @src 0:80:221 "contract C {..." + mstore(64, memoryguard(0x80)) + /// @src 0:129:213 "assembly (\"memory-safe\") {..." + let usr$a := 0 + revert(0, usr$a) + } + } + /// @use-src 0:"yul_optimizer_steps_with_empty_optimization_sequence/input.sol" + object "C_8_deployed" { + code { + { + /// @src 0:80:221 "contract C {..." + mstore(64, memoryguard(0x80)) + revert(0, 0) + } + } + data ".metadata" hex"" + } +} diff --git a/test/cmdlineTests/yul_optimizer_steps_with_empty_sequences/args b/test/cmdlineTests/yul_optimizer_steps_with_empty_sequences/args new file mode 100644 index 000000000..d1f01a72f --- /dev/null +++ b/test/cmdlineTests/yul_optimizer_steps_with_empty_sequences/args @@ -0,0 +1 @@ +--ir-optimized --optimize --yul-optimizations : diff --git a/test/cmdlineTests/yul_optimizer_steps_with_empty_sequences/input.sol b/test/cmdlineTests/yul_optimizer_steps_with_empty_sequences/input.sol new file mode 100644 index 000000000..ab0d98d67 --- /dev/null +++ b/test/cmdlineTests/yul_optimizer_steps_with_empty_sequences/input.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.0; +pragma abicoder v2; + +contract C +{ + constructor() {} +} diff --git a/test/cmdlineTests/yul_optimizer_steps_with_empty_sequences/output b/test/cmdlineTests/yul_optimizer_steps_with_empty_sequences/output new file mode 100644 index 000000000..35ef9ca0b --- /dev/null +++ b/test/cmdlineTests/yul_optimizer_steps_with_empty_sequences/output @@ -0,0 +1,42 @@ +Optimized IR: +/// @use-src 0:"yul_optimizer_steps_with_empty_sequences/input.sol" +object "C_7" { + code { + { + /// @src 0:80:115 "contract C..." + mstore(64, memoryguard(0x80)) + if callvalue() + { + revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb() + } + constructor_C() + let _1 := allocate_unbounded() + codecopy(_1, dataoffset("C_7_deployed"), datasize("C_7_deployed")) + return(_1, datasize("C_7_deployed")) + } + function allocate_unbounded() -> memPtr + { memPtr := mload(64) } + function revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb() + { revert(0, 0) } + /// @ast-id 6 @src 0:97:113 "constructor() {}" + function constructor_C() + { } + } + /// @use-src 0:"yul_optimizer_steps_with_empty_sequences/input.sol" + object "C_7_deployed" { + code { + { + /// @src 0:80:115 "contract C..." + mstore(64, memoryguard(0x80)) + revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74() + } + function shift_right_unsigned(value) -> newValue + { newValue := shr(224, value) } + function allocate_unbounded() -> memPtr + { memPtr := mload(64) } + function revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74() + { revert(0, 0) } + } + data ".metadata" hex"" + } +} diff --git a/test/libyul/YulOptimizerTestCommon.cpp b/test/libyul/YulOptimizerTestCommon.cpp index 60826665a..7623efc12 100644 --- a/test/libyul/YulOptimizerTestCommon.cpp +++ b/test/libyul/YulOptimizerTestCommon.cpp @@ -339,6 +339,7 @@ YulOptimizerTestCommon::YulOptimizerTestCommon( *m_object, true, frontend::OptimiserSettings::DefaultYulOptimiserSteps, + frontend::OptimiserSettings::DefaultYulOptimiserCleanupSteps, frontend::OptimiserSettings::standard().expectedExecutionsPerDeployment ); }},