From d60a2511fdc625928b5a2ee449e39ba78a3d1296 Mon Sep 17 00:00:00 2001 From: chriseth Date: Mon, 1 Oct 2018 18:27:07 +0200 Subject: Expression joiner. --- test/libjulia/YulOptimizerTest.cpp | 6 +++++ .../expressionJoiner/if_condition.yul | 21 ++++++++++++++++ .../expressionJoiner/muli_wrong_order3.yul | 13 ++++++++++ .../yulOptimizerTests/expressionJoiner/multi.yul | 11 +++++++++ .../expressionJoiner/multi_reference.yul | 11 +++++++++ .../expressionJoiner/multi_wrong_order.yul | 15 ++++++++++++ .../expressionJoiner/multi_wrong_order2.yul | 12 ++++++++++ .../no_replacement_across_blocks.yul | 19 +++++++++++++++ .../no_replacement_in_loop_condition1.yul | 15 ++++++++++++ .../no_replacement_in_loop_condition2.yul | 16 +++++++++++++ .../expressionJoiner/only_assignment.yul | 16 +++++++++++++ .../expressionJoiner/reassignment.yul | 13 ++++++++++ .../yulOptimizerTests/expressionJoiner/simple.yul | 10 ++++++++ .../expressionJoiner/single_wrong_order.yul | 13 ++++++++++ .../yulOptimizerTests/expressionJoiner/smoke.yul | 5 ++++ .../expressionJoiner/switch_expression.yul | 28 ++++++++++++++++++++++ .../yulOptimizerTests/expressionJoiner/triple.yul | 12 ++++++++++ 17 files changed, 236 insertions(+) create mode 100644 test/libjulia/yulOptimizerTests/expressionJoiner/if_condition.yul create mode 100644 test/libjulia/yulOptimizerTests/expressionJoiner/muli_wrong_order3.yul create mode 100644 test/libjulia/yulOptimizerTests/expressionJoiner/multi.yul create mode 100644 test/libjulia/yulOptimizerTests/expressionJoiner/multi_reference.yul create mode 100644 test/libjulia/yulOptimizerTests/expressionJoiner/multi_wrong_order.yul create mode 100644 test/libjulia/yulOptimizerTests/expressionJoiner/multi_wrong_order2.yul create mode 100644 test/libjulia/yulOptimizerTests/expressionJoiner/no_replacement_across_blocks.yul create mode 100644 test/libjulia/yulOptimizerTests/expressionJoiner/no_replacement_in_loop_condition1.yul create mode 100644 test/libjulia/yulOptimizerTests/expressionJoiner/no_replacement_in_loop_condition2.yul create mode 100644 test/libjulia/yulOptimizerTests/expressionJoiner/only_assignment.yul create mode 100644 test/libjulia/yulOptimizerTests/expressionJoiner/reassignment.yul create mode 100644 test/libjulia/yulOptimizerTests/expressionJoiner/simple.yul create mode 100644 test/libjulia/yulOptimizerTests/expressionJoiner/single_wrong_order.yul create mode 100644 test/libjulia/yulOptimizerTests/expressionJoiner/smoke.yul create mode 100644 test/libjulia/yulOptimizerTests/expressionJoiner/switch_expression.yul create mode 100644 test/libjulia/yulOptimizerTests/expressionJoiner/triple.yul (limited to 'test') diff --git a/test/libjulia/YulOptimizerTest.cpp b/test/libjulia/YulOptimizerTest.cpp index 96e36a5b..38765774 100644 --- a/test/libjulia/YulOptimizerTest.cpp +++ b/test/libjulia/YulOptimizerTest.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -146,6 +147,11 @@ bool YulOptimizerTest::run(ostream& _stream, string const& _linePrefix, bool con disambiguate(); UnusedPruner::runUntilStabilised(*m_ast); } + else if (m_optimizerStep == "expressionJoiner") + { + disambiguate(); + ExpressionJoiner::run(*m_ast);\ + } else { FormattedScope(_stream, _formatted, {formatting::BOLD, formatting::RED}) << _linePrefix << "Invalid optimizer step: " << m_optimizerStep << endl; diff --git a/test/libjulia/yulOptimizerTests/expressionJoiner/if_condition.yul b/test/libjulia/yulOptimizerTests/expressionJoiner/if_condition.yul new file mode 100644 index 00000000..a1349511 --- /dev/null +++ b/test/libjulia/yulOptimizerTests/expressionJoiner/if_condition.yul @@ -0,0 +1,21 @@ +{ + let a := mload(3) + let b := sload(a) + let c := mload(7) + let d := add(c, b) + if d { + let x := mload(3) + let y := add(x, 3) + } + let z := 3 + let t := add(z, 9) +} +// ---- +// expressionJoiner +// { +// if add(mload(7), sload(mload(3))) +// { +// let y := add(mload(3), 3) +// } +// let t := add(3, 9) +// } diff --git a/test/libjulia/yulOptimizerTests/expressionJoiner/muli_wrong_order3.yul b/test/libjulia/yulOptimizerTests/expressionJoiner/muli_wrong_order3.yul new file mode 100644 index 00000000..0d407c7c --- /dev/null +++ b/test/libjulia/yulOptimizerTests/expressionJoiner/muli_wrong_order3.yul @@ -0,0 +1,13 @@ +{ + let a := mload(3) + let b := mload(6) + let x := mul(add(b, a), mload(2)) + sstore(x, 3) +} +// ---- +// expressionJoiner +// { +// let a := mload(3) +// let b := mload(6) +// sstore(mul(add(b, a), mload(2)), 3) +// } diff --git a/test/libjulia/yulOptimizerTests/expressionJoiner/multi.yul b/test/libjulia/yulOptimizerTests/expressionJoiner/multi.yul new file mode 100644 index 00000000..fd53ca51 --- /dev/null +++ b/test/libjulia/yulOptimizerTests/expressionJoiner/multi.yul @@ -0,0 +1,11 @@ +{ + let a := mload(2) + let b := mload(6) + let x := mul(add(b, a), 2) + sstore(x, 3) +} +// ---- +// expressionJoiner +// { +// sstore(mul(add(mload(6), mload(2)), 2), 3) +// } diff --git a/test/libjulia/yulOptimizerTests/expressionJoiner/multi_reference.yul b/test/libjulia/yulOptimizerTests/expressionJoiner/multi_reference.yul new file mode 100644 index 00000000..078a12a5 --- /dev/null +++ b/test/libjulia/yulOptimizerTests/expressionJoiner/multi_reference.yul @@ -0,0 +1,11 @@ +{ + // This is not joined because a is referenced multiple times + let a := mload(2) + let b := add(a, a) +} +// ---- +// expressionJoiner +// { +// let a := mload(2) +// let b := add(a, a) +// } diff --git a/test/libjulia/yulOptimizerTests/expressionJoiner/multi_wrong_order.yul b/test/libjulia/yulOptimizerTests/expressionJoiner/multi_wrong_order.yul new file mode 100644 index 00000000..965e07e9 --- /dev/null +++ b/test/libjulia/yulOptimizerTests/expressionJoiner/multi_wrong_order.yul @@ -0,0 +1,15 @@ +{ + // We have an interleaved "add" here, so we cannot inline "a" + // (note that this component does not analyze whether + // functions are pure or not) + let a := mload(2) + let b := mload(6) + let x := mul(a, add(2, b)) + sstore(x, 3) +} +// ---- +// expressionJoiner +// { +// let a := mload(2) +// sstore(mul(a, add(2, mload(6))), 3) +// } diff --git a/test/libjulia/yulOptimizerTests/expressionJoiner/multi_wrong_order2.yul b/test/libjulia/yulOptimizerTests/expressionJoiner/multi_wrong_order2.yul new file mode 100644 index 00000000..c577e182 --- /dev/null +++ b/test/libjulia/yulOptimizerTests/expressionJoiner/multi_wrong_order2.yul @@ -0,0 +1,12 @@ +{ + let a := mload(2) + let b := mload(6) + let x := mul(add(a, b), 2) + sstore(x, 3) +} +// ---- +// expressionJoiner +// { +// let a := mload(2) +// sstore(mul(add(a, mload(6)), 2), 3) +// } diff --git a/test/libjulia/yulOptimizerTests/expressionJoiner/no_replacement_across_blocks.yul b/test/libjulia/yulOptimizerTests/expressionJoiner/no_replacement_across_blocks.yul new file mode 100644 index 00000000..a781bb2a --- /dev/null +++ b/test/libjulia/yulOptimizerTests/expressionJoiner/no_replacement_across_blocks.yul @@ -0,0 +1,19 @@ +{ + // The component will remove the empty block after + // it has handled the outer block. + // The idea behind this test is that the component + // does not perform replacements across blocks because + // they usually have contents, but adding contents + // will reduce the scope of the test. + let a := mload(2) + let x := calldataload(a) + { + } + sstore(x, 3) +} +// ---- +// expressionJoiner +// { +// let x := calldataload(mload(2)) +// sstore(x, 3) +// } diff --git a/test/libjulia/yulOptimizerTests/expressionJoiner/no_replacement_in_loop_condition1.yul b/test/libjulia/yulOptimizerTests/expressionJoiner/no_replacement_in_loop_condition1.yul new file mode 100644 index 00000000..75218a5c --- /dev/null +++ b/test/libjulia/yulOptimizerTests/expressionJoiner/no_replacement_in_loop_condition1.yul @@ -0,0 +1,15 @@ +{ + for { let b := mload(1) } b {} {} +} +// ---- +// expressionJoiner +// { +// for { +// let b := mload(1) +// } +// b +// { +// } +// { +// } +// } diff --git a/test/libjulia/yulOptimizerTests/expressionJoiner/no_replacement_in_loop_condition2.yul b/test/libjulia/yulOptimizerTests/expressionJoiner/no_replacement_in_loop_condition2.yul new file mode 100644 index 00000000..d5f7d8fa --- /dev/null +++ b/test/libjulia/yulOptimizerTests/expressionJoiner/no_replacement_in_loop_condition2.yul @@ -0,0 +1,16 @@ +{ + let a := mload(0) + for { } a {} {} +} +// ---- +// expressionJoiner +// { +// let a := mload(0) +// for { +// } +// a +// { +// } +// { +// } +// } diff --git a/test/libjulia/yulOptimizerTests/expressionJoiner/only_assignment.yul b/test/libjulia/yulOptimizerTests/expressionJoiner/only_assignment.yul new file mode 100644 index 00000000..c7411211 --- /dev/null +++ b/test/libjulia/yulOptimizerTests/expressionJoiner/only_assignment.yul @@ -0,0 +1,16 @@ +{ + // This is not joined because a is referenced multiple times + function f(a) -> x { + a := mload(2) + x := add(a, 3) + } +} +// ---- +// expressionJoiner +// { +// function f(a) -> x +// { +// a := mload(2) +// x := add(a, 3) +// } +// } diff --git a/test/libjulia/yulOptimizerTests/expressionJoiner/reassignment.yul b/test/libjulia/yulOptimizerTests/expressionJoiner/reassignment.yul new file mode 100644 index 00000000..1e502353 --- /dev/null +++ b/test/libjulia/yulOptimizerTests/expressionJoiner/reassignment.yul @@ -0,0 +1,13 @@ +{ + // This is not joined because a is referenced multiple times + let a := mload(2) + let b := mload(a) + a := 4 +} +// ---- +// expressionJoiner +// { +// let a := mload(2) +// let b := mload(a) +// a := 4 +// } diff --git a/test/libjulia/yulOptimizerTests/expressionJoiner/simple.yul b/test/libjulia/yulOptimizerTests/expressionJoiner/simple.yul new file mode 100644 index 00000000..b03bcf45 --- /dev/null +++ b/test/libjulia/yulOptimizerTests/expressionJoiner/simple.yul @@ -0,0 +1,10 @@ +{ + let a := mload(2) + let x := calldataload(a) + sstore(x, 3) +} +// ---- +// expressionJoiner +// { +// sstore(calldataload(mload(2)), 3) +// } diff --git a/test/libjulia/yulOptimizerTests/expressionJoiner/single_wrong_order.yul b/test/libjulia/yulOptimizerTests/expressionJoiner/single_wrong_order.yul new file mode 100644 index 00000000..3b433f78 --- /dev/null +++ b/test/libjulia/yulOptimizerTests/expressionJoiner/single_wrong_order.yul @@ -0,0 +1,13 @@ +{ + let a := mload(3) + let b := sload(a) + let c := mload(7) + let d := add(b, c) + sstore(d, 0) +} +// ---- +// expressionJoiner +// { +// let b := sload(mload(3)) +// sstore(add(b, mload(7)), 0) +// } diff --git a/test/libjulia/yulOptimizerTests/expressionJoiner/smoke.yul b/test/libjulia/yulOptimizerTests/expressionJoiner/smoke.yul new file mode 100644 index 00000000..c0e2c6f2 --- /dev/null +++ b/test/libjulia/yulOptimizerTests/expressionJoiner/smoke.yul @@ -0,0 +1,5 @@ +{ } +// ---- +// expressionJoiner +// { +// } diff --git a/test/libjulia/yulOptimizerTests/expressionJoiner/switch_expression.yul b/test/libjulia/yulOptimizerTests/expressionJoiner/switch_expression.yul new file mode 100644 index 00000000..0e4e540e --- /dev/null +++ b/test/libjulia/yulOptimizerTests/expressionJoiner/switch_expression.yul @@ -0,0 +1,28 @@ +{ + let a := mload(3) + let b := sload(a) + let c := mload(7) + let d := add(c, b) + switch d + case 3 { + let x := mload(3) + let y := add(x, 3) + } + default { + sstore(1, 0) + } + let z := 3 + let t := add(z, 9) +} +// ---- +// expressionJoiner +// { +// switch add(mload(7), sload(mload(3))) +// case 3 { +// let y := add(mload(3), 3) +// } +// default { +// sstore(1, 0) +// } +// let t := add(3, 9) +// } diff --git a/test/libjulia/yulOptimizerTests/expressionJoiner/triple.yul b/test/libjulia/yulOptimizerTests/expressionJoiner/triple.yul new file mode 100644 index 00000000..7b722be1 --- /dev/null +++ b/test/libjulia/yulOptimizerTests/expressionJoiner/triple.yul @@ -0,0 +1,12 @@ +{ + let a := mload(2) + let b := mload(6) + let c := mload(7) + let x := mul(add(c, b), a) + sstore(x, 3) +} +// ---- +// expressionJoiner +// { +// sstore(mul(add(mload(7), mload(6)), mload(2)), 3) +// } -- cgit