aboutsummaryrefslogtreecommitdiffstats
path: root/libevmasm/Assembly.cpp
diff options
context:
space:
mode:
authorAlex Beregszaszi <alex@rtfs.hu>2017-08-25 18:20:56 +0800
committerGitHub <noreply@github.com>2017-08-25 18:20:56 +0800
commit38035f8e32b39d1215ad30fbff400c10f44b3487 (patch)
tree72cda323a9e35b9eeb0b0af2b48f593698ecf191 /libevmasm/Assembly.cpp
parente945f4589408e35e0d0c3cff22091c61c9771410 (diff)
parent223235c97e4a1b110053a891cb6154046f8e62e6 (diff)
downloaddexon-solidity-38035f8e32b39d1215ad30fbff400c10f44b3487.tar
dexon-solidity-38035f8e32b39d1215ad30fbff400c10f44b3487.tar.gz
dexon-solidity-38035f8e32b39d1215ad30fbff400c10f44b3487.tar.bz2
dexon-solidity-38035f8e32b39d1215ad30fbff400c10f44b3487.tar.lz
dexon-solidity-38035f8e32b39d1215ad30fbff400c10f44b3487.tar.xz
dexon-solidity-38035f8e32b39d1215ad30fbff400c10f44b3487.tar.zst
dexon-solidity-38035f8e32b39d1215ad30fbff400c10f44b3487.zip
Merge pull request #2657 from ethereum/jumpdest-remover
Introduce JumpdestRemover optimisation step
Diffstat (limited to 'libevmasm/Assembly.cpp')
-rw-r--r--libevmasm/Assembly.cpp30
1 files changed, 23 insertions, 7 deletions
diff --git a/libevmasm/Assembly.cpp b/libevmasm/Assembly.cpp
index 0a3bf6b8..8c1f9296 100644
--- a/libevmasm/Assembly.cpp
+++ b/libevmasm/Assembly.cpp
@@ -24,6 +24,7 @@
#include <libevmasm/CommonSubexpressionEliminator.h>
#include <libevmasm/ControlFlowGraph.h>
#include <libevmasm/PeepholeOptimiser.h>
+#include <libevmasm/JumpdestRemover.h>
#include <libevmasm/BlockDeduplicator.h>
#include <libevmasm/ConstantOptimiser.h>
#include <libevmasm/GasMeter.h>
@@ -349,6 +350,7 @@ Assembly& Assembly::optimise(bool _enable, bool _isCreation, size_t _runs)
{
OptimiserSettings settings;
settings.isCreation = _isCreation;
+ settings.runJumpdestRemover = true;
settings.runPeephole = true;
if (_enable)
{
@@ -357,18 +359,21 @@ Assembly& Assembly::optimise(bool _enable, bool _isCreation, size_t _runs)
settings.runConstantOptimiser = true;
}
settings.expectedExecutionsPerDeployment = _runs;
- optimiseInternal(settings);
+ optimise(settings);
return *this;
}
-Assembly& Assembly::optimise(OptimiserSettings _settings)
+Assembly& Assembly::optimise(OptimiserSettings const& _settings)
{
- optimiseInternal(_settings);
+ optimiseInternal(_settings, {});
return *this;
}
-map<u256, u256> Assembly::optimiseInternal(OptimiserSettings _settings)
+map<u256, u256> Assembly::optimiseInternal(
+ OptimiserSettings const& _settings,
+ std::set<size_t> const& _tagsReferencedFromOutside
+)
{
// Run optimisation for sub-assemblies.
for (size_t subId = 0; subId < m_subs.size(); ++subId)
@@ -376,7 +381,10 @@ map<u256, u256> Assembly::optimiseInternal(OptimiserSettings _settings)
OptimiserSettings settings = _settings;
// Disable creation mode for sub-assemblies.
settings.isCreation = false;
- map<u256, u256> subTagReplacements = m_subs[subId]->optimiseInternal(settings);
+ map<u256, u256> subTagReplacements = m_subs[subId]->optimiseInternal(
+ settings,
+ JumpdestRemover::referencedTags(m_items, subId)
+ );
// Apply the replacements (can be empty).
BlockDeduplicator::applyTagReplacement(m_items, subTagReplacements, subId);
}
@@ -387,6 +395,13 @@ map<u256, u256> Assembly::optimiseInternal(OptimiserSettings _settings)
{
count = 0;
+ if (_settings.runJumpdestRemover)
+ {
+ JumpdestRemover jumpdestOpt(m_items);
+ if (jumpdestOpt.optimise(_tagsReferencedFromOutside))
+ count++;
+ }
+
if (_settings.runPeephole)
{
PeepholeOptimiser peepOpt(m_items);
@@ -473,8 +488,9 @@ LinkerObject const& Assembly::assemble() const
for (auto const& sub: m_subs)
{
sub->assemble();
- if (!sub->m_tagPositionsInBytecode.empty())
- subTagSize = max(subTagSize, *max_element(sub->m_tagPositionsInBytecode.begin(), sub->m_tagPositionsInBytecode.end()));
+ for (size_t tagPos: sub->m_tagPositionsInBytecode)
+ if (tagPos != size_t(-1) && tagPos > subTagSize)
+ subTagSize = tagPos;
}
LinkerObject& ret = m_assembledObject;