From 5824f5d42ffe9fe6c40168cd4aa4f1ab20169351 Mon Sep 17 00:00:00 2001 From: chriseth Date: Tue, 14 May 2019 15:14:24 +0200 Subject: [PATCH] Use shift directly instead of multiplication in constant optimizer. --- libevmasm/ConstantOptimiser.cpp | 11 ++++++++--- test/libsolidity/GasCosts.cpp | 4 ++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/libevmasm/ConstantOptimiser.cpp b/libevmasm/ConstantOptimiser.cpp index 267daa5e5..cb5955b3e 100644 --- a/libevmasm/ConstantOptimiser.cpp +++ b/libevmasm/ConstantOptimiser.cpp @@ -211,11 +211,16 @@ AssemblyItems ComputeMethod::findRepresentation(u256 const& _value) if (lowerPart != 0) newRoutine += findRepresentation(u256(abs(lowerPart))); if (m_params.evmVersion.hasBitwiseShifting()) - newRoutine += AssemblyItems{u256(1), u256(bits), Instruction::SHL}; + { + newRoutine += findRepresentation(upperPart); + newRoutine += AssemblyItems{u256(bits), Instruction::SHL}; + } else + { newRoutine += AssemblyItems{u256(bits), u256(2), Instruction::EXP}; - if (upperPart != 1) - newRoutine += findRepresentation(upperPart) + AssemblyItems{Instruction::MUL}; + if (upperPart != 1) + newRoutine += findRepresentation(upperPart) + AssemblyItems{Instruction::MUL}; + } if (lowerPart > 0) newRoutine += AssemblyItems{Instruction::ADD}; else if (lowerPart < 0) diff --git a/test/libsolidity/GasCosts.cpp b/test/libsolidity/GasCosts.cpp index bb8be7807..a255d694d 100644 --- a/test/libsolidity/GasCosts.cpp +++ b/test/libsolidity/GasCosts.cpp @@ -75,12 +75,12 @@ BOOST_AUTO_TEST_CASE(string_storage) else if (Options::get().useABIEncoderV2) { if (Options::get().optimizeYul) - CHECK_GAS(153631, 130633, 100); + CHECK_GAS(153631, 129829, 100); else CHECK_GAS(153631, 138351, 100); } else - CHECK_GAS(129037, 122500, 100); + CHECK_GAS(129037, 121703, 100); if (Options::get().evmVersion() >= EVMVersion::byzantium()) { callContractFunction("f()");