Move tests for full inliner.

This commit is contained in:
chriseth 2018-10-11 17:14:59 +02:00
parent 83ab8e7f78
commit 9cd577abe9
9 changed files with 205 additions and 175 deletions

View File

@ -55,14 +55,6 @@ string inlinableFunctions(string const& _source)
);
}
string fullInline(string const& _source, bool _yul = true)
{
Block ast = disambiguate(_source, _yul);
(FunctionHoister{})(ast);
(FunctionGrouper{})(ast);\
FullInliner(ast).run();
return assembly::AsmPrinter(_yul)(ast);
}
}
@ -116,171 +108,4 @@ BOOST_AUTO_TEST_CASE(negative)
}
BOOST_AUTO_TEST_SUITE_END()
BOOST_AUTO_TEST_SUITE(YulFullInliner)
BOOST_AUTO_TEST_CASE(simple)
{
BOOST_CHECK_EQUAL(
fullInline("{"
"function f(a) -> x { let r := mul(a, a) x := add(r, r) }"
"let y := add(f(sload(mload(2))), mload(7))"
"}", false),
format("{"
"{"
"let _1 := mload(7)"
"let f_a := sload(mload(2))"
"let f_x"
"{"
"let f_r := mul(f_a, f_a)"
"f_x := add(f_r, f_r)"
"}"
"let y := add(f_x, _1)"
"}"
"function f(a) -> x"
"{"
"let r := mul(a, a)"
"x := add(r, r)"
"}"
"}", false)
);
}
BOOST_AUTO_TEST_CASE(multi_fun)
{
BOOST_CHECK_EQUAL(
fullInline("{"
"function f(a) -> x { x := add(a, a) }"
"function g(b, c) -> y { y := mul(mload(c), f(b)) }"
"let y := g(f(3), 7)"
"}", false),
format("{"
"{"
"let g_c := 7 "
"let f_a_1 := 3 "
"let f_x_1 "
"{ f_x_1 := add(f_a_1, f_a_1) } "
"let g_y "
"{"
"let g_f_a := f_x_1 "
"let g_f_x "
"{"
"g_f_x := add(g_f_a, g_f_a)"
"}"
"g_y := mul(mload(g_c), g_f_x)"
"}"
"let y_1 := g_y"
"}"
"function f(a) -> x"
"{"
"x := add(a, a)"
"}"
"function g(b, c) -> y"
"{"
"let f_a := b "
"let f_x "
"{"
"f_x := add(f_a, f_a)"
"}"
"y := mul(mload(c), f_x)"
"}"
"}", false)
);
}
BOOST_AUTO_TEST_CASE(move_up_rightwards_arguments)
{
BOOST_CHECK_EQUAL(
fullInline("{"
"function f(a, b, c) -> x { x := add(a, b) x := mul(x, c) }"
"let y := add(mload(1), add(f(mload(2), mload(3), mload(4)), mload(5)))"
"}", false),
format("{"
"{"
"let _1 := mload(5)"
"let f_c := mload(4)"
"let f_b := mload(3)"
"let f_a := mload(2)"
"let f_x"
"{"
"f_x := add(f_a, f_b)"
"f_x := mul(f_x, f_c)"
"}"
"let y := add(mload(1), add(f_x, _1))"
"}"
"function f(a, b, c) -> x"
"{"
"x := add(a, b)"
"x := mul(x, c)"
"}"
"}", false)
);
}
BOOST_AUTO_TEST_CASE(pop_result)
{
// This tests that `pop(r)` is removed.
BOOST_CHECK_EQUAL(
fullInline("{"
"function f(a) -> x { let r := mul(a, a) x := add(r, r) }"
"pop(add(f(7), 2))"
"}", false),
format("{"
"{"
"let _1 := 2 "
"let f_a := 7 "
"let f_x "
"{"
"let f_r := mul(f_a, f_a) "
"f_x := add(f_r, f_r)"
"}"
"{"
"}"
"}"
"function f(a) -> x"
"{"
"let r := mul(a, a) "
"x := add(r, r)"
"}"
"}", false)
);
}
BOOST_AUTO_TEST_CASE(inside_condition)
{
// This tests that breaking the expression inside the condition works properly.
BOOST_CHECK_EQUAL(
fullInline("{"
"if gt(f(mload(1)), mload(0)) {"
"sstore(0, 2)"
"}"
"function f(a) -> r {"
"a := mload(a)"
"r := add(a, calldatasize())"
"}"
"}", false),
format("{"
"{"
"let _1 := mload(0)"
"let f_a := mload(1)"
"let f_r"
"{"
"f_a := mload(f_a)"
"f_r := add(f_a, calldatasize())"
"}"
"if gt(f_r, _1)"
"{"
"sstore(0, 2)"
"}"
"}"
"function f(a) -> r"
"{"
"a := mload(a)"
"r := add(a, calldatasize())"
"}"
"}", false)
);
}
BOOST_AUTO_TEST_SUITE_END()

View File

