Handle "leaf functions" first in full inliner.

This commit is contained in:
chriseth
2020-09-10 17:01:19 +02:00
parent 0db79dbc29
commit f102feaf09
17 changed files with 463 additions and 346 deletions
@@ -9,22 +9,25 @@
// {
// {
// let _1 := 7
// let a_6 := 3
// let x_7 := 0
// x_7 := add(a_6, a_6)
// let b_8 := x_7
// let c_9 := _1
// let y_10 := 0
// y_10 := mul(mload(c_9), f(b_8))
// let y_1 := y_10
// let a_8 := 3
// let x_9 := 0
// x_9 := add(a_8, a_8)
// let b_10 := x_9
// let c_11 := _1
// let y_12 := 0
// let a_6_13 := b_10
// let x_7_14 := 0
// x_7_14 := add(a_6_13, a_6_13)
// y_12 := mul(mload(c_11), x_7_14)
// let y_1 := y_12
// }
// function f(a) -> x
// { x := add(a, a) }
// function g(b, c) -> y
// {
// let a_13 := b
// let x_14 := 0
// x_14 := add(a_13, a_13)
// y := mul(mload(c), x_14)
// let a_6 := b
// let x_7 := 0
// x_7 := add(a_6, a_6)
// y := mul(mload(c), x_7)
// }
// }
@@ -26,20 +26,14 @@
// step: fullInliner
//
// {
// {
// let x_8 := 100
// mstore(0, x_8)
// mstore(7, h())
// g(10)
// mstore(1, x_8)
// }
// { f(100) }
// function f(x)
// {
// mstore(0, x)
// let t_14 := 0
// t_14 := 2
// mstore(7, t_14)
// let x_1_15 := 10
// let t_8 := 0
// t_8 := 2
// mstore(7, t_8)
// let x_1_9 := 10
// f(1)
// mstore(1, x)
// }
@@ -473,22 +473,22 @@
// let i := _1
// for { } lt(i, length) { i := add(i, 1) }
// {
// abi_encode_t_array$_C_memory(mload(srcPtr), pos)
// let _3 := mload(srcPtr)
// let pos_1 := pos
// let srcPtr_1 := _3
// let i_1 := _1
// for { } lt(i_1, 0x3) { i_1 := add(i_1, 1) }
// {
// mstore(pos_1, and(mload(srcPtr_1), sub(shl(160, 1), 1)))
// srcPtr_1 := add(srcPtr_1, 0x20)
// pos_1 := add(pos_1, 0x20)
// }
// srcPtr := add(srcPtr, 0x20)
// pos := add(pos, 0x60)
// }
// let _3 := mload(64)
// let _4 := mload(0x20)
// if slt(sub(_3, _4), 128) { revert(_1, _1) }
// let offset := calldataload(add(_4, 64))
// let _5 := 0xffffffffffffffff
// if gt(offset, _5) { revert(_1, _1) }
// let value2 := abi_decode_t_array$_t_uint256_$dyn(add(_4, offset), _3)
// let offset_1 := calldataload(add(_4, 0x60))
// if gt(offset_1, _5) { revert(_1, _1) }
// let value3 := abi_decode_t_array$_t_array$_t_uint256_memory_$dyn(add(_4, offset_1), _3)
// sstore(calldataload(_4), calldataload(add(_4, 0x20)))
// sstore(value2, value3)
// let a, b, c, d := abi_decode_uint256t_uint256t_array$_t_uint256_$dynt_array$_t_array$_t_uint256_memory_$dyn(mload(0x20), mload(64))
// sstore(a, b)
// sstore(c, d)
// sstore(_1, pos)
// }
// function abi_decode_t_array$_t_array$_t_uint256_memory_$dyn(offset, end) -> array
@@ -508,14 +508,13 @@
// for { } lt(i, length) { i := add(i, 1) }
// {
// if iszero(slt(add(src, _1), end)) { revert(0, 0) }
// let _4 := 0x2
// let dst_1 := allocateMemory(array_allocation_size_t_array$_t_uint256_memory(_4))
// let dst_1 := allocateMemory(_3)
// let dst_2 := dst_1
// let src_1 := src
// let _5 := add(src, _3)
// if gt(_5, end) { revert(0, 0) }
// let _4 := add(src, _3)
// if gt(_4, end) { revert(0, 0) }
// let i_1 := 0
// for { } lt(i_1, _4) { i_1 := add(i_1, 1) }
// for { } lt(i_1, 0x2) { i_1 := add(i_1, 1) }
// {
// mstore(dst_1, calldataload(src_1))
// dst_1 := add(dst_1, _2)
@@ -523,39 +522,38 @@
// }
// mstore(dst, dst_2)
// dst := add(dst, _2)
// src := _5
// src := _4
// }
// }
// function abi_decode_t_array$_t_uint256_$dyn(offset, end) -> array
// function abi_decode_uint256t_uint256t_array$_t_uint256_$dynt_array$_t_array$_t_uint256_memory_$dyn(headStart, dataEnd) -> value0, value1, value2, value3
// {
// if iszero(slt(add(offset, 0x1f), end)) { revert(array, array) }
// let length := calldataload(offset)
// array := allocateMemory(array_allocation_size_t_array$_t_address_$dyn_memory(length))
// let dst := array
// mstore(array, length)
// let _1 := 0x20
// dst := add(array, _1)
// let src := add(offset, _1)
// if gt(add(add(offset, mul(length, _1)), _1), end) { revert(0, 0) }
// let i := 0
// if slt(sub(dataEnd, headStart), 128) { revert(value2, value2) }
// value0 := calldataload(headStart)
// let _1 := 32
// value1 := calldataload(add(headStart, _1))
// let offset := calldataload(add(headStart, 64))
// let _2 := 0xffffffffffffffff
// if gt(offset, _2) { revert(value2, value2) }
// let _3 := add(headStart, offset)
// if iszero(slt(add(_3, 0x1f), dataEnd)) { revert(value2, value2) }
// let length := calldataload(_3)
// let dst := allocateMemory(array_allocation_size_t_array$_t_address_$dyn_memory(length))
// let dst_1 := dst
// mstore(dst, length)
// dst := add(dst, _1)
// let src := add(_3, _1)
// if gt(add(add(_3, mul(length, _1)), _1), dataEnd) { revert(value2, value2) }
// let i := value2
// for { } lt(i, length) { i := add(i, 1) }
// {
// mstore(dst, calldataload(src))
// dst := add(dst, _1)
// src := add(src, _1)
// }
// }
// function abi_encode_t_array$_C_memory(value, pos)
// {
// let srcPtr := value
// let i := 0
// for { } lt(i, 0x3) { i := add(i, 1) }
// {
// mstore(pos, and(mload(srcPtr), sub(shl(160, 1), 1)))
// let _1 := 0x20
// srcPtr := add(srcPtr, _1)
// pos := add(pos, _1)
// }
// value2 := dst_1
// let offset_1 := calldataload(add(headStart, 96))
// if gt(offset_1, _2) { revert(value3, value3) }
// value3 := abi_decode_t_array$_t_array$_t_uint256_memory_$dyn(add(headStart, offset_1), dataEnd)
// }
// function allocateMemory(size) -> memPtr
// {
@@ -569,9 +567,4 @@
// if gt(length, 0xffffffffffffffff) { revert(size, size) }
// size := add(mul(length, 0x20), 0x20)
// }
// function array_allocation_size_t_array$_t_uint256_memory(length) -> size
// {
// if gt(length, 0xffffffffffffffff) { revert(size, size) }
// size := mul(length, 0x20)
// }
// }
@@ -49,7 +49,7 @@
// sstore(not(gcd(10, 15)), 1)
// sstore(0, 0)
// sstore(2, 1)
// extcodecopy(1, msize(), 1, 1)
// pop(foo_singlereturn_1_78_308(calldataload(0), calldataload(3)))
// sstore(0, 0)
// sstore(3, 1)
// }
@@ -59,4 +59,6 @@
// case 0 { out := _a }
// default { out := gcd(_b, mod(_a, _b)) }
// }
// function foo_singlereturn_1_78_308(in, in_1) -> out
// { extcodecopy(1, msize(), 1, 1) }
// }
@@ -17,15 +17,18 @@
//
// {
// {
// let out1, out2 := foo(sload(32))
// sstore(0, out1)
// sstore(0, out2)
// let out1_1, out2_1 := foo(sload(8))
// let _1 := sload(32)
// let x, y := foo_21_70(sload(0), _1)
// sstore(0, x)
// sstore(0, y)
// let x_1, y_1 := foo_21_70(_1, sload(8))
// }
// function foo(b) -> out1, out2
// function foo_21_70(a, b) -> out1, out2
// {
// out1 := sload(mload(32))
// out2 := add(out1, 1)
// extcodecopy(out1, out2, 1, b)
// let out1_1 := sload(mload(32))
// let out2_1 := add(out1_1, 1)
// extcodecopy(out1_1, out2_1, 1, b)
// out1 := out1_1
// out2 := out2_1
// }
// }
@@ -15,19 +15,15 @@
//
// {
// {
// f()
// sstore(0, 1)
// f()
// sstore(0, 1)
// f()
// sstore(0, 1)
// sstore(f_23_88(1), 1)
// sstore(f_23_88(2), 1)
// sstore(f_23_88(3), 1)
// }
// function f()
// function f_23_88(a) -> x
// {
// let b := 10
// let _1 := 0
// let a := calldataload(_1)
// let a_1 := calldataload(x)
// for { } iszero(b) { b := add(b, not(0)) }
// { mstore(a, _1) }
// { mstore(a_1, x) }
// }
// }
@@ -19,16 +19,18 @@
//
// {
// {
// let out1, out2 := foo(sload(32))
// sstore(0, out1)
// sstore(0, out2)
// sstore(0, 0)
// let out1_1, out2_1 := foo(sload(8))
// let _1 := sload(32)
// let x, y, z := foo_24_75(sload(0), _1)
// sstore(0, x)
// sstore(0, y)
// sstore(0, z)
// let x_1, y_1, z_1 := foo_24_75(_1, sload(8))
// }
// function foo(b) -> out1, out2
// function foo_24_75(a, b) -> out1, out2, out3
// {
// out1 := sload(mload(32))
// out2 := add(out1, 1)
// extcodecopy(out1, out1, 1, b)
// let out1_1 := sload(mload(32))
// extcodecopy(out1_1, out1_1, 1, b)
// out1 := out1_1
// out2 := add(out1_1, 1)
// }
// }
@@ -18,19 +18,28 @@
//
// {
// {
// f()
// sstore(0, 1)
// f()
// sstore(0, 1)
// f()
// sstore(0, 1)
// }
// function f()
// {
// mstore(calldataload(0), 0)
// sstore(1, 1)
// sstore(2, 2)
// sstore(3, 3)
// sstore(3, 3)
// let _1 := 0
// let _2 := calldataload(_1)
// mstore(_2, _1)
// let _3 := 1
// sstore(_3, _3)
// let _4 := 2
// sstore(_4, _4)
// let _5 := 3
// sstore(_5, _5)
// sstore(_5, _5)
// sstore(_1, _3)
// mstore(_2, _1)
// sstore(_3, _3)
// sstore(_4, _4)
// sstore(_5, _5)
// sstore(_5, _5)
// sstore(_1, _3)
// mstore(_2, _1)
// sstore(_3, _3)
// sstore(_4, _4)
// sstore(_5, _5)
// sstore(_5, _5)
// sstore(_1, _3)
// }
// }