aboutsummaryrefslogtreecommitdiffstats
path: root/SolidityOptimizer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'SolidityOptimizer.cpp')
-rw-r--r--SolidityOptimizer.cpp115
1 files changed, 81 insertions, 34 deletions
diff --git a/SolidityOptimizer.cpp b/SolidityOptimizer.cpp
index 9c6a4e36..2d5cff7a 100644
--- a/SolidityOptimizer.cpp
+++ b/SolidityOptimizer.cpp
@@ -74,6 +74,14 @@ public:
"\nOptimized: " + toHex(optimizedOutput));
}
+ void checkCSE(AssemblyItems const& _input, AssemblyItems const& _expectation)
+ {
+ eth::CommonSubexpressionEliminator cse;
+ BOOST_REQUIRE(cse.feedItems(_input.begin(), _input.end()) == _input.end());
+ AssemblyItems output = cse.getOptimizedItems();
+ BOOST_CHECK_EQUAL_COLLECTIONS(_expectation.begin(), _expectation.end(), output.begin(), output.end());
+ }
+
protected:
Address m_optimizedContract;
Address m_nonOptimizedContract;
@@ -199,61 +207,100 @@ BOOST_AUTO_TEST_CASE(cse_intermediate_swap)
BOOST_AUTO_TEST_CASE(cse_negative_stack_access)
{
- eth::CommonSubexpressionEliminator cse;
- AssemblyItems input{AssemblyItem(Instruction::DUP2), AssemblyItem(u256(0))};
- BOOST_REQUIRE(cse.feedItems(input.begin(), input.end()) == input.end());
- AssemblyItems output = cse.getOptimizedItems();
- BOOST_CHECK_EQUAL_COLLECTIONS(input.begin(), input.end(), output.begin(), output.end());
+ AssemblyItems input{Instruction::DUP2, u256(0)};
+ checkCSE(input, input);
}
BOOST_AUTO_TEST_CASE(cse_negative_stack_end)
{
- eth::CommonSubexpressionEliminator cse;
+ AssemblyItems input{Instruction::ADD};
+ checkCSE(input, input);
+}
+
+BOOST_AUTO_TEST_CASE(cse_intermediate_negative_stack)
+{
+ AssemblyItems input{Instruction::ADD, u256(1), Instruction::DUP1};
+ checkCSE(input, input);
+}
+
+BOOST_AUTO_TEST_CASE(cse_pop)
+{
+ checkCSE({Instruction::POP}, {Instruction::POP});
+}
+
+BOOST_AUTO_TEST_CASE(cse_unneeded_items)
+{
AssemblyItems input{
- AssemblyItem(Instruction::ADD)
+ Instruction::ADD,
+ Instruction::SWAP1,
+ Instruction::POP,
+ u256(7),
+ u256(8),
};
- BOOST_REQUIRE(cse.feedItems(input.begin(), input.end()) == input.end());
- AssemblyItems output = cse.getOptimizedItems();
- BOOST_CHECK_EQUAL_COLLECTIONS(input.begin(), input.end(), output.begin(), output.end());
+ checkCSE(input, input);
}
-BOOST_AUTO_TEST_CASE(cse_intermediate_negative_stack)
+BOOST_AUTO_TEST_CASE(cse_constant_addition)
+{
+ AssemblyItems input{u256(7), u256(8), Instruction::ADD};
+ checkCSE(input, {u256(7 + 8)});
+}
+
+BOOST_AUTO_TEST_CASE(cse_invariants)
{
- eth::CommonSubexpressionEliminator cse;
AssemblyItems input{
- AssemblyItem(Instruction::ADD),
- AssemblyItem(u256(1)),
- AssemblyItem(Instruction::DUP2)
+ Instruction::DUP1,
+ Instruction::DUP1,
+ u256(0),
+ Instruction::OR,
+ Instruction::OR
};
- BOOST_REQUIRE(cse.feedItems(input.begin(), input.end()) == input.end());
- AssemblyItems output = cse.getOptimizedItems();
- BOOST_CHECK_EQUAL_COLLECTIONS(input.begin(), input.end(), output.begin(), output.end());
+ checkCSE(input, {Instruction::DUP1});
}
-BOOST_AUTO_TEST_CASE(cse_pop)
+BOOST_AUTO_TEST_CASE(cse_subself)
+{
+ checkCSE({Instruction::DUP1, Instruction::SUB}, {Instruction::POP, u256(0)});
+}
+
+BOOST_AUTO_TEST_CASE(cse_subother)
+{
+ checkCSE({Instruction::SUB}, {Instruction::SUB});
+}
+
+BOOST_AUTO_TEST_CASE(cse_double_negation)
+{
+ checkCSE({Instruction::DUP5, Instruction::NOT, Instruction::NOT}, {Instruction::DUP5});
+}
+
+BOOST_AUTO_TEST_CASE(cse_associativity)
{
- eth::CommonSubexpressionEliminator cse;
AssemblyItems input{
- AssemblyItem(Instruction::POP)
+ Instruction::DUP1,
+ Instruction::DUP1,
+ u256(0),
+ Instruction::OR,
+ Instruction::OR
};
- BOOST_REQUIRE(cse.feedItems(input.begin(), input.end()) == input.end());
- AssemblyItems output = cse.getOptimizedItems();
- BOOST_CHECK_EQUAL_COLLECTIONS(input.begin(), input.end(), output.begin(), output.end());
+ checkCSE(input, {Instruction::DUP1});
}
-BOOST_AUTO_TEST_CASE(cse_unneeded_items)
+BOOST_AUTO_TEST_CASE(cse_associativity2)
{
- eth::CommonSubexpressionEliminator cse;
AssemblyItems input{
- AssemblyItem(Instruction::ADD),
- AssemblyItem(Instruction::SWAP1),
- AssemblyItem(Instruction::POP),
- AssemblyItem(u256(7)),
- AssemblyItem(u256(8)),
+ u256(0),
+ Instruction::DUP2,
+ u256(2),
+ u256(1),
+ Instruction::DUP6,
+ Instruction::ADD,
+ u256(2),
+ Instruction::ADD,
+ Instruction::ADD,
+ Instruction::ADD,
+ Instruction::ADD
};
- BOOST_REQUIRE(cse.feedItems(input.begin(), input.end()) == input.end());
- AssemblyItems output = cse.getOptimizedItems();
- BOOST_CHECK_EQUAL_COLLECTIONS(input.begin(), input.end(), output.begin(), output.end());
+ checkCSE(input, {Instruction::DUP2, Instruction::DUP2, Instruction::ADD, u256(5), Instruction::ADD});
}
BOOST_AUTO_TEST_SUITE_END()