Use the block flattener.

This commit is contained in:
chriseth 2019-01-08 15:19:35 +01:00
parent 884d51c1f2
commit 5b8b016fae
5 changed files with 220 additions and 246 deletions

View File

@ -22,6 +22,7 @@
#include <libyul/optimiser/Disambiguator.h>
#include <libyul/optimiser/VarDeclInitializer.h>
#include <libyul/optimiser/BlockFlattener.h>
#include <libyul/optimiser/FunctionGrouper.h>
#include <libyul/optimiser/FunctionHoister.h>
#include <libyul/optimiser/ExpressionSplitter.h>
@ -59,8 +60,10 @@ void OptimiserSuite::run(
(VarDeclInitializer{})(ast);
(FunctionHoister{})(ast);
(BlockFlattener{})(ast);
(FunctionGrouper{})(ast);
(ForLoopInitRewriter{})(ast);
(BlockFlattener{})(ast);
StructuralSimplifier{_dialect}(ast);
NameDispenser dispenser{_dialect, ast};
@ -75,6 +78,7 @@ void OptimiserSuite::run(
CommonSubexpressionEliminator{_dialect}(ast);
ExpressionSimplifier::run(_dialect, ast);
StructuralSimplifier{_dialect}(ast);
(BlockFlattener{})(ast);
SSATransform::run(ast, dispenser);
RedundantAssignEliminator::run(_dialect, ast);
RedundantAssignEliminator::run(_dialect, ast);
@ -95,12 +99,16 @@ void OptimiserSuite::run(
RedundantAssignEliminator::run(_dialect, ast);
RedundantAssignEliminator::run(_dialect, ast);
CommonSubexpressionEliminator{_dialect}(ast);
(FunctionGrouper{})(ast);
FullInliner{ast, dispenser}.run();
SSATransform::run(ast, dispenser);
RedundantAssignEliminator::run(_dialect, ast);
RedundantAssignEliminator::run(_dialect, ast);
ExpressionSimplifier::run(_dialect, ast);
StructuralSimplifier{_dialect}(ast);
(BlockFlattener{})(ast);
CommonSubexpressionEliminator{_dialect}(ast);
SSATransform::run(ast, dispenser);
RedundantAssignEliminator::run(_dialect, ast);

View File

@ -1059,54 +1059,36 @@
// ----
// fullSuite
// {
// {
// let _1 := 1
// let _2 := mload(_1)
// let _3 := 0
// let _1017 := mload(_3)
// let abi_decode_value0_156 := _3
// if slt(sub(_2, _1017), 64)
// {
// revert(_3, _3)
// }
// {
// abi_decode_value0_156 := and(calldataload(_1017), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
// }
// sstore(_3, abi_decode_value0_156)
// let _1145 := 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
// sstore(_3, and(calldataload(_1017), _1145))
// let _1019 := mload(8)
// let _1021 := mload(7)
// let abi_decode_value0_57 := _3
// let abi_decode_value1_58 := _3
// let abi_decode_value2_59 := _3
// let abi_decode_value3 := _3
// let abi_decode_value4 := _3
// if slt(sub(_1019, _1021), 128)
// {
// revert(_3, _3)
// }
// {
// abi_decode_value0_57 := and(calldataload(_1021), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
// }
// {
// abi_decode_value1_58 := calldataload(add(_1021, 32))
// }
// {
// let abi_decode_offset_62 := calldataload(add(_1021, 64))
// if gt(abi_decode_offset_62, 0xffffffffffffffff)
// {
// revert(_3, _3)
// }
// abi_decode_value2_59, abi_decode_value3 := abi_decode_t_bytes_calldata_ptr(add(_1021, abi_decode_offset_62), _1019)
// }
// {
// abi_decode_value4 := cleanup_revert_t_enum$_Operation_$1949(calldataload(add(_1021, 96)))
// }
// sstore(_1, abi_decode_value0_57)
// sstore(_1, abi_decode_value1_58)
// let abi_decode_value4_1063 := cleanup_revert_t_enum$_Operation_$1949(calldataload(add(_1021, 96)))
// sstore(_1, and(calldataload(_1021), _1145))
// sstore(_1, calldataload(add(_1021, 32)))
// sstore(_1, _3)
// sstore(_1, _3)
// sstore(_1, abi_decode_value4)
// }
// sstore(_1, abi_decode_value4_1063)
// function abi_decode_t_bytes_calldata_ptr(offset_12, end_13) -> arrayPos_14, length_15
// {
// if iszero(slt(add(offset_12, 0x1f), end_13))

View File

@ -458,7 +458,6 @@
// ----
// fullSuite
// {
// {
// let _1 := 0x20
// let _485 := mload(0)
// let abi_encode_pos := _1
@ -474,20 +473,20 @@
// abi_encode_i_69 := add(abi_encode_i_69, 1)
// }
// {
// let _863 := mload(abi_encode_srcPtr)
// let abi_encode_pos_71_971 := abi_encode_pos
// let abi_encode_srcPtr_73_973 := _863
// let abi_encode_i_74_974 := 0
// let _874 := mload(abi_encode_srcPtr)
// let abi_encode_pos_71_978 := abi_encode_pos
// let abi_encode_srcPtr_73_980 := _874
// let abi_encode_i_74_981 := 0
// for {
// }
// lt(abi_encode_i_74_974, 0x3)
// lt(abi_encode_i_74_981, 0x3)
// {
// abi_encode_i_74_974 := add(abi_encode_i_74_974, 1)
// abi_encode_i_74_981 := add(abi_encode_i_74_981, 1)
// }
// {
// mstore(abi_encode_pos_71_971, and(mload(abi_encode_srcPtr_73_973), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF))
// abi_encode_srcPtr_73_973 := add(abi_encode_srcPtr_73_973, _1)
// abi_encode_pos_71_971 := add(abi_encode_pos_71_971, _1)
// mstore(abi_encode_pos_71_978, and(mload(abi_encode_srcPtr_73_980), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF))
// abi_encode_srcPtr_73_980 := add(abi_encode_srcPtr_73_980, _1)
// abi_encode_pos_71_978 := add(abi_encode_pos_71_978, _1)
// }
// abi_encode_srcPtr := add(abi_encode_srcPtr, _1)
// abi_encode_pos := add(abi_encode_pos, 0x60)
@ -496,7 +495,6 @@
// sstore(a, b)
// sstore(c, d)
// sstore(0, abi_encode_pos)
// }
// function abi_decode_t_array$_t_array$_t_uint256_$2_memory_$dyn_memory_ptr(offset_3, end_4) -> array_5
// {
// if iszero(slt(add(offset_3, 0x1f), end_4))
@ -554,66 +552,56 @@
// src_16 := add(src_16, 0x20)
// }
// }
// function abi_decode_t_array$_t_uint256_$dyn_memory_ptr(offset_27, end_28) -> array_29
// {
// if iszero(slt(add(offset_27, 0x1f), end_28))
// {
// revert(0, 0)
// }
// let length_30 := calldataload(offset_27)
// let array_29_279 := allocateMemory(array_allocation_size_t_array$_t_uint256_$dyn_memory_ptr(length_30))
// array_29 := array_29_279
// let dst_31 := array_29_279
// mstore(array_29_279, length_30)
// let _91 := 0x20
// dst_31 := add(array_29_279, _91)
// let src_32 := add(offset_27, _91)
// if gt(add(add(offset_27, mul(length_30, _91)), _91), end_28)
// {
// revert(0, 0)
// }
// let i_33 := 0
// for {
// }
// lt(i_33, length_30)
// {
// i_33 := add(i_33, 1)
// }
// {
// mstore(dst_31, calldataload(src_32))
// dst_31 := add(dst_31, _91)
// src_32 := add(src_32, _91)
// }
// }
// function abi_decode_tuple_t_uint256t_uint256t_array$_t_uint256_$dyn_memory_ptrt_array$_t_array$_t_uint256_$2_memory_$dyn_memory_ptr(headStart_58, dataEnd_59) -> value0_60, value1_61, value2, value3
// {
// if slt(sub(dataEnd_59, headStart_58), 128)
// {
// revert(value2, value2)
// }
// {
// value0_60 := calldataload(add(headStart_58, value2))
// }
// {
// value1_61 := calldataload(add(headStart_58, 32))
// }
// {
// let offset_64 := calldataload(add(headStart_58, 64))
// if gt(offset_64, 0xffffffffffffffff)
// let _165 := 0xffffffffffffffff
// if gt(offset_64, _165)
// {
// revert(value2, value2)
// }
// value2 := abi_decode_t_array$_t_uint256_$dyn_memory_ptr(add(headStart_58, offset_64), dataEnd_59)
// let _532 := add(headStart_58, offset_64)
// if iszero(slt(add(_532, 0x1f), dataEnd_59))
// {
// revert(value2, value2)
// }
// let abi_decode_length_30 := calldataload(_532)
// let abi_decode_array_29_279 := allocateMemory(array_allocation_size_t_array$_t_uint256_$dyn_memory_ptr(abi_decode_length_30))
// let abi_decode_dst_31 := abi_decode_array_29_279
// mstore(abi_decode_array_29_279, abi_decode_length_30)
// let abi_decode__91 := 0x20
// abi_decode_dst_31 := add(abi_decode_array_29_279, abi_decode__91)
// let abi_decode_src_32 := add(_532, abi_decode__91)
// if gt(add(add(_532, mul(abi_decode_length_30, abi_decode__91)), abi_decode__91), dataEnd_59)
// {
// revert(value2, value2)
// }
// let abi_decode_i_33 := value2
// for {
// }
// lt(abi_decode_i_33, abi_decode_length_30)
// {
// abi_decode_i_33 := add(abi_decode_i_33, 1)
// }
// {
// mstore(abi_decode_dst_31, calldataload(abi_decode_src_32))
// abi_decode_dst_31 := add(abi_decode_dst_31, abi_decode__91)
// abi_decode_src_32 := add(abi_decode_src_32, abi_decode__91)
// }
// value2 := abi_decode_array_29_279
// let offset_65 := calldataload(add(headStart_58, 96))
// if gt(offset_65, 0xffffffffffffffff)
// if gt(offset_65, _165)
// {
// revert(0, 0)
// }
// value3 := abi_decode_t_array$_t_array$_t_uint256_$2_memory_$dyn_memory_ptr(add(headStart_58, offset_65), dataEnd_59)
// }
// }
// function allocateMemory(size) -> memPtr
// {
// let memPtr_315 := mload(64)

View File

@ -231,7 +231,6 @@
// ----
// fullSuite
// {
// {
// let validateJo__6 := 0x80
// mstore(validateJo__6, 7673901602397024137095011250362199966051872585513276903826533215767972925880)
// mstore(0xa0, 8489654445897228341090914135473290831551238522473825886865492707826370766375)
@ -348,7 +347,6 @@
// return(0x00, 0x20)
// mstore(0x00, 404)
// revert(0x00, 0x20)
// }
// function validatePairing(t2)
// {
// let t2_x_1 := calldataload(t2)

View File

@ -19,7 +19,6 @@
// ----
// fullSuite
// {
// {
// let allocate__19 := 0x40
// mstore(allocate__19, add(mload(allocate__19), 0x20))
// let allocate_p_24_41 := mload(allocate__19)
@ -27,4 +26,3 @@
// mstore(add(allocate_p_24_41, 96), 2)
// mstore(allocate__19, 0x20)
// }
// }