aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--test/libjulia/ExpressionSplitter.cpp156
-rw-r--r--test/libjulia/YulOptimizerTest.cpp8
-rw-r--r--test/libjulia/yulOptimizerTests/expressionSplitter/control_flow.yul33
-rw-r--r--test/libjulia/yulOptimizerTests/expressionSplitter/inside_function.yul24
-rw-r--r--test/libjulia/yulOptimizerTests/expressionSplitter/smoke.yul5
-rw-r--r--test/libjulia/yulOptimizerTests/expressionSplitter/switch.yul25
-rw-r--r--test/libjulia/yulOptimizerTests/expressionSplitter/trivial.yul11
7 files changed, 106 insertions, 156 deletions
diff --git a/test/libjulia/ExpressionSplitter.cpp b/test/libjulia/ExpressionSplitter.cpp
deleted file mode 100644
index 9707fa86..00000000
--- a/test/libjulia/ExpressionSplitter.cpp
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- This file is part of solidity.
-
- solidity is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- solidity is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with solidity. If not, see <http://www.gnu.org/licenses/>.
-*/
-/**
- * Unit tests for the expression breaker.
- */
-
-#include <test/libjulia/Common.h>
-
-#include <libjulia/optimiser/ExpressionSplitter.h>
-#include <libjulia/optimiser/NameCollector.h>
-
-#include <libsolidity/inlineasm/AsmPrinter.h>
-
-#include <boost/test/unit_test.hpp>
-
-#include <boost/range/adaptors.hpp>
-#include <boost/algorithm/string/join.hpp>
-
-using namespace std;
-using namespace dev;
-using namespace dev::julia;
-using namespace dev::julia::test;
-using namespace dev::solidity;
-
-
-#define CHECK(_original, _expectation)\
-do\
-{\
- auto result = parse(_original, false);\
- NameDispenser nameDispenser;\
- nameDispenser.m_usedNames = NameCollector(*result.first).names();\
- ExpressionSplitter{nameDispenser}(*result.first);\
- BOOST_CHECK_EQUAL(assembly::AsmPrinter{}(*result.first), format(_expectation, false));\
-}\
-while(false)
-
-BOOST_AUTO_TEST_SUITE(YulExpressionSplitter)
-
-BOOST_AUTO_TEST_CASE(smoke_test)
-{
- CHECK("{ }", "{ }");
-}
-
-BOOST_AUTO_TEST_CASE(trivial)
-{
- CHECK(
- "{ mstore(add(calldataload(2), mload(3)), 8) }",
- "{ let _1 := mload(3) let _2 := calldataload(2) let _3 := add(_2, _1) mstore(_3, 8) }"
- );
-}
-
-BOOST_AUTO_TEST_CASE(control_flow)
-{
- string input = R"({
- let x := calldataload(0)
- if mul(add(x, 2), 3) {
- for { let a := 2 } lt(a, mload(a)) { a := add(a, mul(a, 2)) } {
- let b := mul(add(a, 2), 4)
- sstore(b, mul(b, 2))
- }
- }
- })";
- string expectation = R"({
- let x := calldataload(0)
- let _1 := add(x, 2)
- let _2 := mul(_1, 3)
- if _2
- {
- for { let a := 2 } lt(a, mload(a))
- {
- let _3 := mul(a, 2)
- a := add(a, _3)
- }
- {
- let _4 := add(a, 2)
- let b := mul(_4, 4)
- let _5 := mul(b, 2)
- sstore(b, _5)
- }
- }
- })";
- CHECK(input, expectation);
-}
-
-BOOST_AUTO_TEST_CASE(switch_)
-{
- string input = R"({
- let x := 8
- switch add(2, calldataload(0))
- case 0 { sstore(0, mload(2)) }
- default { mstore(0, mload(3)) }
- x := add(mload(3), 4)
- })";
- string expectation = R"({
- let x := 8
- let _1 := calldataload(0)
- let _2 := add(2, _1)
- switch _2
- case 0 {
- let _3 := mload(2)
- sstore(0, _3)
- }
- default {
- let _4 := mload(3)
- mstore(0, _4)
- }
- let _5 := mload(3)
- x := add(_5, 4)
- })";
-
- CHECK(input, expectation);
-}
-
-BOOST_AUTO_TEST_CASE(inside_function)
-{
- string input = R"({
- let x := mul(f(0, mload(7)), 3)
- function f(a, b) -> c {
- c := mul(a, mload(add(b, c)))
- }
- sstore(x, f(mload(2), mload(2)))
- })";
- string expectation = R"({
- let _1 := mload(7)
- let _2 := f(0, _1)
- let x := mul(_2, 3)
- function f(a, b) -> c
- {
- let _3 := add(b, c)
- let _4 := mload(_3)
- c := mul(a, _4)
- }
- let _5 := mload(2)
- let _6 := mload(2)
- let _7 := f(_6, _5)
- sstore(x, _7)
- })";
-
- CHECK(input, expectation);
-}
-
-BOOST_AUTO_TEST_SUITE_END()
diff --git a/test/libjulia/YulOptimizerTest.cpp b/test/libjulia/YulOptimizerTest.cpp
index 75a3d69b..e8c88b67 100644
--- a/test/libjulia/YulOptimizerTest.cpp
+++ b/test/libjulia/YulOptimizerTest.cpp
@@ -23,6 +23,8 @@
#include <libjulia/optimiser/Disambiguator.h>
#include <libjulia/optimiser/CommonSubexpressionEliminator.h>
+#include <libjulia/optimiser/NameCollector.h>
+#include <libjulia/optimiser/ExpressionSplitter.h>
#include <libsolidity/parsing/Scanner.h>
#include <libsolidity/inlineasm/AsmPrinter.h>
@@ -87,6 +89,12 @@ bool YulOptimizerTest::run(ostream& _stream, string const& _linePrefix, bool con
disambiguate();
(CommonSubexpressionEliminator{})(*m_ast);
}
+ else if (m_optimizerStep == "expressionSplitter")
+ {
+ NameDispenser nameDispenser;
+ nameDispenser.m_usedNames = NameCollector(*m_ast).names();
+ ExpressionSplitter{nameDispenser}(*m_ast);
+ }
else
{
FormattedScope(_stream, _formatted, {formatting::BOLD, formatting::RED}) << _linePrefix << "Invalid optimizer step: " << m_optimizerStep << endl;
diff --git a/test/libjulia/yulOptimizerTests/expressionSplitter/control_flow.yul b/test/libjulia/yulOptimizerTests/expressionSplitter/control_flow.yul
new file mode 100644
index 00000000..5cc5a17d
--- /dev/null
+++ b/test/libjulia/yulOptimizerTests/expressionSplitter/control_flow.yul
@@ -0,0 +1,33 @@
+{
+ let x := calldataload(0)
+ if mul(add(x, 2), 3) {
+ for { let a := 2 } lt(a, mload(a)) { a := add(a, mul(a, 2)) } {
+ let b := mul(add(a, 2), 4)
+ sstore(b, mul(b, 2))
+ }
+ }
+}
+// ----
+// expressionSplitter
+// {
+// let x := calldataload(0)
+// let _1 := add(x, 2)
+// let _2 := mul(_1, 3)
+// if _2
+// {
+// for {
+// let a := 2
+// }
+// lt(a, mload(a))
+// {
+// let _3 := mul(a, 2)
+// a := add(a, _3)
+// }
+// {
+// let _4 := add(a, 2)
+// let b := mul(_4, 4)
+// let _5 := mul(b, 2)
+// sstore(b, _5)
+// }
+// }
+// }
diff --git a/test/libjulia/yulOptimizerTests/expressionSplitter/inside_function.yul b/test/libjulia/yulOptimizerTests/expressionSplitter/inside_function.yul
new file mode 100644
index 00000000..8623f15d
--- /dev/null
+++ b/test/libjulia/yulOptimizerTests/expressionSplitter/inside_function.yul
@@ -0,0 +1,24 @@
+{
+ let x := mul(f(0, mload(7)), 3)
+ function f(a, b) -> c {
+ c := mul(a, mload(add(b, c)))
+ }
+ sstore(x, f(mload(2), mload(2)))
+}
+// ----
+// expressionSplitter
+// {
+// let _1 := mload(7)
+// let _2 := f(0, _1)
+// let x := mul(_2, 3)
+// function f(a, b) -> c
+// {
+// let _3 := add(b, c)
+// let _4 := mload(_3)
+// c := mul(a, _4)
+// }
+// let _5 := mload(2)
+// let _6 := mload(2)
+// let _7 := f(_6, _5)
+// sstore(x, _7)
+// }
diff --git a/test/libjulia/yulOptimizerTests/expressionSplitter/smoke.yul b/test/libjulia/yulOptimizerTests/expressionSplitter/smoke.yul
new file mode 100644
index 00000000..f69f60b6
--- /dev/null
+++ b/test/libjulia/yulOptimizerTests/expressionSplitter/smoke.yul
@@ -0,0 +1,5 @@
+{ }
+// ----
+// expressionSplitter
+// {
+// }
diff --git a/test/libjulia/yulOptimizerTests/expressionSplitter/switch.yul b/test/libjulia/yulOptimizerTests/expressionSplitter/switch.yul
new file mode 100644
index 00000000..bda613b7
--- /dev/null
+++ b/test/libjulia/yulOptimizerTests/expressionSplitter/switch.yul
@@ -0,0 +1,25 @@
+{
+ let x := 8
+ switch add(2, calldataload(0))
+ case 0 { sstore(0, mload(2)) }
+ default { mstore(0, mload(3)) }
+ x := add(mload(3), 4)
+}
+// ----
+// expressionSplitter
+// {
+// let x := 8
+// let _1 := calldataload(0)
+// let _2 := add(2, _1)
+// switch _2
+// case 0 {
+// let _3 := mload(2)
+// sstore(0, _3)
+// }
+// default {
+// let _4 := mload(3)
+// mstore(0, _4)
+// }
+// let _5 := mload(3)
+// x := add(_5, 4)
+// }
diff --git a/test/libjulia/yulOptimizerTests/expressionSplitter/trivial.yul b/test/libjulia/yulOptimizerTests/expressionSplitter/trivial.yul
new file mode 100644
index 00000000..632855a5
--- /dev/null
+++ b/test/libjulia/yulOptimizerTests/expressionSplitter/trivial.yul
@@ -0,0 +1,11 @@
+{
+ mstore(add(calldataload(2), mload(3)), 8)
+}
+// ----
+// expressionSplitter
+// {
+// let _1 := mload(3)
+// let _2 := calldataload(2)
+// let _3 := add(_2, _1)
+// mstore(_3, 8)
+// }