diff options
author | Alex Beregszaszi <alex@rtfs.hu> | 2017-05-10 17:46:44 +0800 |
---|---|---|
committer | Alex Beregszaszi <alex@rtfs.hu> | 2018-04-10 03:07:44 +0800 |
commit | cb352edd26f55adda63dde6cb66931089aff6656 (patch) | |
tree | 391bdc017eea84dce51a29165cc93493f0cb0fc2 | |
parent | fe61435c273bf43ac1a20d8bc97b6935a54b7117 (diff) | |
download | dexon-solidity-cb352edd26f55adda63dde6cb66931089aff6656.tar.gz dexon-solidity-cb352edd26f55adda63dde6cb66931089aff6656.tar.zst dexon-solidity-cb352edd26f55adda63dde6cb66931089aff6656.zip |
Add constant optimiser for SHR/SHL instructions
-rw-r--r-- | Changelog.md | 1 | ||||
-rw-r--r-- | libevmasm/RuleList.h | 10 |
2 files changed, 11 insertions, 0 deletions
diff --git a/Changelog.md b/Changelog.md index d1e199b7..1ed2f1dd 100644 --- a/Changelog.md +++ b/Changelog.md @@ -6,6 +6,7 @@ Features: * Commandline interface: Error when missing or inaccessible file detected. Suppress it with the ``--ignore-missing`` flag. * General: Support accessing dynamic return data in post-byzantium EVMs. * Interfaces: Allow overriding external functions in interfaces with public in an implementing contract. + * Optimizer: Optimize ``SHL`` and ``SHR`` only involving constants (Constantinople only). * Optimizer: Remove useless ``SWAP1`` instruction preceding a commutative instruction (such as ``ADD``, ``MUL``, etc). * Optimizer: Replace comparison operators (``LT``, ``GT``, etc) with opposites if preceded by ``SWAP1``, e.g. ``SWAP1 LT`` is replaced with ``GT``. * Optimizer: Optimize across ``mload`` if ``msize()`` is not used. diff --git a/libevmasm/RuleList.h b/libevmasm/RuleList.h index da522cec..abcf170c 100644 --- a/libevmasm/RuleList.h +++ b/libevmasm/RuleList.h @@ -89,6 +89,16 @@ std::vector<SimplificationRule<Pattern>> simplificationRuleList( u256 mask = (u256(1) << testBit) - 1; return u256(boost::multiprecision::bit_test(B.d(), testBit) ? B.d() | ~mask : B.d() & mask); }, false}, + {{Instruction::SHL, {A, B}}, [=]{ + if (A.d() > 255) + return u256(0); + return u256(bigint(B.d()) << unsigned(A.d())); + }, false}, + {{Instruction::SHR, {A, B}}, [=]{ + if (A.d() > 255) + return u256(0); + return B.d() >> unsigned(A.d()); + }, false}, // invariants involving known constants {{Instruction::ADD, {X, 0}}, [=]{ return X; }, false}, |