aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/libevmasm/Optimiser.cpp84
-rw-r--r--test/libsolidity/Assembly.cpp4
-rw-r--r--test/libsolidity/JSONCompiler.cpp12
-rw-r--r--test/libsolidity/StandardCompiler.cpp8
4 files changed, 96 insertions, 12 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({
diff --git a/test/libsolidity/Assembly.cpp b/test/libsolidity/Assembly.cpp
index 99a2996e..56ac8cf5 100644
--- a/test/libsolidity/Assembly.cpp
+++ b/test/libsolidity/Assembly.cpp
@@ -119,11 +119,11 @@ BOOST_AUTO_TEST_CASE(location_test)
shared_ptr<string const> n = make_shared<string>("");
AssemblyItems items = compileContract(sourceCode);
vector<SourceLocation> locations =
- vector<SourceLocation>(19, SourceLocation(2, 75, n)) +
+ vector<SourceLocation>(18, SourceLocation(2, 75, n)) +
vector<SourceLocation>(32, SourceLocation(20, 72, n)) +
vector<SourceLocation>{SourceLocation(42, 51, n), SourceLocation(65, 67, n)} +
vector<SourceLocation>(2, SourceLocation(58, 67, n)) +
- vector<SourceLocation>(3, SourceLocation(20, 72, n));
+ vector<SourceLocation>(2, SourceLocation(20, 72, n));
checkAssemblyLocations(items, locations);
}
diff --git a/test/libsolidity/JSONCompiler.cpp b/test/libsolidity/JSONCompiler.cpp
index 0fe7636c..541cfbf0 100644
--- a/test/libsolidity/JSONCompiler.cpp
+++ b/test/libsolidity/JSONCompiler.cpp
@@ -120,18 +120,18 @@ BOOST_AUTO_TEST_CASE(basic_compilation)
BOOST_CHECK(contract["bytecode"].isString());
BOOST_CHECK_EQUAL(
dev::test::bytecodeSansMetadata(contract["bytecode"].asString()),
- "60606040523415600e57600080fd5b5b603680601c6000396000f30060606040525b600080fd00"
+ "60606040523415600e57600080fd5b603580601b6000396000f3006060604052600080fd00"
);
BOOST_CHECK(contract["runtimeBytecode"].isString());
BOOST_CHECK_EQUAL(
dev::test::bytecodeSansMetadata(contract["runtimeBytecode"].asString()),
- "60606040525b600080fd00"
+ "6060604052600080fd00"
);
BOOST_CHECK(contract["functionHashes"].isObject());
BOOST_CHECK(contract["gasEstimates"].isObject());
BOOST_CHECK_EQUAL(
dev::jsonCompactPrint(contract["gasEstimates"]),
- "{\"creation\":[62,10800],\"external\":{},\"internal\":{}}"
+ "{\"creation\":[61,10600],\"external\":{},\"internal\":{}}"
);
BOOST_CHECK(contract["metadata"].isString());
BOOST_CHECK(dev::test::isValidMetadata(contract["metadata"].asString()));
@@ -162,18 +162,18 @@ BOOST_AUTO_TEST_CASE(single_compilation)
BOOST_CHECK(contract["bytecode"].isString());
BOOST_CHECK_EQUAL(
dev::test::bytecodeSansMetadata(contract["bytecode"].asString()),
- "60606040523415600e57600080fd5b5b603680601c6000396000f30060606040525b600080fd00"
+ "60606040523415600e57600080fd5b603580601b6000396000f3006060604052600080fd00"
);
BOOST_CHECK(contract["runtimeBytecode"].isString());
BOOST_CHECK_EQUAL(
dev::test::bytecodeSansMetadata(contract["runtimeBytecode"].asString()),
- "60606040525b600080fd00"
+ "6060604052600080fd00"
);
BOOST_CHECK(contract["functionHashes"].isObject());
BOOST_CHECK(contract["gasEstimates"].isObject());
BOOST_CHECK_EQUAL(
dev::jsonCompactPrint(contract["gasEstimates"]),
- "{\"creation\":[62,10800],\"external\":{},\"internal\":{}}"
+ "{\"creation\":[61,10600],\"external\":{},\"internal\":{}}"
);
BOOST_CHECK(contract["metadata"].isString());
BOOST_CHECK(dev::test::isValidMetadata(contract["metadata"].asString()));
diff --git a/test/libsolidity/StandardCompiler.cpp b/test/libsolidity/StandardCompiler.cpp
index 79848c36..24f915c0 100644
--- a/test/libsolidity/StandardCompiler.cpp
+++ b/test/libsolidity/StandardCompiler.cpp
@@ -198,19 +198,19 @@ BOOST_AUTO_TEST_CASE(basic_compilation)
BOOST_CHECK(contract["evm"]["bytecode"]["object"].isString());
BOOST_CHECK_EQUAL(
dev::test::bytecodeSansMetadata(contract["evm"]["bytecode"]["object"].asString()),
- "60606040523415600e57600080fd5b5b603680601c6000396000f30060606040525b600080fd00"
+ "60606040523415600e57600080fd5b603580601b6000396000f3006060604052600080fd00"
);
BOOST_CHECK(contract["evm"]["assembly"].isString());
BOOST_CHECK(contract["evm"]["assembly"].asString().find(
" /* \"fileA\":0:14 contract A { } */\n mstore(0x40, 0x60)\n jumpi(tag_1, iszero(callvalue))\n"
- " 0x0\n dup1\n revert\ntag_1:\ntag_2:\n dataSize(sub_0)\n dup1\n dataOffset(sub_0)\n 0x0\n codecopy\n 0x0\n"
+ " 0x0\n dup1\n revert\ntag_1:\n dataSize(sub_0)\n dup1\n dataOffset(sub_0)\n 0x0\n codecopy\n 0x0\n"
" return\nstop\n\nsub_0: assembly {\n /* \"fileA\":0:14 contract A { } */\n"
- " mstore(0x40, 0x60)\n tag_1:\n 0x0\n dup1\n revert\n\n"
+ " mstore(0x40, 0x60)\n 0x0\n dup1\n revert\n\n"
" auxdata: 0xa165627a7a7230582") == 0);
BOOST_CHECK(contract["evm"]["gasEstimates"].isObject());
BOOST_CHECK_EQUAL(
dev::jsonCompactPrint(contract["evm"]["gasEstimates"]),
- "{\"creation\":{\"codeDepositCost\":\"10800\",\"executionCost\":\"62\",\"totalCost\":\"10862\"}}"
+ "{\"creation\":{\"codeDepositCost\":\"10600\",\"executionCost\":\"61\",\"totalCost\":\"10661\"}}"
);
BOOST_CHECK(contract["metadata"].isString());
BOOST_CHECK(dev::test::isValidMetadata(contract["metadata"].asString()));