mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Make hardcoded parts of the optimizer sequence configurable
This commit is contained in:
parent
f808855329
commit
f6f0d6a360
@ -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
|
||||
);
|
||||
|
@ -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;
|
||||
|
@ -472,7 +472,7 @@ std::optional<Json::Value> checkOptimizerDetail(Json::Value const& _details, std
|
||||
return {};
|
||||
}
|
||||
|
||||
std::optional<Json::Value> checkOptimizerDetailSteps(Json::Value const& _details, std::string const& _name, string& _setting)
|
||||
std::optional<Json::Value> checkOptimizerDetailSteps(Json::Value const& _details, std::string const& _name, string& _optimiserSetting, string& _cleanupSetting)
|
||||
{
|
||||
if (_details.isMember(_name))
|
||||
{
|
||||
@ -490,7 +490,12 @@ std::optional<Json::Value> 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<OptimiserSettings, Json::Value> 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;
|
||||
}
|
||||
}
|
||||
|
@ -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),
|
||||
{}
|
||||
);
|
||||
|
@ -93,6 +93,7 @@ void OptimiserSuite::run(
|
||||
Object& _object,
|
||||
bool _optimizeStackAllocation,
|
||||
string_view _optimisationSequence,
|
||||
string_view _optimisationCleanupSequence,
|
||||
optional<size_t> _expectedExecutionsPerDeployment,
|
||||
set<YulString> 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<char, string> 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(
|
||||
|
@ -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<size_t> _expectedExecutionsPerDeployment,
|
||||
std::set<YulString> const& _externallyUsedIdentifiers = {}
|
||||
);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -0,0 +1 @@
|
||||
--pretty-json --json-indent 4
|
@ -0,0 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-3.0
|
||||
pragma solidity >=0.0;
|
||||
|
||||
contract C {
|
||||
function f() public pure {}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
@ -0,0 +1 @@
|
||||
--pretty-json --json-indent 4
|
@ -0,0 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-3.0
|
||||
pragma solidity >=0.0;
|
||||
|
||||
contract C {
|
||||
function f() public pure {}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
@ -0,0 +1 @@
|
||||
--pretty-json --json-indent 4
|
@ -0,0 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-3.0
|
||||
pragma solidity >=0.0;
|
||||
|
||||
contract C {
|
||||
function f() public pure {}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
{
|
||||
"sources":
|
||||
{
|
||||
"A":
|
||||
{
|
||||
"id": 0
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1 @@
|
||||
--pretty-json --json-indent 4
|
@ -0,0 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-3.0
|
||||
pragma solidity >=0.0;
|
||||
|
||||
contract C {
|
||||
function f() public pure {}
|
||||
}
|
@ -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:"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
{
|
||||
"sources":
|
||||
{
|
||||
"A":
|
||||
{
|
||||
"id": 0
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1 @@
|
||||
--pretty-json --json-indent 4
|
@ -0,0 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-3.0
|
||||
pragma solidity >=0.0;
|
||||
|
||||
contract C {
|
||||
function f() public pure {}
|
||||
}
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
{
|
||||
"sources":
|
||||
{
|
||||
"A":
|
||||
{
|
||||
"id": 0
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1 @@
|
||||
--pretty-json --json-indent 4
|
@ -0,0 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-3.0
|
||||
pragma solidity >=0.0;
|
||||
|
||||
contract C {
|
||||
function f() public pure {}
|
||||
}
|
@ -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": ":"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
{
|
||||
"sources":
|
||||
{
|
||||
"A":
|
||||
{
|
||||
"id": 0
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1 @@
|
||||
--ir-optimized --optimize --yul-optimizations dhfo[Dg:vu]lfnTUtnIf
|
@ -0,0 +1 @@
|
||||
Invalid optimizer step sequence in --yul-optimizations: Cleanup delimiter may only be placed at nesting level zero
|
@ -0,0 +1 @@
|
||||
1
|
@ -0,0 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-3.0
|
||||
pragma solidity >=0.0;
|
||||
|
||||
contract C
|
||||
{
|
||||
function f() public pure {}
|
||||
}
|
@ -0,0 +1 @@
|
||||
--ir-optimized --optimize --yul-optimizations dhfoDg:vulfn:TUtnIf
|
@ -0,0 +1 @@
|
||||
Invalid optimizer step sequence in --yul-optimizations: Too many colon delimiters
|
@ -0,0 +1 @@
|
||||
1
|
@ -0,0 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-3.0
|
||||
pragma solidity >=0.0;
|
||||
|
||||
contract C
|
||||
{
|
||||
function f() public pure {}
|
||||
}
|
@ -0,0 +1 @@
|
||||
--ir-optimized --optimize --yul-optimizations iDu
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
24
test/cmdlineTests/yul_optimizer_steps_short_sequence/output
Normal file
24
test/cmdlineTests/yul_optimizer_steps_short_sequence/output
Normal file
@ -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"<BYTECODE REMOVED>"
|
||||
}
|
||||
}
|
@ -0,0 +1 @@
|
||||
--ir-optimized --optimize --yul-optimizations dhfoDgvulfnTUtnIf:fDnTOc
|
@ -0,0 +1,8 @@
|
||||
// SPDX-License-Identifier: GPL-3.0
|
||||
pragma solidity >=0.0;
|
||||
pragma abicoder v2;
|
||||
|
||||
contract C
|
||||
{
|
||||
constructor() {}
|
||||
}
|
@ -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"<BYTECODE REMOVED>"
|
||||
}
|
||||
}
|
@ -0,0 +1 @@
|
||||
--ir-optimized --optimize --yul-optimizations iDu:
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
@ -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"<BYTECODE REMOVED>"
|
||||
}
|
||||
}
|
@ -0,0 +1 @@
|
||||
--ir-optimized --optimize --yul-optimizations :iDu
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
@ -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"<BYTECODE REMOVED>"
|
||||
}
|
||||
}
|
@ -0,0 +1 @@
|
||||
--ir-optimized --optimize --yul-optimizations :
|
@ -0,0 +1,8 @@
|
||||
// SPDX-License-Identifier: GPL-3.0
|
||||
pragma solidity >=0.0;
|
||||
pragma abicoder v2;
|
||||
|
||||
contract C
|
||||
{
|
||||
constructor() {}
|
||||
}
|
@ -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"<BYTECODE REMOVED>"
|
||||
}
|
||||
}
|
@ -339,6 +339,7 @@ YulOptimizerTestCommon::YulOptimizerTestCommon(
|
||||
*m_object,
|
||||
true,
|
||||
frontend::OptimiserSettings::DefaultYulOptimiserSteps,
|
||||
frontend::OptimiserSettings::DefaultYulOptimiserCleanupSteps,
|
||||
frontend::OptimiserSettings::standard().expectedExecutionsPerDeployment
|
||||
);
|
||||
}},
|
||||
|
Loading…
Reference in New Issue
Block a user