diff --git a/Changelog.md b/Changelog.md index 3f9c3fe0b..23460ac23 100644 --- a/Changelog.md +++ b/Changelog.md @@ -9,6 +9,7 @@ Breaking changes: * Command line interface: Switch to the new error reporter by default. ``--old-reporter`` falls back to the deprecated old error reporter. * Command line interface: Add option to disable or choose hash method between IPFS and Swarm for the bytecode metadata. * General: Disallow explicit conversions from external function types to ``address`` and add a member called ``address`` to them as replacement. + * General: Enable Yul optimizer as part of standard optimization. * General: New reserved keywords: ``virtual``. * General: Split unnamed fallback functions into two cases defined using ``fallback()`` and ``receive()``. * Standard JSON Interface: Add option to disable or choose hash method between IPFS and Swarm for the bytecode metadata. diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index e2ff8d49e..dab5daafe 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -230,12 +230,6 @@ bool CompilerStack::parse() if (SemVerVersion{string(VersionString)}.isPrerelease()) m_errorReporter.warning("This is a pre-release compiler version, please do not use it in production."); - if (m_optimiserSettings.runYulOptimiser) - m_errorReporter.warning( - "The Yul optimiser is still experimental. " - "Do not use it in production unless correctness of generated code is verified with extensive tests." - ); - vector sourcesToParse; for (auto const& s: m_sources) sourcesToParse.push_back(s.first); diff --git a/libsolidity/interface/OptimiserSettings.h b/libsolidity/interface/OptimiserSettings.h index 83203865f..0b1880516 100644 --- a/libsolidity/interface/OptimiserSettings.h +++ b/libsolidity/interface/OptimiserSettings.h @@ -54,19 +54,15 @@ struct OptimiserSettings s.runDeduplicate = true; s.runCSE = true; s.runConstantOptimiser = true; - // The only disabled ones - s.optimizeStackAllocation = false; - s.runYulOptimiser = false; + s.runYulOptimiser = true; + s.optimizeStackAllocation = true; s.expectedExecutionsPerDeployment = 200; return s; } - /// Standard optimisations plus yul and stack optimiser. + /// Full optimisations. Currently an alias for standard optimisations. static OptimiserSettings full() { - OptimiserSettings s = standard(); - s.optimizeStackAllocation = true; - s.runYulOptimiser = true; - return s; + return standard(); } bool operator==(OptimiserSettings const& _other) const diff --git a/libsolidity/interface/StandardCompiler.cpp b/libsolidity/interface/StandardCompiler.cpp index 7e1fa8467..25f6a5199 100644 --- a/libsolidity/interface/StandardCompiler.cpp +++ b/libsolidity/interface/StandardCompiler.cpp @@ -481,8 +481,7 @@ boost::variant parseOptimizerSettings(Json::Valu return *error; if (auto error = checkOptimizerDetail(details, "yul", settings.runYulOptimiser)) return *error; - if (settings.runYulOptimiser) - settings.optimizeStackAllocation = true; + settings.optimizeStackAllocation = settings.runYulOptimiser; if (details.isMember("yulDetails")) { if (!settings.runYulOptimiser) diff --git a/solc/CommandLineInterface.cpp b/solc/CommandLineInterface.cpp index 6f6eef644..37b4a2d3c 100644 --- a/solc/CommandLineInterface.cpp +++ b/solc/CommandLineInterface.cpp @@ -136,6 +136,7 @@ static string const g_strMetadataLiteral = "metadata-literal"; static string const g_strNatspecDev = "devdoc"; static string const g_strNatspecUser = "userdoc"; static string const g_strNone = "none"; +static string const g_strNoOptimizeYul = "no-optimize-yul"; static string const g_strOpcodes = "opcodes"; static string const g_strOptimize = "optimize"; static string const g_strOptimizeRuns = "optimize-runs"; @@ -688,7 +689,8 @@ Allowed options)", "Set for how many contract runs to optimize." "Lower values will optimize more for initial deployment cost, higher values will optimize more for high-frequency usage." ) - (g_strOptimizeYul.c_str(), "Enable Yul optimizer in Solidity, mostly for ABIEncoderV2. Still considered experimental.") + (g_strOptimizeYul.c_str(), "Enable Yul optimizer in Solidity. Legacy option: the yul optimizer is enabled as part of the general --optimize option.") + (g_strNoOptimizeYul.c_str(), "Disable Yul optimizer in Solidity.") (g_argPrettyJson.c_str(), "Output JSON in pretty format. Currently it only works with the combined JSON output.") ( g_argLibraries.c_str(), @@ -960,7 +962,17 @@ bool CommandLineInterface::processInput() using Machine = yul::AssemblyStack::Machine; Input inputLanguage = m_args.count(g_argYul) ? Input::Yul : (m_args.count(g_argStrictAssembly) ? Input::StrictAssembly : Input::Assembly); Machine targetMachine = Machine::EVM; - bool optimize = m_args.count(g_argOptimize) || m_args.count(g_strOptimizeYul); + bool optimize = m_args.count(g_argOptimize); + if (m_args.count(g_strOptimizeYul)) + { + serr() << "--optimize-yul is invalid in assembly mode. Use --optimize instead." << endl; + return false; + } + if (m_args.count(g_strNoOptimizeYul)) + { + serr() << "--no-optimize-yul is invalid in assembly mode. Optimization is disabled by default and can be enabled with --optimize." << endl; + return false; + } if (m_args.count(g_argMachine)) { string machine = m_args[g_argMachine].as(); @@ -1008,7 +1020,7 @@ bool CommandLineInterface::processInput() return false; } serr() << - "Warning: Yul and its optimizer are still experimental. Please use the output with care." << + "Warning: Yul is still experimental. Please use the output with care." << endl; return assemble(inputLanguage, targetMachine, optimize); @@ -1065,7 +1077,7 @@ bool CommandLineInterface::processInput() OptimiserSettings settings = m_args.count(g_argOptimize) ? OptimiserSettings::standard() : OptimiserSettings::minimal(); settings.expectedExecutionsPerDeployment = m_args[g_argOptimizeRuns].as(); - settings.runYulOptimiser = m_args.count(g_strOptimizeYul); + settings.runYulOptimiser = !m_args.count(g_strNoOptimizeYul); settings.optimizeStackAllocation = settings.runYulOptimiser; m_compiler->setOptimiserSettings(settings); diff --git a/test/cmdlineTests/object_compiler/err b/test/cmdlineTests/object_compiler/err index aa7ea77f9..014a1178f 100644 --- a/test/cmdlineTests/object_compiler/err +++ b/test/cmdlineTests/object_compiler/err @@ -1 +1 @@ -Warning: Yul and its optimizer are still experimental. Please use the output with care. +Warning: Yul is still experimental. Please use the output with care. diff --git a/test/cmdlineTests/standard_eWasm_requested/output.json b/test/cmdlineTests/standard_eWasm_requested/output.json index 7f7787e96..9b7e42572 100644 --- a/test/cmdlineTests/standard_eWasm_requested/output.json +++ b/test/cmdlineTests/standard_eWasm_requested/output.json @@ -60,5 +60,4 @@ ) ) -"}}}},"errors":[{"component":"general","formattedMessage":"Warning: The Yul optimiser is still experimental. Do not use it in production unless correctness of generated code is verified with extensive tests. -","message":"The Yul optimiser is still experimental. Do not use it in production unless correctness of generated code is verified with extensive tests.","severity":"warning","type":"Warning"}],"sources":{"A":{"id":0}}} +"}}}},"sources":{"A":{"id":0}}} diff --git a/test/cmdlineTests/standard_optimizer_no_yul/input.json b/test/cmdlineTests/standard_optimizer_no_yul/input.json new file mode 100644 index 000000000..23f14b488 --- /dev/null +++ b/test/cmdlineTests/standard_optimizer_no_yul/input.json @@ -0,0 +1,17 @@ +{ + "language": "Solidity", + "sources": + { + "A": + { + "content": "pragma solidity >=0.0; contract C { function f() public pure {} }" + } + }, + "settings": + { + "optimizer": { + "enabled": true, + "details": { "yul": false } + } + } +} diff --git a/test/cmdlineTests/standard_optimizer_no_yul/output.json b/test/cmdlineTests/standard_optimizer_no_yul/output.json new file mode 100644 index 000000000..59b90c8cc --- /dev/null +++ b/test/cmdlineTests/standard_optimizer_no_yul/output.json @@ -0,0 +1 @@ +{"sources":{"A":{"id":0}}} diff --git a/test/cmdlineTests/standard_optimizer_yul/input.json b/test/cmdlineTests/standard_optimizer_yul/input.json index 1c93be871..3cafae03a 100644 --- a/test/cmdlineTests/standard_optimizer_yul/input.json +++ b/test/cmdlineTests/standard_optimizer_yul/input.json @@ -10,8 +10,7 @@ "settings": { "optimizer": { - "enabled": true, - "details": { "yul": true } + "enabled": true } } } diff --git a/test/cmdlineTests/standard_optimizer_yul/output.json b/test/cmdlineTests/standard_optimizer_yul/output.json index 3852c2e7f..59b90c8cc 100644 --- a/test/cmdlineTests/standard_optimizer_yul/output.json +++ b/test/cmdlineTests/standard_optimizer_yul/output.json @@ -1,2 +1 @@ -{"errors":[{"component":"general","formattedMessage":"Warning: The Yul optimiser is still experimental. Do not use it in production unless correctness of generated code is verified with extensive tests. -","message":"The Yul optimiser is still experimental. Do not use it in production unless correctness of generated code is verified with extensive tests.","severity":"warning","type":"Warning"}],"sources":{"A":{"id":0}}} +{"sources":{"A":{"id":0}}} diff --git a/test/cmdlineTests/standard_optimizer_yulDetails/output.json b/test/cmdlineTests/standard_optimizer_yulDetails/output.json index 3852c2e7f..59b90c8cc 100644 --- a/test/cmdlineTests/standard_optimizer_yulDetails/output.json +++ b/test/cmdlineTests/standard_optimizer_yulDetails/output.json @@ -1,2 +1 @@ -{"errors":[{"component":"general","formattedMessage":"Warning: The Yul optimiser is still experimental. Do not use it in production unless correctness of generated code is verified with extensive tests. -","message":"The Yul optimiser is still experimental. Do not use it in production unless correctness of generated code is verified with extensive tests.","severity":"warning","type":"Warning"}],"sources":{"A":{"id":0}}} +{"sources":{"A":{"id":0}}} diff --git a/test/cmdlineTests/strict_asm_jump/err b/test/cmdlineTests/strict_asm_jump/err index 8463daa82..caefd1690 100644 --- a/test/cmdlineTests/strict_asm_jump/err +++ b/test/cmdlineTests/strict_asm_jump/err @@ -1,4 +1,4 @@ -Warning: Yul and its optimizer are still experimental. Please use the output with care. +Warning: Yul is still experimental. Please use the output with care. Error: Function not found. --> strict_asm_jump/input.sol:1:3: | diff --git a/test/cmdlineTests/yul_stack_opt/err b/test/cmdlineTests/yul_stack_opt/err index aa7ea77f9..014a1178f 100644 --- a/test/cmdlineTests/yul_stack_opt/err +++ b/test/cmdlineTests/yul_stack_opt/err @@ -1 +1 @@ -Warning: Yul and its optimizer are still experimental. Please use the output with care. +Warning: Yul is still experimental. Please use the output with care. diff --git a/test/cmdlineTests/yul_stack_opt_disabled/err b/test/cmdlineTests/yul_stack_opt_disabled/err index beb36e749..43deb1b0e 100644 --- a/test/cmdlineTests/yul_stack_opt_disabled/err +++ b/test/cmdlineTests/yul_stack_opt_disabled/err @@ -1,4 +1,4 @@ -Warning: Yul and its optimizer are still experimental. Please use the output with care. +Warning: Yul is still experimental. Please use the output with care. Exception while assembling: Dynamic exception type: std::exception::what: Variable a1 is 17 slot(s) too deep inside the stack. diff --git a/test/libsolidity/StandardCompiler.cpp b/test/libsolidity/StandardCompiler.cpp index edf0cdc07..f6233705e 100644 --- a/test/libsolidity/StandardCompiler.cpp +++ b/test/libsolidity/StandardCompiler.cpp @@ -1042,12 +1042,6 @@ BOOST_AUTO_TEST_CASE(optimizer_settings_details_different) )"; Json::Value result = compile(input); BOOST_CHECK(containsAtMostWarnings(result)); - BOOST_CHECK(containsError( - result, - "Warning", - "The Yul optimiser is still experimental. " - "Do not use it in production unless correctness of generated code is verified with extensive tests." - )); Json::Value contract = getContractResult(result, "fileA", "A"); BOOST_CHECK(contract.isObject()); BOOST_CHECK(contract["metadata"].isString()); diff --git a/test/libsolidity/SyntaxTest.cpp b/test/libsolidity/SyntaxTest.cpp index 41a4dd18b..e36c5c811 100644 --- a/test/libsolidity/SyntaxTest.cpp +++ b/test/libsolidity/SyntaxTest.cpp @@ -63,9 +63,17 @@ SyntaxTest::SyntaxTest(string const& _filename, langutil::EVMVersion _evmVersion if (m_settings.count("optimize-yul")) { - m_optimiseYul = true; - m_validatedSettings["optimize-yul"] = "true"; - m_settings.erase("optimize-yul"); + if (m_settings["optimize-yul"] == "true") + { + m_validatedSettings["optimize-yul"] = "true"; + m_settings.erase("optimize-yul"); + } + else if (m_settings["optimize-yul"] == "false") + { + m_validatedSettings["optimize-yul"] = "false"; + m_settings.erase("optimize-yul"); + m_optimiseYul = false; + } } m_expectations = parseExpectations(file); m_parserErrorRecovery = _parserErrorRecovery; diff --git a/test/libsolidity/SyntaxTest.h b/test/libsolidity/SyntaxTest.h index 53c06d3fe..21ec33467 100644 --- a/test/libsolidity/SyntaxTest.h +++ b/test/libsolidity/SyntaxTest.h @@ -90,7 +90,7 @@ protected: std::map m_sources; std::vector m_expectations; std::vector m_errorList; - bool m_optimiseYul = false; + bool m_optimiseYul = true; langutil::EVMVersion const m_evmVersion; bool m_parserErrorRecovery = false; }; diff --git a/test/libsolidity/syntaxTests/inlineAssembly/use_msize_with_optimizer.sol b/test/libsolidity/syntaxTests/inlineAssembly/use_msize_with_optimizer.sol index eeba55a4c..3110ca05e 100644 --- a/test/libsolidity/syntaxTests/inlineAssembly/use_msize_with_optimizer.sol +++ b/test/libsolidity/syntaxTests/inlineAssembly/use_msize_with_optimizer.sol @@ -8,5 +8,4 @@ contract C { // ==== // optimize-yul: true // ---- -// Warning: The Yul optimiser is still experimental. Do not use it in production unless correctness of generated code is verified with extensive tests. // SyntaxError: (52-101): The msize instruction cannot be used when the Yul optimizer is activated because it can change its semantics. Either disable the Yul optimizer or do not use the instruction. diff --git a/test/libsolidity/syntaxTests/inlineAssembly/use_msize_without_optimizer.sol b/test/libsolidity/syntaxTests/inlineAssembly/use_msize_without_optimizer.sol index e994d017d..8cdf96641 100644 --- a/test/libsolidity/syntaxTests/inlineAssembly/use_msize_without_optimizer.sol +++ b/test/libsolidity/syntaxTests/inlineAssembly/use_msize_without_optimizer.sol @@ -5,4 +5,6 @@ contract C { } } } +// ==== +// optimize-yul: false // ----