Use metrics in the full inliner.

This commit is contained in:
chriseth
2018-10-17 14:11:20 +02:00
parent ba1588828f
commit 9fb5feed05
7 changed files with 170 additions and 8 deletions
@@ -0,0 +1,43 @@
{
function f(a) -> b {
let x := mload(a)
b := sload(x)
let c := 3
mstore(mul(a, b), mload(x))
let y := add(a, x)
sstore(y, 10)
}
let a := mload(2)
let a2 := 2
// This should not be inlined because it is not a constant
let r := f(a)
// This should be inlined because it is a constant
let t := f(a2)
}
// ----
// fullInliner
// {
// {
// let a_1 := mload(2)
// let a2 := 2
// let r := f(a_1)
// let f_a := a2
// let f_b
// let f_x := mload(f_a)
// f_b := sload(f_x)
// let f_c := 3
// mstore(mul(f_a, f_b), mload(f_x))
// let f_y := add(f_a, f_x)
// sstore(f_y, 10)
// let t := f_b
// }
// function f(a) -> b
// {
// let x := mload(a)
// b := sload(x)
// let c := 3
// mstore(mul(a, b), mload(x))
// let y := add(a, x)
// sstore(y, 10)
// }
// }
@@ -0,0 +1,36 @@
{
function f(a) -> b {
let x := mload(a)
b := sload(x)
let c := 3
mstore(mul(a, b), mload(x))
let y := add(a, x)
sstore(y, 10)
}
// Single-use functions are always inlined.
let r := f(mload(1))
}
// ----
// fullInliner
// {
// {
// let f_a := mload(1)
// let f_b
// let f_x := mload(f_a)
// f_b := sload(f_x)
// let f_c := 3
// mstore(mul(f_a, f_b), mload(f_x))
// let f_y := add(f_a, f_x)
// sstore(f_y, 10)
// let r := f_b
// }
// function f(a) -> b
// {
// let x := mload(a)
// b := sload(x)
// let c := 3
// mstore(mul(a, b), mload(x))
// let y := add(a, x)
// sstore(y, 10)
// }
// }
@@ -0,0 +1,18 @@
{
function f(a) {
f(1)
}
f(mload(0))
}
// ----
// fullInliner
// {
// {
// let f_a := mload(0)
// f(1)
// }
// function f(a)
// {
// f(1)
// }
// }