aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorChristian Parpart <christian@parpart.family>2018-10-15 21:17:20 +0800
committerChristian Parpart <christian@ethereum.org>2018-10-16 00:21:34 +0800
commit04612936c2ceb41e1c63bfa637eb65f000319c23 (patch)
treebacc0409559b46e2eb00f25f9872280da30a268e /test
parent238494752192a2c834eb8913b244671afb48d693 (diff)
downloaddexon-solidity-04612936c2ceb41e1c63bfa637eb65f000319c23.tar
dexon-solidity-04612936c2ceb41e1c63bfa637eb65f000319c23.tar.gz
dexon-solidity-04612936c2ceb41e1c63bfa637eb65f000319c23.tar.bz2
dexon-solidity-04612936c2ceb41e1c63bfa637eb65f000319c23.tar.lz
dexon-solidity-04612936c2ceb41e1c63bfa637eb65f000319c23.tar.xz
dexon-solidity-04612936c2ceb41e1c63bfa637eb65f000319c23.tar.zst
dexon-solidity-04612936c2ceb41e1c63bfa637eb65f000319c23.zip
Yul: Introduces a block flattening pass + tests
Diffstat (limited to 'test')
-rw-r--r--test/libyul/YulOptimizerTest.cpp6
-rw-r--r--test/libyul/yulOptimizerTests/blockFlattener/basic.yul20
-rw-r--r--test/libyul/yulOptimizerTests/blockFlattener/for_stmt.yul19
-rw-r--r--test/libyul/yulOptimizerTests/blockFlattener/if_stmt.yul20
-rw-r--r--test/libyul/yulOptimizerTests/blockFlattener/many_nested_blocks.yul28
5 files changed, 93 insertions, 0 deletions
diff --git a/test/libyul/YulOptimizerTest.cpp b/test/libyul/YulOptimizerTest.cpp
index 8b37830f..ea8e4b5e 100644
--- a/test/libyul/YulOptimizerTest.cpp
+++ b/test/libyul/YulOptimizerTest.cpp
@@ -21,6 +21,7 @@
#include <test/Options.h>
+#include <libyul/optimiser/BlockFlattener.h>
#include <libyul/optimiser/Disambiguator.h>
#include <libyul/optimiser/CommonSubexpressionEliminator.h>
#include <libyul/optimiser/NameCollector.h>
@@ -93,6 +94,11 @@ bool YulOptimizerTest::run(ostream& _stream, string const& _linePrefix, bool con
if (m_optimizerStep == "disambiguator")
disambiguate();
+ else if (m_optimizerStep == "blockFlattener")
+ {
+ disambiguate();
+ BlockFlattener{}(*m_ast);
+ }
else if (m_optimizerStep == "commonSubexpressionEliminator")
{
disambiguate();
diff --git a/test/libyul/yulOptimizerTests/blockFlattener/basic.yul b/test/libyul/yulOptimizerTests/blockFlattener/basic.yul
new file mode 100644
index 00000000..adcaedd0
--- /dev/null
+++ b/test/libyul/yulOptimizerTests/blockFlattener/basic.yul
@@ -0,0 +1,20 @@
+{
+ let _1 := mload(0)
+ let f_a := mload(1)
+ let f_r
+ {
+ f_a := mload(f_a)
+ f_r := add(f_a, calldatasize())
+ }
+ let z := mload(2)
+}
+// ----
+// blockFlattener
+// {
+// let _1 := mload(0)
+// let f_a := mload(1)
+// let f_r
+// f_a := mload(f_a)
+// f_r := add(f_a, calldatasize())
+// let z := mload(2)
+// }
diff --git a/test/libyul/yulOptimizerTests/blockFlattener/for_stmt.yul b/test/libyul/yulOptimizerTests/blockFlattener/for_stmt.yul
new file mode 100644
index 00000000..07bd5c18
--- /dev/null
+++ b/test/libyul/yulOptimizerTests/blockFlattener/for_stmt.yul
@@ -0,0 +1,19 @@
+{
+ for { let a := 1 } iszero(eq(a, 10)) { a := add(a, 1) } {
+ a := add(a, 1)
+ }
+}
+// ----
+// blockFlattener
+// {
+// for {
+// let a := 1
+// }
+// iszero(eq(a, 10))
+// {
+// a := add(a, 1)
+// }
+// {
+// a := add(a, 1)
+// }
+// }
diff --git a/test/libyul/yulOptimizerTests/blockFlattener/if_stmt.yul b/test/libyul/yulOptimizerTests/blockFlattener/if_stmt.yul
new file mode 100644
index 00000000..4d6ccf0e
--- /dev/null
+++ b/test/libyul/yulOptimizerTests/blockFlattener/if_stmt.yul
@@ -0,0 +1,20 @@
+{
+ if add(mload(7), sload(mload(3)))
+ {
+ let y := add(mload(3), 3)
+ {
+ y := add(y, 7)
+ }
+ }
+ let t := add(3, 9)
+}
+// ----
+// blockFlattener
+// {
+// if add(mload(7), sload(mload(3)))
+// {
+// let y := add(mload(3), 3)
+// y := add(y, 7)
+// }
+// let t := add(3, 9)
+// }
diff --git a/test/libyul/yulOptimizerTests/blockFlattener/many_nested_blocks.yul b/test/libyul/yulOptimizerTests/blockFlattener/many_nested_blocks.yul
new file mode 100644
index 00000000..ae2a066b
--- /dev/null
+++ b/test/libyul/yulOptimizerTests/blockFlattener/many_nested_blocks.yul
@@ -0,0 +1,28 @@
+{
+ let a := 3
+ let b := 4
+ {
+ a := add(b, 3)
+ let c := 5
+ {
+ b := add(b, 4)
+ {
+ c := add(a, 5)
+ }
+ b := add(a, b)
+ }
+ a := add(a, c)
+ }
+}
+// ----
+// blockFlattener
+// {
+// let a := 3
+// let b := 4
+// a := add(b, 3)
+// let c := 5
+// b := add(b, 4)
+// c := add(a, 5)
+// b := add(a, b)
+// a := add(a, c)
+// }