aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2017-08-15 22:05:09 +0800
committerAlex Beregszaszi <alex@rtfs.hu>2017-08-25 17:42:36 +0800
commit223235c97e4a1b110053a891cb6154046f8e62e6 (patch)
tree32b519088a694a6491937af783a9807b25840b1f
parentd15526f877bd3320f50c78227da282c3a6b242e4 (diff)
downloaddexon-solidity-223235c97e4a1b110053a891cb6154046f8e62e6.tar.gz
dexon-solidity-223235c97e4a1b110053a891cb6154046f8e62e6.tar.zst
dexon-solidity-223235c97e4a1b110053a891cb6154046f8e62e6.zip
Add test for jumpdest removal.
-rw-r--r--test/libevmasm/Optimiser.cpp84
1 files changed, 84 insertions, 0 deletions
diff --git a/test/libevmasm/Optimiser.cpp b/test/libevmasm/Optimiser.cpp
index 6656f15b..9dc49581 100644
--- a/test/libevmasm/Optimiser.cpp
+++ b/test/libevmasm/Optimiser.cpp
@@ -22,6 +22,7 @@
#include <libevmasm/CommonSubexpressionEliminator.h>
#include <libevmasm/PeepholeOptimiser.h>
+#include <libevmasm/JumpdestRemover.h>
#include <libevmasm/ControlFlowGraph.h>
#include <libevmasm/BlockDeduplicator.h>
#include <libevmasm/Assembly.h>
@@ -840,6 +841,89 @@ BOOST_AUTO_TEST_CASE(peephole_double_push)
);
}
+BOOST_AUTO_TEST_CASE(jumpdest_removal)
+{
+ AssemblyItems items{
+ AssemblyItem(Tag, 2),
+ AssemblyItem(PushTag, 1),
+ u256(5),
+ AssemblyItem(Tag, 10),
+ AssemblyItem(Tag, 3),
+ u256(6),
+ AssemblyItem(Tag, 1),
+ Instruction::JUMP,
+ };
+ AssemblyItems expectation{
+ AssemblyItem(PushTag, 1),
+ u256(5),
+ u256(6),
+ AssemblyItem(Tag, 1),
+ Instruction::JUMP
+ };
+ JumpdestRemover jdr(items);
+ BOOST_REQUIRE(jdr.optimise({}));
+ BOOST_CHECK_EQUAL_COLLECTIONS(
+ items.begin(), items.end(),
+ expectation.begin(), expectation.end()
+ );
+}
+
+BOOST_AUTO_TEST_CASE(jumpdest_removal_subassemblies)
+{
+ // This tests that tags from subassemblies are not removed
+ // if they are referenced by a super-assembly. Furthermore,
+ // tag unifications (due to block deduplication) is also
+ // visible at the super-assembly.
+
+ Assembly main;
+ AssemblyPointer sub = make_shared<Assembly>();
+
+ sub->append(u256(1));
+ auto t1 = sub->newTag();
+ sub->append(t1);
+ sub->append(u256(2));
+ sub->append(Instruction::JUMP);
+ auto t2 = sub->newTag();
+ sub->append(t2); // Identical to T1, will be unified
+ sub->append(u256(2));
+ sub->append(Instruction::JUMP);
+ auto t3 = sub->newTag();
+ sub->append(t3);
+ auto t4 = sub->newTag();
+ sub->append(t4);
+ auto t5 = sub->newTag();
+ sub->append(t5); // This will be removed
+ sub->append(u256(7));
+ sub->append(t4.pushTag());
+ sub->append(Instruction::JUMP);
+
+ size_t subId = size_t(main.appendSubroutine(sub).data());
+ main.append(t1.toSubAssemblyTag(subId));
+ main.append(t1.toSubAssemblyTag(subId));
+ main.append(u256(8));
+
+ main.optimise(true);
+
+ AssemblyItems expectationMain{
+ AssemblyItem(PushSubSize, 0),
+ t1.toSubAssemblyTag(subId).pushTag(),
+ t1.toSubAssemblyTag(subId).pushTag(),
+ u256(8)
+ };
+ BOOST_CHECK_EQUAL_COLLECTIONS(
+ main.items().begin(), main.items().end(),
+ expectationMain.begin(), expectationMain.end()
+ );
+
+ AssemblyItems expectationSub{
+ u256(1), t1.tag(), u256(2), Instruction::JUMP, t4.tag(), u256(7), t4.pushTag(), Instruction::JUMP
+ };
+ BOOST_CHECK_EQUAL_COLLECTIONS(
+ sub->items().begin(), sub->items().end(),
+ expectationSub.begin(), expectationSub.end()
+ );
+}
+
BOOST_AUTO_TEST_CASE(cse_sub_zero)
{
checkCSE({