@ -28,6 +28,7 @@
#include <libjulia/optimiser/FunctionGrouper.h>
#include <libjulia/optimiser/FunctionHoister.h>
#include <libjulia/optimiser/ExpressionInliner.h>
#include <libjulia/optimiser/FullInliner.h>
#include <libsolidity/parsing/Scanner.h>
#include <libsolidity/inlineasm/AsmPrinter.h>
@ -113,6 +114,13 @@ bool YulOptimizerTest::run(ostream& _stream, string const& _linePrefix, bool con
disambiguate();
ExpressionInliner(*m_ast).run();
}
else if (m_optimizerStep == "fullInliner")
{
disambiguate();
(FunctionHoister{})(*m_ast);
(FunctionGrouper{})(*m_ast);
FullInliner(*m_ast).run();
}
else
{
FormattedScope(_stream, _formatted, {formatting::BOLD, formatting::RED}) << _linePrefix << "Invalid optimizer step: " << m_optimizerStep << endl;

View File

@ -0,0 +1,32 @@
// This tests that breaking the expression inside the condition works properly.
{
if gt(f(mload(1)), mload(0)) {
sstore(0, 2)
}
function f(a) -> r {
a := mload(a)
r := add(a, calldatasize())
}
}
// ----
// fullInliner
// {
// {
// let _1 := mload(0)
// let f_a := mload(1)
// let f_r
// {
// f_a := mload(f_a)
// f_r := add(f_a, calldatasize())
// }
// if gt(f_r, _1)
// {
// sstore(0, 2)
// }
// }
// function f(a) -> r
// {
// a := mload(a)
// r := add(a, calldatasize())
// }
// }

View File

@ -0,0 +1,28 @@
{
function f(a, b, c) -> x {
x := add(a, b)
x := mul(x, c)
}
let y := add(mload(1), add(f(mload(2), mload(3), mload(4)), mload(5)))
}
// ----
// fullInliner
// {
// {
// let _1 := mload(5)
// let f_c := mload(4)
// let f_b := mload(3)
// let f_a := mload(2)
// let f_x
// {
// f_x := add(f_a, f_b)
// f_x := mul(f_x, f_c)
// }
// let y := add(mload(1), add(f_x, _1))
// }
// function f(a, b, c) -> x
// {
// x := add(a, b)
// x := mul(x, c)
// }
// }

View File

@ -0,0 +1,40 @@
{
function f(a) -> x { x := add(a, a) }
function g(b, c) -> y { y := mul(mload(c), f(b)) }
let y := g(f(3), 7)
}
// ----
// fullInliner
// {
// {
// let g_c := 7
// let f_a_1 := 3
// let f_x_1
// {
// f_x_1 := add(f_a_1, f_a_1)
// }
// let g_y
// {
// let g_f_a := f_x_1
// let g_f_x
// {
// g_f_x := add(g_f_a, g_f_a)
// }
// g_y := mul(mload(g_c), g_f_x)
// }
// let y_1 := g_y
// }
// function f(a) -> x
// {
// x := add(a, a)
// }
// function g(b, c) -> y
// {
// let f_a := b
// let f_x
// {
// f_x := add(f_a, f_a)
// }
// y := mul(mload(c), f_x)
// }
// }

View File

@ -0,0 +1,21 @@
// The full inliner currently does not work with
// functions returning multiple values.
{
function f(a) -> x, y {
x := mul(a, a)
y := add(a, x)
}
let a, b := f(mload(0))
}
// ----
// fullInliner
// {
// {
// let a_1, b := f(mload(0))
// }
// function f(a) -> x, y
// {
// x := mul(a, a)
// y := add(a, x)
// }
// }

View File

@ -0,0 +1,22 @@
{
function f(a) {
sstore(a, a)
}
f(mload(0))
}
// ----
// fullInliner
// {
// {
// let f_a := mload(0)
// {
// sstore(f_a, f_a)
// }
// {
// }
// }
// function f(a)
// {
// sstore(a, a)
// }
// }

View File

@ -0,0 +1,28 @@
// This tests that `pop(r)` is removed.
{
function f(a) -> x {
let r := mul(a, a)
x := add(r, r)
}
pop(add(f(7), 2))
}
// ----
// fullInliner
// {
// {
// let _1 := 2
// let f_a := 7
// let f_x
// {
// let f_r := mul(f_a, f_a)
// f_x := add(f_r, f_r)
// }
// {
// }
// }
// function f(a) -> x
// {
// let r := mul(a, a)
// x := add(r, r)
// }
// }

View File

@ -0,0 +1,26 @@
{
function f(a) -> x {
let r := mul(a, a)
x := add(r, r)
}
let y := add(f(sload(mload(2))), mload(7))
}
// ----
// fullInliner
// {
// {
// let _1 := mload(7)
// let f_a := sload(mload(2))
// let f_x
// {
// let f_r := mul(f_a, f_a)
// f_x := add(f_r, f_r)
// }
// let y := add(f_x, _1)
// }
// function f(a) -> x
// {
// let r := mul(a, a)
// x := add(r, r)
// }
// }