diff options
author | Yoichi Hirai <i@yoichihirai.com> | 2016-11-24 19:17:29 +0800 |
---|---|---|
committer | Yoichi Hirai <i@yoichihirai.com> | 2016-11-25 01:22:22 +0800 |
commit | c0fe5fbe9b474a9cd0db10db5e4410e7950d9a93 (patch) | |
tree | c490fc378fce5f4da1cf8970a96f65ff324b17a5 | |
parent | e4619048547a51a20899ac9c89cbfac84091b04e (diff) | |
download | dexon-solidity-c0fe5fbe9b474a9cd0db10db5e4410e7950d9a93.tar.gz dexon-solidity-c0fe5fbe9b474a9cd0db10db5e4410e7950d9a93.tar.zst dexon-solidity-c0fe5fbe9b474a9cd0db10db5e4410e7950d9a93.zip |
libevmasm: Add another peephole optimization
-rw-r--r-- | libevmasm/AssemblyItem.h | 2 | ||||
-rw-r--r-- | libevmasm/PeepholeOptimiser.cpp | 29 |
2 files changed, 28 insertions, 3 deletions
diff --git a/libevmasm/AssemblyItem.h b/libevmasm/AssemblyItem.h index 2bc28dbd..b5bd3ed8 100644 --- a/libevmasm/AssemblyItem.h +++ b/libevmasm/AssemblyItem.h @@ -14,7 +14,7 @@ You should have received a copy of the GNU General Public License along with solidity. If not, see <http://www.gnu.org/licenses/>. */ -/** @file Assembly.h +/** @file AssemblyItem.h * @author Gav Wood <i@gavwood.com> * @date 2014 */ diff --git a/libevmasm/PeepholeOptimiser.cpp b/libevmasm/PeepholeOptimiser.cpp index e93db9ac..104d9769 100644 --- a/libevmasm/PeepholeOptimiser.cpp +++ b/libevmasm/PeepholeOptimiser.cpp @@ -15,7 +15,7 @@ along with solidity. If not, see <http://www.gnu.org/licenses/>. */ /** - * @file PeepholeOptimiser.h + * @file PeepholeOptimiser.cpp * Performs local optimising code changes to assembly. */ @@ -57,6 +57,31 @@ struct PushPop } }; +struct AddPop +{ + static size_t windowSize() { return 2; } + static bool apply(AssemblyItems::const_iterator _in, std::back_insert_iterator<AssemblyItems> _out) + { + if (_in[1] == Instruction::POP && + _in[0].type() == Operation + ) + { + Instruction i0 = _in[0].instruction(); + if (instructionInfo(i0).ret == 1 && + instructionInfo(i0).args == 2 && + !SemanticInformation::invalidatesMemory(i0) && + !SemanticInformation::invalidatesStorage(i0) + ) + { + *_out = Instruction::POP; + *_out = Instruction::POP; + return true; + } + } + return false; + } +}; + struct DoubleSwap { static size_t windowSize() { return 2; } @@ -136,7 +161,7 @@ bool PeepholeOptimiser::optimise() { OptimiserState state {m_items, 0, std::back_inserter(m_optimisedItems)}; while (state.i < m_items.size()) - applyMethods(state, PushPop(), DoubleSwap(), JumpToNext(), TagConjunctions(), Identity()); + applyMethods(state, PushPop(), AddPop(), DoubleSwap(), JumpToNext(), TagConjunctions(), Identity()); if (m_optimisedItems.size() < m_items.size()) { m_items = std::move(m_optimisedItems); |