Do not create unassigned variables.

This commit is contained in:
chriseth 2018-12-13 15:38:14 +01:00
parent 11209ec48a
commit 6c6a53a439
16 changed files with 50 additions and 47 deletions

View File

@ -168,6 +168,8 @@ vector<Statement> InlineModifier::performInline(Statement& _statement, FunctionC
m_driver.tentativelyUpdateCodeSize(function->name, m_currentFunction);
static Expression const zero{Literal{{}, LiteralKind::Number, YulString{"0"}, {}}};
// helper function to create a new variable that is supposed to model
// an existing variable.
auto newVariable = [&](TypedName const& _existingVariable, Expression* _value) {
@ -176,6 +178,8 @@ vector<Statement> InlineModifier::performInline(Statement& _statement, FunctionC
VariableDeclaration varDecl{_funCall.location, {{_funCall.location, newName, _existingVariable.type}}, {}};
if (_value)
varDecl.value = make_shared<Expression>(std::move(*_value));
else
varDecl.value = make_shared<Expression>(zero);
newStatements.emplace_back(std::move(varDecl));
};

View File

@ -9,14 +9,14 @@
// {
// {
// let f_a := calldataload(0)
// let f_b
// let f_c
// let f_b := 0
// let f_c := 0
// f_b := sload(mload(f_a))
// f_c := 3
// let b3 := f_b
// let f_a_2 := f_c
// let f_b_3
// let f_c_4
// let f_b_3 := 0
// let f_c_4 := 0
// f_b_3 := sload(mload(f_a_2))
// f_c_4 := 3
// let b4 := f_b_3

View File

@ -14,7 +14,7 @@
// {
// let _2 := mload(0)
// let f_a := mload(1)
// let f_r
// let f_r := 0
// f_a := mload(f_a)
// f_r := add(f_a, calldatasize())
// if gt(f_r, _2)

View File

@ -23,7 +23,7 @@
// let a2 := 2
// let r := f(a_1)
// let f_a := a2
// let f_b
// let f_b := 0
// let f_x := mload(f_a)
// f_b := sload(f_x)
// let f_y := add(f_a, f_x)
@ -31,7 +31,7 @@
// let t := f_b
// let a3
// let f_a_3 := a3
// let f_b_4
// let f_b_4 := 0
// let f_x_5 := mload(f_a_3)
// f_b_4 := sload(f_x_5)
// let f_y_6 := add(f_a_3, f_x_5)

View File

@ -15,7 +15,7 @@
// {
// {
// let f_a := mload(1)
// let f_b
// let f_b := 0
// let f_x := mload(f_a)
// f_b := sload(f_x)
// let f_c := 3

View File

@ -13,7 +13,7 @@
// {
// let verylongvariablename2_1 := 3
// let verylongfu_verylongvariablename := verylongvariablename2_1
// let verylongfu_verylongvariablename2
// let verylongfu_verylongvariablename2 := 0
// verylongfu_verylongvariablename2 := add(verylongfu_verylongvariablename, verylongfu_verylongvariablename)
// mstore(0, verylongfu_verylongvariablename2)
// mstore(1, verylongvariablename2_1)

View File

@ -15,7 +15,7 @@
// let f_a := mload(2)
// let f_b := _6
// let f_c := _4
// let f_x
// let f_x := 0
// f_x := add(f_a, f_b)
// f_x := mul(f_x, f_c)
// let _10 := add(f_x, _2)

View File

@ -9,11 +9,11 @@
// {
// let _1 := 7
// let f_a := 3
// let f_x
// let f_x := 0
// f_x := add(f_a, f_a)
// let g_b := f_x
// let g_c := _1
// let g_y
// let g_y := 0
// g_y := mul(mload(g_c), f(g_b))
// let y_1 := g_y
// }
@ -24,7 +24,7 @@
// function g(b, c) -> y
// {
// let f_a_6 := b
// let f_x_7
// let f_x_7 := 0
// f_x_7 := add(f_a_6, f_a_6)
// y := mul(mload(c), f_x_7)
// }

View File

@ -37,7 +37,7 @@
// function f(x)
// {
// mstore(0, x)
// let h_t
// let h_t := 0
// h_t := 2
// mstore(7, h_t)
// let g_x_1 := 10

View File

@ -11,8 +11,8 @@
// {
// {
// let f_a := mload(0)
// let f_x
// let f_y
// let f_x := 0
// let f_y := 0
// f_x := mul(f_a, f_a)
// f_y := add(f_a, f_x)
// let r := f_x

View File

@ -19,25 +19,25 @@
// function g() -> x_1
// {
// let f_a := 2
// let f_b
// let f_b := 0
// f_b := sload(mload(f_a))
// let f_a_20 := f_b
// let f_b_21
// let f_b_21 := 0
// f_b_21 := sload(mload(f_a_20))
// let f_a_23 := f_b_21
// let f_b_24
// let f_b_24 := 0
// f_b_24 := sload(mload(f_a_23))
// let f_a_26 := f_b_24
// let f_b_27
// let f_b_27 := 0
// f_b_27 := sload(mload(f_a_26))
// let f_a_29 := f_b_27
// let f_b_30
// let f_b_30 := 0
// f_b_30 := sload(mload(f_a_29))
// let f_a_32 := f_b_30
// let f_b_33
// let f_b_33 := 0
// f_b_33 := sload(mload(f_a_32))
// let f_a_35 := f_b_33
// let f_b_36
// let f_b_36 := 0
// f_b_36 := sload(mload(f_a_35))
// x_1 := f(f(f(f(f(f(f(f(f(f(f(f(f_b_36))))))))))))
// }

View File

@ -12,25 +12,25 @@
// {
// {
// let f_a := 2
// let f_b
// let f_b := 0
// f_b := sload(mload(f_a))
// let f_a_20 := f_b
// let f_b_21
// let f_b_21 := 0
// f_b_21 := sload(mload(f_a_20))
// let f_a_23 := f_b_21
// let f_b_24
// let f_b_24 := 0
// f_b_24 := sload(mload(f_a_23))
// let f_a_26 := f_b_24
// let f_b_27
// let f_b_27 := 0
// f_b_27 := sload(mload(f_a_26))
// let f_a_29 := f_b_27
// let f_b_30
// let f_b_30 := 0
// f_b_30 := sload(mload(f_a_29))
// let f_a_32 := f_b_30
// let f_b_33
// let f_b_33 := 0
// f_b_33 := sload(mload(f_a_32))
// let f_a_35 := f_b_33
// let f_b_36
// let f_b_36 := 0
// f_b_36 := sload(mload(f_a_35))
// let x_1 := f(f(f(f(f(f(f(f(f(f(f(f(f_b_36))))))))))))
// }

View File

@ -14,7 +14,7 @@
// {
// for {
// let f_a := 0
// let f_r
// let f_r := 0
// sstore(f_a, 0)
// f_r := f_a
// let x := f_r
@ -22,14 +22,14 @@
// f(x)
// {
// let f_a_3 := x
// let f_r_4
// let f_r_4 := 0
// sstore(f_a_3, 0)
// f_r_4 := f_a_3
// x := f_r_4
// }
// {
// let f_a_6 := x
// let f_r_7
// let f_r_7 := 0
// sstore(f_a_6, 0)
// f_r_7 := f_a_6
// let t := f_r_7

View File

@ -14,7 +14,7 @@
// {
// let _1 := 2
// let f_a := 7
// let f_x
// let f_x := 0
// let f_r := mul(f_a, f_a)
// f_x := add(f_r, f_r)
// pop(add(f_x, _1))

View File

@ -11,7 +11,7 @@
// {
// let _2 := mload(7)
// let f_a := sload(mload(2))
// let f_x
// let f_x := 0
// let f_r := mul(f_a, f_a)
// f_x := add(f_r, f_r)
// let y := add(f_x, _2)

View File

@ -463,12 +463,11 @@
// let _2 := 0
// let _485 := mload(_2)
// let abi_encode_pos := _1
// let abi_encode_end_67_610
// let abi_encode_length_68 := mload(_485)
// mstore(_1, abi_encode_length_68)
// abi_encode_pos := 64
// let abi_encode_srcPtr := add(_485, _1)
// let abi_encode_i_69 := abi_encode_end_67_610
// let abi_encode_i_69 := _2
// for {
// }
// lt(abi_encode_i_69, abi_encode_length_68)
@ -476,21 +475,21 @@
// abi_encode_i_69 := add(abi_encode_i_69, 1)
// }
// {
// let _857 := mload(abi_encode_srcPtr)
// let abi_encode_pos_71_965 := abi_encode_pos
// let abi_encode_length_72_966 := 0x3
// let abi_encode_srcPtr_73_967 := _857
// let abi_encode_i_74_968 := _2
// let _863 := mload(abi_encode_srcPtr)
// let abi_encode_pos_71_971 := abi_encode_pos
// let abi_encode_length_72_972 := 0x3
// let abi_encode_srcPtr_73_973 := _863
// let abi_encode_i_74_974 := _2
// for {
// }
// lt(abi_encode_i_74_968, abi_encode_length_72_966)
// lt(abi_encode_i_74_974, abi_encode_length_72_972)
// {
// abi_encode_i_74_968 := add(abi_encode_i_74_968, 1)
// abi_encode_i_74_974 := add(abi_encode_i_74_974, 1)
// }
// {
// mstore(abi_encode_pos_71_965, and(mload(abi_encode_srcPtr_73_967), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF))
// abi_encode_srcPtr_73_967 := add(abi_encode_srcPtr_73_967, _1)
// abi_encode_pos_71_965 := add(abi_encode_pos_71_965, _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)
// }
// abi_encode_srcPtr := add(abi_encode_srcPtr, _1)
// abi_encode_pos := add(abi_encode_pos, 0x60)