diff options
author | chriseth <chris@ethereum.org> | 2018-10-11 20:48:57 +0800 |
---|---|---|
committer | chriseth <chris@ethereum.org> | 2018-10-12 00:41:26 +0800 |
commit | 33ac415f7fd3e05727959d2fd4963910f2763ab8 (patch) | |
tree | 64946f861826a915053dd5e3d2426938be166087 | |
parent | 5f5dc8956d39ab19c5408aa4c39a3cd10d3a2dec (diff) | |
download | dexon-solidity-33ac415f7fd3e05727959d2fd4963910f2763ab8.tar.gz dexon-solidity-33ac415f7fd3e05727959d2fd4963910f2763ab8.tar.zst dexon-solidity-33ac415f7fd3e05727959d2fd4963910f2763ab8.zip |
Move common subexpression eliminator tests.
8 files changed, 81 insertions, 102 deletions
diff --git a/test/libjulia/CommonSubexpression.cpp b/test/libjulia/CommonSubexpression.cpp deleted file mode 100644 index 6c8edf1f..00000000 --- a/test/libjulia/CommonSubexpression.cpp +++ /dev/null @@ -1,102 +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 common subexpression eliminator optimizer stage. - */ - -#include <test/libjulia/Common.h> - -#include <libjulia/optimiser/CommonSubexpressionEliminator.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\ -{\ - assembly::AsmPrinter p;\ - Block b = disambiguate(_original, false);\ - (CommonSubexpressionEliminator{})(b);\ - string result = p(b);\ - BOOST_CHECK_EQUAL(result, format(_expectation, false));\ -}\ -while(false) - -BOOST_AUTO_TEST_SUITE(YulCSE) - -BOOST_AUTO_TEST_CASE(smoke_test) -{ - CHECK("{ }", "{ }"); -} - -BOOST_AUTO_TEST_CASE(trivial) -{ - CHECK( - "{ let a := mul(1, codesize()) let b := mul(1, codesize()) }", - "{ let a := mul(1, codesize()) let b := a }" - ); -} - -BOOST_AUTO_TEST_CASE(non_movable_instr) -{ - CHECK( - "{ let a := mload(1) let b := mload(1) }", - "{ let a := mload(1) let b := mload(1) }" - ); -} - -BOOST_AUTO_TEST_CASE(non_movable_instr2) -{ - CHECK( - "{ let a := gas() let b := gas() }", - "{ let a := gas() let b := gas() }" - ); -} - -BOOST_AUTO_TEST_CASE(branches_if) -{ - CHECK( - "{ let b := 1 if b { b := 1 } let c := 1 }", - "{ let b := 1 if b { b := b } let c := 1 }" - ); -} - -BOOST_AUTO_TEST_CASE(branches_for) -{ - CHECK( - "{ let a := 1 let b := codesize()" - "for { } lt(1, codesize()) { mstore(1, codesize()) a := add(a, codesize()) }" - "{ mstore(1, codesize()) } mstore(1, codesize()) }", - - "{ let a := 1 let b := codesize()" - "for { } lt(1, b) { mstore(1, b) a := add(a, b) }" - "{ mstore(1, b) } mstore(1, b) }" - ); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/test/libjulia/YulOptimizerTest.cpp b/test/libjulia/YulOptimizerTest.cpp index fd15623c..75a3d69b 100644 --- a/test/libjulia/YulOptimizerTest.cpp +++ b/test/libjulia/YulOptimizerTest.cpp @@ -22,6 +22,8 @@ #include <test/Options.h> #include <libjulia/optimiser/Disambiguator.h> +#include <libjulia/optimiser/CommonSubexpressionEliminator.h> + #include <libsolidity/parsing/Scanner.h> #include <libsolidity/inlineasm/AsmPrinter.h> #include <libsolidity/inlineasm/AsmParser.h> @@ -80,6 +82,11 @@ bool YulOptimizerTest::run(ostream& _stream, string const& _linePrefix, bool con if (m_optimizerStep == "disambiguator") disambiguate(); + else if (m_optimizerStep == "commonSubexpressionEliminator") + { + disambiguate(); + (CommonSubexpressionEliminator{})(*m_ast); + } else { FormattedScope(_stream, _formatted, {formatting::BOLD, formatting::RED}) << _linePrefix << "Invalid optimizer step: " << m_optimizerStep << endl; diff --git a/test/libjulia/yulOptimizerTests/commonSubexpressionEliminator/branches_for.yul b/test/libjulia/yulOptimizerTests/commonSubexpressionEliminator/branches_for.yul new file mode 100644 index 00000000..c59bced7 --- /dev/null +++ b/test/libjulia/yulOptimizerTests/commonSubexpressionEliminator/branches_for.yul @@ -0,0 +1,24 @@ +{ + let a := 1 let b := codesize() + for { } lt(1, codesize()) { mstore(1, codesize()) a := add(a, codesize()) } { + mstore(1, codesize()) + } + mstore(1, codesize()) +} +// ---- +// commonSubexpressionEliminator +// { +// let a := 1 +// let b := codesize() +// for { +// } +// lt(1, b) +// { +// mstore(1, b) +// a := add(a, b) +// } +// { +// mstore(1, b) +// } +// mstore(1, b) +// } diff --git a/test/libjulia/yulOptimizerTests/commonSubexpressionEliminator/branches_if.yul b/test/libjulia/yulOptimizerTests/commonSubexpressionEliminator/branches_if.yul new file mode 100644 index 00000000..5b8200d9 --- /dev/null +++ b/test/libjulia/yulOptimizerTests/commonSubexpressionEliminator/branches_if.yul @@ -0,0 +1,15 @@ +{ + let b := 1 + if b { b := 1 } + let c := 1 +} +// ---- +// commonSubexpressionEliminator +// { +// let b := 1 +// if b +// { +// b := b +// } +// let c := 1 +// } diff --git a/test/libjulia/yulOptimizerTests/commonSubexpressionEliminator/non_movable_instr.yul b/test/libjulia/yulOptimizerTests/commonSubexpressionEliminator/non_movable_instr.yul new file mode 100644 index 00000000..cb0ca38d --- /dev/null +++ b/test/libjulia/yulOptimizerTests/commonSubexpressionEliminator/non_movable_instr.yul @@ -0,0 +1,10 @@ +{ + let a := mload(1) + let b := mload(1) +} +// ---- +// commonSubexpressionEliminator +// { +// let a := mload(1) +// let b := mload(1) +// } diff --git a/test/libjulia/yulOptimizerTests/commonSubexpressionEliminator/non_movable_instr2.yul b/test/libjulia/yulOptimizerTests/commonSubexpressionEliminator/non_movable_instr2.yul new file mode 100644 index 00000000..ebc17446 --- /dev/null +++ b/test/libjulia/yulOptimizerTests/commonSubexpressionEliminator/non_movable_instr2.yul @@ -0,0 +1,10 @@ +{ + let a := gas() + let b := gas() +} +// ---- +// commonSubexpressionEliminator +// { +// let a := gas() +// let b := gas() +// } diff --git a/test/libjulia/yulOptimizerTests/commonSubexpressionEliminator/smoke.yul b/test/libjulia/yulOptimizerTests/commonSubexpressionEliminator/smoke.yul new file mode 100644 index 00000000..b9457229 --- /dev/null +++ b/test/libjulia/yulOptimizerTests/commonSubexpressionEliminator/smoke.yul @@ -0,0 +1,5 @@ +{ } +// ---- +// commonSubexpressionEliminator +// { +// } diff --git a/test/libjulia/yulOptimizerTests/commonSubexpressionEliminator/trivial.yul b/test/libjulia/yulOptimizerTests/commonSubexpressionEliminator/trivial.yul new file mode 100644 index 00000000..684272f5 --- /dev/null +++ b/test/libjulia/yulOptimizerTests/commonSubexpressionEliminator/trivial.yul @@ -0,0 +1,10 @@ +{ + let a := mul(1, codesize()) + let b := mul(1, codesize()) +} +// ---- +// commonSubexpressionEliminator +// { +// let a := mul(1, codesize()) +// let b := a +// } |