aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/libsolidity/SolidityEndToEndTest.cpp15
-rw-r--r--test/libyul/YulOptimizerTest.cpp18
-rw-r--r--test/libyul/yulOptimizerTests/blockFlattener/switch_stmt.yul22
-rw-r--r--test/libyul/yulOptimizerTests/commonSubexpressionEliminator/scopes.yul25
-rw-r--r--test/libyul/yulOptimizerTests/disambiguator/long_names.yul12
-rw-r--r--test/libyul/yulOptimizerTests/fullInliner/long_names.yul25
-rw-r--r--test/libyul/yulOptimizerTests/fullSimplify/operations.yul44
-rw-r--r--test/libyul/yulOptimizerTests/fullSimplify/signextend.yul12
-rw-r--r--test/libyul/yulOptimizerTests/ssaTransform/branches.yul25
-rw-r--r--test/libyul/yulOptimizerTests/ssaTransform/for_reassign_body.yul26
-rw-r--r--test/libyul/yulOptimizerTests/ssaTransform/for_reassign_init.yul26
-rw-r--r--test/libyul/yulOptimizerTests/ssaTransform/for_reassign_post.yul26
-rw-r--r--test/libyul/yulOptimizerTests/ssaTransform/for_simple.yul47
-rw-r--r--test/libyul/yulOptimizerTests/ssaTransform/function.yul23
-rw-r--r--test/libyul/yulOptimizerTests/ssaTransform/nested.yul32
-rw-r--r--test/libyul/yulOptimizerTests/ssaTransform/notransform.yul19
-rw-r--r--test/libyul/yulOptimizerTests/ssaTransform/simple.yul18
-rw-r--r--test/libyul/yulOptimizerTests/ssaTransform/switch.yul26
-rw-r--r--test/libyul/yulOptimizerTests/ssaTransform/used.yul39
19 files changed, 473 insertions, 7 deletions
diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp
index 7f865aa1..8d17e56f 100644
--- a/test/libsolidity/SolidityEndToEndTest.cpp
+++ b/test/libsolidity/SolidityEndToEndTest.cpp
@@ -14028,6 +14028,21 @@ BOOST_AUTO_TEST_CASE(test_underscore_in_hex)
ABI_CHECK(callContractFunction("f(bool)", false), encodeArgs(u256(0x1234abcd1234)));
}
+BOOST_AUTO_TEST_CASE(flipping_sign_tests)
+{
+ char const* sourceCode = R"(
+ contract test {
+ function f() public returns (bool){
+ int x = -2**255;
+ assert(-x == x);
+ return true;
+ }
+ }
+ )";
+ compileAndRun(sourceCode);
+ ABI_CHECK(callContractFunction("f()"), encodeArgs(true));
+}
+
BOOST_AUTO_TEST_SUITE_END()
}
diff --git a/test/libyul/YulOptimizerTest.cpp b/test/libyul/YulOptimizerTest.cpp
index 8e4771c8..6782f412 100644
--- a/test/libyul/YulOptimizerTest.cpp
+++ b/test/libyul/YulOptimizerTest.cpp
@@ -35,6 +35,7 @@
#include <libyul/optimiser/ExpressionSimplifier.h>
#include <libyul/optimiser/UnusedPruner.h>
#include <libyul/optimiser/ExpressionJoiner.h>
+#include <libyul/optimiser/SSATransform.h>
#include <libsolidity/parsing/Scanner.h>
#include <libsolidity/inlineasm/AsmPrinter.h>
@@ -106,8 +107,7 @@ bool YulOptimizerTest::run(ostream& _stream, string const& _linePrefix, bool con
}
else if (m_optimizerStep == "expressionSplitter")
{
- NameDispenser nameDispenser;
- nameDispenser.m_usedNames = NameCollector(*m_ast).names();
+ NameDispenser nameDispenser(*m_ast);
ExpressionSplitter{nameDispenser}(*m_ast);
}
else if (m_optimizerStep == "functionGrouper")
@@ -130,10 +130,9 @@ bool YulOptimizerTest::run(ostream& _stream, string const& _linePrefix, bool con
disambiguate();
(FunctionHoister{})(*m_ast);
(FunctionGrouper{})(*m_ast);
- NameDispenser nameDispenser;
- nameDispenser.m_usedNames = NameCollector(*m_ast).names();
+ NameDispenser nameDispenser(*m_ast);
ExpressionSplitter{nameDispenser}(*m_ast);
- FullInliner(*m_ast).run();
+ FullInliner(*m_ast, nameDispenser).run();
ExpressionJoiner::run(*m_ast);
}
else if (m_optimizerStep == "mainFunction")
@@ -155,8 +154,7 @@ bool YulOptimizerTest::run(ostream& _stream, string const& _linePrefix, bool con
else if (m_optimizerStep == "fullSimplify")
{
disambiguate();
- NameDispenser nameDispenser;
- nameDispenser.m_usedNames = NameCollector(*m_ast).names();
+ NameDispenser nameDispenser(*m_ast);
ExpressionSplitter{nameDispenser}(*m_ast);
CommonSubexpressionEliminator{}(*m_ast);
ExpressionSimplifier::run(*m_ast);
@@ -174,6 +172,12 @@ bool YulOptimizerTest::run(ostream& _stream, string const& _linePrefix, bool con
disambiguate();
ExpressionJoiner::run(*m_ast);\
}
+ else if (m_optimizerStep == "ssaTransform")
+ {
+ disambiguate();
+ NameDispenser nameDispenser(*m_ast);
+ SSATransform::run(*m_ast, nameDispenser);
+ }
else
{
FormattedScope(_stream, _formatted, {formatting::BOLD, formatting::RED}) << _linePrefix << "Invalid optimizer step: " << m_optimizerStep << endl;
diff --git a/test/libyul/yulOptimizerTests/blockFlattener/switch_stmt.yul b/test/libyul/yulOptimizerTests/blockFlattener/switch_stmt.yul
new file mode 100644
index 00000000..2df4f9d0
--- /dev/null
+++ b/test/libyul/yulOptimizerTests/blockFlattener/switch_stmt.yul
@@ -0,0 +1,22 @@
+{
+ let a := 1
+ switch calldataload(0)
+ case 0 { { { mstore(0, 1) } } a := 8 }
+ default { a := 3 { a := 4 } }
+ a := 5
+}
+// ----
+// blockFlattener
+// {
+// let a := 1
+// switch calldataload(0)
+// case 0 {
+// mstore(0, 1)
+// a := 8
+// }
+// default {
+// a := 3
+// a := 4
+// }
+// a := 5
+// }
diff --git a/test/libyul/yulOptimizerTests/commonSubexpressionEliminator/scopes.yul b/test/libyul/yulOptimizerTests/commonSubexpressionEliminator/scopes.yul
new file mode 100644
index 00000000..49b4c916
--- /dev/null
+++ b/test/libyul/yulOptimizerTests/commonSubexpressionEliminator/scopes.yul
@@ -0,0 +1,25 @@
+{
+ let a := 10
+ let x := 20
+ {
+ let b := calldataload(0)
+ let d := calldataload(1)
+ x := d
+ }
+ // We had a bug where "calldataload(0)" was incorrectly replaced by "b"
+ mstore(0, calldataload(0))
+ mstore(0, x)
+}
+// ----
+// commonSubexpressionEliminator
+// {
+// let a := 10
+// let x := 20
+// {
+// let b := calldataload(0)
+// let d := calldataload(1)
+// x := d
+// }
+// mstore(0, calldataload(0))
+// mstore(0, x)
+// }
diff --git a/test/libyul/yulOptimizerTests/disambiguator/long_names.yul b/test/libyul/yulOptimizerTests/disambiguator/long_names.yul
new file mode 100644
index 00000000..933e1e8f
--- /dev/null
+++ b/test/libyul/yulOptimizerTests/disambiguator/long_names.yul
@@ -0,0 +1,12 @@
+// yul
+{ { let aanteuhdaoneudbrgkjiuaothduiathudaoeuh:u256 } { let aanteuhdaoneudbrgkjiuaothduiathudaoeuh:u256 } }
+// ----
+// disambiguator
+// {
+// {
+// let aanteuhdaoneudbrgkjiuaothduiathudaoeuh:u256
+// }
+// {
+// let aanteuhdaoneudbrgkjiuaothduiathudaoeuh_1:u256
+// }
+// }
diff --git a/test/libyul/yulOptimizerTests/fullInliner/long_names.yul b/test/libyul/yulOptimizerTests/fullInliner/long_names.yul
new file mode 100644
index 00000000..644e9126
--- /dev/null
+++ b/test/libyul/yulOptimizerTests/fullInliner/long_names.yul
@@ -0,0 +1,25 @@
+{
+ function verylongfunctionname(verylongvariablename) -> verylongvariablename2 {
+ verylongvariablename2 := add(verylongvariablename, verylongvariablename)
+ }
+ // same long name
+ let verylongvariablename2 := 3
+ mstore(0, verylongfunctionname(verylongvariablename2))
+ mstore(1, verylongvariablename2)
+}
+// ----
+// fullInliner
+// {
+// {
+// let verylongvariablename2_1 := 3
+// let verylongfu_verylongvariablename := verylongvariablename2_1
+// let verylongfu_verylongvariablename2
+// verylongfu_verylongvariablename2 := add(verylongfu_verylongvariablename, verylongfu_verylongvariablename)
+// mstore(0, verylongfu_verylongvariablename2)
+// mstore(1, verylongvariablename2_1)
+// }
+// function verylongfunctionname(verylongvariablename) -> verylongvariablename2
+// {
+// verylongvariablename2 := add(verylongvariablename, verylongvariablename)
+// }
+// }
diff --git a/test/libyul/yulOptimizerTests/fullSimplify/operations.yul b/test/libyul/yulOptimizerTests/fullSimplify/operations.yul
new file mode 100644
index 00000000..25467b62
--- /dev/null
+++ b/test/libyul/yulOptimizerTests/fullSimplify/operations.yul
@@ -0,0 +1,44 @@
+{
+ let x := mload(0)
+ mstore(1, mul(x, 0))
+ mstore(2, div(x, 0))
+ mstore(3, div(0, x))
+ mstore(4, sdiv(x, 0))
+ mstore(5, sdiv(0, x))
+ mstore(6, and(0, x))
+ mstore(7, and(x, 0))
+ mstore(8, mod(0, x))
+ mstore(9, mod(x, 0))
+ mstore(10, lt(x, x))
+ mstore(11, gt(x, x))
+ mstore(12, slt(x, x))
+ mstore(13, sgt(x, x))
+ mstore(14, mod(x, x))
+ mstore(15, and(x, not(x)))
+ mstore(16, and(not(x), x))
+ mstore(17, or(x, not(x)))
+ mstore(18, or(not(x), x))
+}
+// ----
+// fullSimplify
+// {
+// pop(mload(0))
+// mstore(1, 0)
+// mstore(2, 0)
+// mstore(3, 0)
+// mstore(4, 0)
+// mstore(5, 0)
+// mstore(6, 0)
+// mstore(7, 0)
+// mstore(8, 0)
+// mstore(9, 0)
+// mstore(10, 0)
+// mstore(11, 0)
+// mstore(12, 0)
+// mstore(13, 0)
+// mstore(14, 0)
+// mstore(15, 0)
+// mstore(16, 0)
+// mstore(17, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
+// mstore(18, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
+// }
diff --git a/test/libyul/yulOptimizerTests/fullSimplify/signextend.yul b/test/libyul/yulOptimizerTests/fullSimplify/signextend.yul
new file mode 100644
index 00000000..714eb860
--- /dev/null
+++ b/test/libyul/yulOptimizerTests/fullSimplify/signextend.yul
@@ -0,0 +1,12 @@
+{
+ let x := 7
+ mstore(0, signextend(50, x))
+ let y := 255
+ mstore(1, signextend(0, y))
+}
+// ----
+// fullSimplify
+// {
+// mstore(0, 7)
+// mstore(1, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
+// }
diff --git a/test/libyul/yulOptimizerTests/ssaTransform/branches.yul b/test/libyul/yulOptimizerTests/ssaTransform/branches.yul
new file mode 100644
index 00000000..c089fe70
--- /dev/null
+++ b/test/libyul/yulOptimizerTests/ssaTransform/branches.yul
@@ -0,0 +1,25 @@
+{
+ let a := 1
+ a := add(a, 1)
+ if a {
+ a := add(a, 1)
+ }
+ a := add(a, 1)
+ mstore(a, 1)
+}
+// ----
+// ssaTransform
+// {
+// let a_1 := 1
+// let a := a_1
+// let a_2 := add(a_1, 1)
+// a := a_2
+// if a_2
+// {
+// let a_3 := add(a_2, 1)
+// a := a_3
+// }
+// let a_4 := add(a, 1)
+// a := a_4
+// mstore(a_4, 1)
+// }
diff --git a/test/libyul/yulOptimizerTests/ssaTransform/for_reassign_body.yul b/test/libyul/yulOptimizerTests/ssaTransform/for_reassign_body.yul
new file mode 100644
index 00000000..41640346
--- /dev/null
+++ b/test/libyul/yulOptimizerTests/ssaTransform/for_reassign_body.yul
@@ -0,0 +1,26 @@
+{
+ let a := mload(0)
+ for { mstore(0, a) } a { mstore(0, a) }
+ {
+ a := add(a, 3)
+ }
+ mstore(0, a)
+}
+// ----
+// ssaTransform
+// {
+// let a_1 := mload(0)
+// let a := a_1
+// for {
+// mstore(0, a_1)
+// }
+// a
+// {
+// mstore(0, a)
+// }
+// {
+// let a_2 := add(a, 3)
+// a := a_2
+// }
+// mstore(0, a)
+// }
diff --git a/test/libyul/yulOptimizerTests/ssaTransform/for_reassign_init.yul b/test/libyul/yulOptimizerTests/ssaTransform/for_reassign_init.yul
new file mode 100644
index 00000000..821a5b2a
--- /dev/null
+++ b/test/libyul/yulOptimizerTests/ssaTransform/for_reassign_init.yul
@@ -0,0 +1,26 @@
+{
+ let a := mload(0)
+ for { a := add(a, 3) } a { mstore(0, a) }
+ {
+ mstore(0, a)
+ }
+ mstore(0, a)
+}
+// ----
+// ssaTransform
+// {
+// let a_1 := mload(0)
+// let a := a_1
+// for {
+// let a_2 := add(a_1, 3)
+// a := a_2
+// }
+// a
+// {
+// mstore(0, a)
+// }
+// {
+// mstore(0, a)
+// }
+// mstore(0, a)
+// }
diff --git a/test/libyul/yulOptimizerTests/ssaTransform/for_reassign_post.yul b/test/libyul/yulOptimizerTests/ssaTransform/for_reassign_post.yul
new file mode 100644
index 00000000..1fc075bc
--- /dev/null
+++ b/test/libyul/yulOptimizerTests/ssaTransform/for_reassign_post.yul
@@ -0,0 +1,26 @@
+{
+ let a := mload(0)
+ for { mstore(0, a) } a { a := add(a, 3) }
+ {
+ mstore(0, a)
+ }
+ mstore(0, a)
+}
+// ----
+// ssaTransform
+// {
+// let a_1 := mload(0)
+// let a := a_1
+// for {
+// mstore(0, a_1)
+// }
+// a
+// {
+// let a_2 := add(a, 3)
+// a := a_2
+// }
+// {
+// mstore(0, a)
+// }
+// mstore(0, a)
+// }
diff --git a/test/libyul/yulOptimizerTests/ssaTransform/for_simple.yul b/test/libyul/yulOptimizerTests/ssaTransform/for_simple.yul
new file mode 100644
index 00000000..273d3811
--- /dev/null
+++ b/test/libyul/yulOptimizerTests/ssaTransform/for_simple.yul
@@ -0,0 +1,47 @@
+{
+ let a := mload(0)
+ a := add(a, 1)
+ if a {
+ a := add(a, 2)
+ }
+ {
+ a := add(a, 4)
+ }
+ for { a := add(a, 3) } a { a := add(a, 6) }
+ {
+ a := add(a, 12)
+ }
+ a := add(a, 8)
+}
+// ----
+// ssaTransform
+// {
+// let a_1 := mload(0)
+// let a := a_1
+// let a_2 := add(a_1, 1)
+// a := a_2
+// if a_2
+// {
+// let a_3 := add(a_2, 2)
+// a := a_3
+// }
+// {
+// let a_4 := add(a, 4)
+// a := a_4
+// }
+// for {
+// let a_5 := add(a, 3)
+// a := a_5
+// }
+// a
+// {
+// let a_7 := add(a, 6)
+// a := a_7
+// }
+// {
+// let a_6 := add(a, 12)
+// a := a_6
+// }
+// let a_8 := add(a, 8)
+// a := a_8
+// }
diff --git a/test/libyul/yulOptimizerTests/ssaTransform/function.yul b/test/libyul/yulOptimizerTests/ssaTransform/function.yul
new file mode 100644
index 00000000..b319d12e
--- /dev/null
+++ b/test/libyul/yulOptimizerTests/ssaTransform/function.yul
@@ -0,0 +1,23 @@
+{
+ function f(a, b) -> c, d {
+ b := add(b, a)
+ c := add(c, b)
+ d := add(d, c)
+ a := add(a, d)
+ }
+}
+// ----
+// ssaTransform
+// {
+// function f(a, b) -> c, d
+// {
+// let b_1 := add(b, a)
+// b := b_1
+// let c_1 := add(c, b_1)
+// c := c_1
+// let d_1 := add(d, c_1)
+// d := d_1
+// let a_1 := add(a, d_1)
+// a := a_1
+// }
+// }
diff --git a/test/libyul/yulOptimizerTests/ssaTransform/nested.yul b/test/libyul/yulOptimizerTests/ssaTransform/nested.yul
new file mode 100644
index 00000000..55adfc37
--- /dev/null
+++ b/test/libyul/yulOptimizerTests/ssaTransform/nested.yul
@@ -0,0 +1,32 @@
+{
+ let a := 1
+ a := 2
+ let b := 3
+ b := 4
+ {
+ // b is not reassigned here
+ a := 3
+ a := 4
+ }
+ a := add(b, a)
+}
+// ----
+// ssaTransform
+// {
+// let a_1 := 1
+// let a := a_1
+// let a_2 := 2
+// a := a_2
+// let b_1 := 3
+// let b := b_1
+// let b_2 := 4
+// b := b_2
+// {
+// let a_3 := 3
+// a := a_3
+// let a_4 := 4
+// a := a_4
+// }
+// let a_5 := add(b_2, a)
+// a := a_5
+// }
diff --git a/test/libyul/yulOptimizerTests/ssaTransform/notransform.yul b/test/libyul/yulOptimizerTests/ssaTransform/notransform.yul
new file mode 100644
index 00000000..297905c6
--- /dev/null
+++ b/test/libyul/yulOptimizerTests/ssaTransform/notransform.yul
@@ -0,0 +1,19 @@
+{
+ let a := 1
+ // this should not be transformed
+ let b := add(a, 2)
+ let c
+ mstore(c, 0)
+ c := add(a, b)
+}
+// ----
+// ssaTransform
+// {
+// let a := 1
+// let b := add(a, 2)
+// let c_1
+// let c := c_1
+// mstore(c_1, 0)
+// let c_2 := add(a, b)
+// c := c_2
+// }
diff --git a/test/libyul/yulOptimizerTests/ssaTransform/simple.yul b/test/libyul/yulOptimizerTests/ssaTransform/simple.yul
new file mode 100644
index 00000000..6dbce729
--- /dev/null
+++ b/test/libyul/yulOptimizerTests/ssaTransform/simple.yul
@@ -0,0 +1,18 @@
+{
+ let a := 1
+ a := 2
+ a := 3
+ a := 4
+}
+// ----
+// ssaTransform
+// {
+// let a_1 := 1
+// let a := a_1
+// let a_2 := 2
+// a := a_2
+// let a_3 := 3
+// a := a_3
+// let a_4 := 4
+// a := a_4
+// }
diff --git a/test/libyul/yulOptimizerTests/ssaTransform/switch.yul b/test/libyul/yulOptimizerTests/ssaTransform/switch.yul
new file mode 100644
index 00000000..bc9b55bb
--- /dev/null
+++ b/test/libyul/yulOptimizerTests/ssaTransform/switch.yul
@@ -0,0 +1,26 @@
+{
+ let a := mload(0)
+ // This could be more efficient:
+ // all cases could use the value of the variable from just before
+ // the switch and not just the first
+ switch a
+ case 0 { a := add(a, 4) }
+ default { a := add(a, 8) }
+ mstore(0, a)
+}
+// ----
+// ssaTransform
+// {
+// let a_1 := mload(0)
+// let a := a_1
+// switch a_1
+// case 0 {
+// let a_2 := add(a_1, 4)
+// a := a_2
+// }
+// default {
+// let a_3 := add(a, 8)
+// a := a_3
+// }
+// mstore(0, a)
+// }
diff --git a/test/libyul/yulOptimizerTests/ssaTransform/used.yul b/test/libyul/yulOptimizerTests/ssaTransform/used.yul
new file mode 100644
index 00000000..ad686ca1
--- /dev/null
+++ b/test/libyul/yulOptimizerTests/ssaTransform/used.yul
@@ -0,0 +1,39 @@
+{
+ let a := 1
+ mstore(a, 0)
+ a := 2
+ mstore(a, 0)
+ {
+ mstore(a, 0)
+ a := 3
+ mstore(a, 0)
+ a := 4
+ mstore(a, 0)
+ }
+ mstore(a, 0)
+ a := 4
+ mstore(a, 0)
+}
+// ----
+// ssaTransform
+// {
+// let a_1 := 1
+// let a := a_1
+// mstore(a_1, 0)
+// let a_2 := 2
+// a := a_2
+// mstore(a_2, 0)
+// {
+// mstore(a_2, 0)
+// let a_3 := 3
+// a := a_3
+// mstore(a_3, 0)
+// let a_4 := 4
+// a := a_4
+// mstore(a_4, 0)
+// }
+// mstore(a, 0)
+// let a_5 := 4
+// a := a_5
+// mstore(a_5, 0)
+// }