diff options
author | chriseth <chris@ethereum.org> | 2017-07-01 23:53:01 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-07-01 23:53:01 +0800 |
commit | dd9416be29e9ac22b9b2a33cb9424514067cc6bf (patch) | |
tree | 3478f1e1080388a5320835652528cad88254da05 | |
parent | 0446893bce2bbf97654459cc4153f91a4d959643 (diff) | |
parent | 0fa2feb3411dd254132ad17a6a8e428551ae3613 (diff) | |
download | dexon-solidity-dd9416be29e9ac22b9b2a33cb9424514067cc6bf.tar.gz dexon-solidity-dd9416be29e9ac22b9b2a33cb9424514067cc6bf.tar.zst dexon-solidity-dd9416be29e9ac22b9b2a33cb9424514067cc6bf.zip |
Merge pull request #2481 from ethereum/mload-optim
MLOAD has side-effects, treat it like that in the optimiser
-rw-r--r-- | Changelog.md | 2 | ||||
-rw-r--r-- | libevmasm/Instruction.cpp | 2 | ||||
-rw-r--r-- | test/libsolidity/SolidityOptimizer.cpp | 53 |
3 files changed, 3 insertions, 54 deletions
diff --git a/Changelog.md b/Changelog.md index 68f2272d..51d72b2a 100644 --- a/Changelog.md +++ b/Changelog.md @@ -20,6 +20,7 @@ Features: * Static Analyzer: Warn about deprecation of ``callcode``. Bugfixes: + * Assembly: mark ``MLOAD`` to have side effects in the optimiser. * Code generator: Use ``REVERT`` instead of ``INVALID`` for generated input validation routines. * Type Checker: Fix address literals not being treated as compile-time constants. * Type Checker: Disallow invoking the same modifier multiple times. @@ -33,6 +34,7 @@ Bugfixes: * Code Generator: Fix negative stack size checks. * Inline Assembly: Enforce function arguments when parsing functional instructions. * Fixed segfault with constant function parameters + * Optimizer: Disallow optimizations involving ``MLOAD`` because it changes ``MSIZE``. ### 0.4.11 (2017-05-03) diff --git a/libevmasm/Instruction.cpp b/libevmasm/Instruction.cpp index 8feb733a..b38981d2 100644 --- a/libevmasm/Instruction.cpp +++ b/libevmasm/Instruction.cpp @@ -216,7 +216,7 @@ static const std::map<Instruction, InstructionInfo> c_instructionInfo = { Instruction::DIFFICULTY, { "DIFFICULTY", 0, 0, 1, false, Tier::Base } }, { Instruction::GASLIMIT, { "GASLIMIT", 0, 0, 1, false, Tier::Base } }, { Instruction::POP, { "POP", 0, 1, 0, false, Tier::Base } }, - { Instruction::MLOAD, { "MLOAD", 0, 1, 1, false, Tier::VeryLow } }, + { Instruction::MLOAD, { "MLOAD", 0, 1, 1, true, Tier::VeryLow } }, { Instruction::MSTORE, { "MSTORE", 0, 2, 0, true, Tier::VeryLow } }, { Instruction::MSTORE8, { "MSTORE8", 0, 2, 0, true, Tier::VeryLow } }, { Instruction::SLOAD, { "SLOAD", 0, 1, 1, false, Tier::Special } }, diff --git a/test/libsolidity/SolidityOptimizer.cpp b/test/libsolidity/SolidityOptimizer.cpp index 7afbe04e..a4d80c99 100644 --- a/test/libsolidity/SolidityOptimizer.cpp +++ b/test/libsolidity/SolidityOptimizer.cpp @@ -697,59 +697,6 @@ BOOST_AUTO_TEST_CASE(cse_interleaved_storage_at_known_location_offset) }); } -BOOST_AUTO_TEST_CASE(cse_interleaved_memory_at_known_location_offset) -{ - // stores and reads to/from two locations which are known to be different, - // should not optimize away the first store, because the location overlaps with the load, - // but it should optimize away the second, because we know that the location is different by 32 - AssemblyItems input{ - u256(0x50), - Instruction::DUP2, - u256(2), - Instruction::ADD, - Instruction::MSTORE, // ["DUP1"+2] = 0x50 - u256(0x60), - Instruction::DUP2, - u256(32), - Instruction::ADD, - Instruction::MSTORE, // ["DUP1"+32] = 0x60 - Instruction::DUP1, - Instruction::MLOAD, // read from "DUP1" - u256(0x70), - Instruction::DUP3, - u256(32), - Instruction::ADD, - Instruction::MSTORE, // ["DUP1"+32] = 0x70 - u256(0x80), - Instruction::DUP3, - u256(2), - Instruction::ADD, - Instruction::MSTORE, // ["DUP1"+2] = 0x80 - }; - // If the actual code changes too much, we could also simply check that the output contains - // exactly 3 MSTORE and exactly 1 MLOAD instruction. - checkCSE(input, { - u256(0x50), - u256(2), - Instruction::DUP3, - Instruction::ADD, - Instruction::SWAP1, - Instruction::DUP2, - Instruction::MSTORE, // ["DUP1"+2] = 0x50 - Instruction::DUP2, - Instruction::MLOAD, // read from "DUP1" - u256(0x70), - u256(32), - Instruction::DUP5, - Instruction::ADD, - Instruction::MSTORE, // ["DUP1"+32] = 0x70 - u256(0x80), - Instruction::SWAP1, - Instruction::SWAP2, - Instruction::MSTORE // ["DUP1"+2] = 0x80 - }); -} - BOOST_AUTO_TEST_CASE(cse_deep_stack) { AssemblyItems input{ |