mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #2481 from ethereum/mload-optim
MLOAD has side-effects, treat it like that in the optimiser
This commit is contained in:
commit
dd9416be29
@ -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)
|
||||
|
||||
|
@ -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 } },
|
||||
|
@ -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{
|
||||
|
Loading…
Reference in New Issue
Block a user