mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Do not rematerialize in loops.
This commit is contained in:
parent
25d3f27c11
commit
40c0602b5c
@ -81,7 +81,7 @@ void Rematerialiser::visit(Expression& _e)
|
|||||||
if (
|
if (
|
||||||
(refs <= 1 && m_variableLoopDepth.at(name) == m_loopDepth) ||
|
(refs <= 1 && m_variableLoopDepth.at(name) == m_loopDepth) ||
|
||||||
cost == 0 ||
|
cost == 0 ||
|
||||||
(refs <= 5 && cost <= 1) ||
|
(refs <= 5 && cost <= 1 && m_loopDepth == 0) ||
|
||||||
m_varsToAlwaysRematerialize.count(name)
|
m_varsToAlwaysRematerialize.count(name)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
@ -33,7 +33,7 @@ namespace solidity::yul
|
|||||||
* - the variable is referenced exactly once (and definition-to-reference does not cross a loop boundary)
|
* - the variable is referenced exactly once (and definition-to-reference does not cross a loop boundary)
|
||||||
* - the value is extremely cheap ("cost" of zero like ``caller()``)
|
* - the value is extremely cheap ("cost" of zero like ``caller()``)
|
||||||
* - the variable is referenced at most 5 times and the value is rather cheap
|
* - the variable is referenced at most 5 times and the value is rather cheap
|
||||||
* ("cost" of at most 1 like a constant up to 0xff)
|
* ("cost" of at most 1 like a constant up to 0xff) and we are not in a loop
|
||||||
*
|
*
|
||||||
* Prerequisite: Disambiguator, ForLoopInitRewriter.
|
* Prerequisite: Disambiguator, ForLoopInitRewriter.
|
||||||
*/
|
*/
|
||||||
|
@ -17,9 +17,9 @@ contract C {
|
|||||||
// optimize-yul: true
|
// optimize-yul: true
|
||||||
// ----
|
// ----
|
||||||
// creation:
|
// creation:
|
||||||
// codeDepositCost: 605800
|
// codeDepositCost: 603000
|
||||||
// executionCost: 638
|
// executionCost: 638
|
||||||
// totalCost: 606438
|
// totalCost: 603638
|
||||||
// external:
|
// external:
|
||||||
// a(): 1029
|
// a(): 1029
|
||||||
// b(uint256): 2084
|
// b(uint256): 2084
|
||||||
|
@ -492,34 +492,37 @@
|
|||||||
// }
|
// }
|
||||||
// function abi_decode_t_array$_t_array$_t_uint256_$2_memory_$dyn_memory_ptr(offset, end) -> array
|
// function abi_decode_t_array$_t_array$_t_uint256_$2_memory_$dyn_memory_ptr(offset, end) -> array
|
||||||
// {
|
// {
|
||||||
// if iszero(slt(add(offset, 0x1f), end)) { revert(array, array) }
|
// let _1 := 0x1f
|
||||||
|
// if iszero(slt(add(offset, _1), end)) { revert(array, array) }
|
||||||
// let length := calldataload(offset)
|
// let length := calldataload(offset)
|
||||||
// array := allocateMemory(array_allocation_size_t_array$_t_address_$dyn_memory(length))
|
// array := allocateMemory(array_allocation_size_t_array$_t_address_$dyn_memory(length))
|
||||||
// let dst := array
|
// let dst := array
|
||||||
// mstore(array, length)
|
// mstore(array, length)
|
||||||
// let _1 := 0x20
|
// let _2 := 0x20
|
||||||
// dst := add(array, _1)
|
// dst := add(array, _2)
|
||||||
// let src := add(offset, _1)
|
// let src := add(offset, _2)
|
||||||
// if gt(add(add(offset, mul(length, 0x40)), _1), end) { revert(0, 0) }
|
// let _3 := 0x40
|
||||||
|
// if gt(add(add(offset, mul(length, _3)), _2), end) { revert(0, 0) }
|
||||||
// let i := 0
|
// let i := 0
|
||||||
// for { } lt(i, length) { i := add(i, 1) }
|
// for { } lt(i, length) { i := add(i, 1) }
|
||||||
// {
|
// {
|
||||||
// if iszero(slt(add(src, 0x1f), end)) { revert(0, 0) }
|
// if iszero(slt(add(src, _1), end)) { revert(0, 0) }
|
||||||
// let dst_1 := allocateMemory(array_allocation_size_t_array$_t_uint256_$2_memory(0x2))
|
// let _4 := 0x2
|
||||||
|
// let dst_1 := allocateMemory(array_allocation_size_t_array$_t_uint256_$2_memory(_4))
|
||||||
// let dst_2 := dst_1
|
// let dst_2 := dst_1
|
||||||
// let src_1 := src
|
// let src_1 := src
|
||||||
// let _2 := add(src, 0x40)
|
// let _5 := add(src, _3)
|
||||||
// if gt(_2, end) { revert(0, 0) }
|
// if gt(_5, end) { revert(0, 0) }
|
||||||
// let i_1 := 0
|
// let i_1 := 0
|
||||||
// for { } lt(i_1, 0x2) { i_1 := add(i_1, 1) }
|
// for { } lt(i_1, _4) { i_1 := add(i_1, 1) }
|
||||||
// {
|
// {
|
||||||
// mstore(dst_1, calldataload(src_1))
|
// mstore(dst_1, calldataload(src_1))
|
||||||
// dst_1 := add(dst_1, _1)
|
// dst_1 := add(dst_1, _2)
|
||||||
// src_1 := add(src_1, _1)
|
// src_1 := add(src_1, _2)
|
||||||
// }
|
// }
|
||||||
// mstore(dst, dst_2)
|
// mstore(dst, dst_2)
|
||||||
// dst := add(dst, _1)
|
// dst := add(dst, _2)
|
||||||
// src := _2
|
// src := _5
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
// function abi_decode_t_array$_t_uint256_$dyn_memory_ptr(offset, end) -> array
|
// function abi_decode_t_array$_t_uint256_$dyn_memory_ptr(offset, end) -> array
|
||||||
@ -548,8 +551,9 @@
|
|||||||
// for { } lt(i, 0x3) { i := add(i, 1) }
|
// for { } lt(i, 0x3) { i := add(i, 1) }
|
||||||
// {
|
// {
|
||||||
// mstore(pos, and(mload(srcPtr), sub(shl(160, 1), 1)))
|
// mstore(pos, and(mload(srcPtr), sub(shl(160, 1), 1)))
|
||||||
// srcPtr := add(srcPtr, 0x20)
|
// let _1 := 0x20
|
||||||
// pos := add(pos, 0x20)
|
// srcPtr := add(srcPtr, _1)
|
||||||
|
// pos := add(pos, _1)
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
// function allocateMemory(size) -> memPtr
|
// function allocateMemory(size) -> memPtr
|
||||||
|
@ -375,7 +375,8 @@
|
|||||||
// let i := 0
|
// let i := 0
|
||||||
// for { } lt(i, n) { i := add(i, 0x01) }
|
// for { } lt(i, n) { i := add(i, 0x01) }
|
||||||
// {
|
// {
|
||||||
// calldatacopy(add(0x300, mul(i, 0x80)), add(add(notes, mul(i, 0xc0)), 0x60), 0x80)
|
// let _1 := 0x80
|
||||||
|
// calldatacopy(add(0x300, mul(i, _1)), add(add(notes, mul(i, 0xc0)), 0x60), _1)
|
||||||
// }
|
// }
|
||||||
// mstore(0, keccak256(0x300, mul(n, 0x80)))
|
// mstore(0, keccak256(0x300, mul(n, 0x80)))
|
||||||
// }
|
// }
|
||||||
|
@ -13,7 +13,15 @@
|
|||||||
// {
|
// {
|
||||||
// let y := mload(0x20)
|
// let y := mload(0x20)
|
||||||
// let _1 := iszero(and(y, 8))
|
// let _1 := iszero(and(y, 8))
|
||||||
// for { } iszero(_1) { if y { revert(0, 0) } }
|
// for { }
|
||||||
|
// iszero(_1)
|
||||||
|
// {
|
||||||
|
// if y
|
||||||
|
// {
|
||||||
|
// let _2 := 0
|
||||||
|
// revert(_2, _2)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
// {
|
// {
|
||||||
// if y { continue }
|
// if y { continue }
|
||||||
// sstore(1, 0)
|
// sstore(1, 0)
|
||||||
|
@ -25,7 +25,8 @@
|
|||||||
// let i := sum
|
// let i := sum
|
||||||
// for { } lt(i, length) { i := add(i, 1) }
|
// for { } lt(i, length) { i := add(i, 1) }
|
||||||
// {
|
// {
|
||||||
// sum := add(sum, calldataload(add(add(_1, mul(i, 0x20)), 0x20)))
|
// let _2 := 0x20
|
||||||
|
// sum := add(sum, calldataload(add(add(_1, mul(i, _2)), _2)))
|
||||||
// }
|
// }
|
||||||
// sstore(0, sum)
|
// sstore(0, sum)
|
||||||
// }
|
// }
|
||||||
|
@ -29,7 +29,8 @@
|
|||||||
// let _2 := calldataload(7)
|
// let _2 := calldataload(7)
|
||||||
// for { } lt(i, length) { i := add(i, 1) }
|
// for { } lt(i, length) { i := add(i, 1) }
|
||||||
// {
|
// {
|
||||||
// sum := add(sum, add(calldataload(add(add(_1, mul(i, 0x20)), 0x20)), _2))
|
// let _3 := 0x20
|
||||||
|
// sum := add(sum, add(calldataload(add(add(_1, mul(i, _3)), _3)), _2))
|
||||||
// }
|
// }
|
||||||
// sstore(0, sum)
|
// sstore(0, sum)
|
||||||
// }
|
// }
|
||||||
|
@ -12,6 +12,6 @@
|
|||||||
// ----
|
// ----
|
||||||
// {
|
// {
|
||||||
// let x := 0xff
|
// let x := 0xff
|
||||||
// for { } lt(0xff, 0x100) { }
|
// for { } lt(x, 0x100) { }
|
||||||
// { let y := add(0xff, 1) }
|
// { let y := add(x, 1) }
|
||||||
// }
|
// }
|
||||||
|
@ -17,10 +17,10 @@
|
|||||||
// ----
|
// ----
|
||||||
// {
|
// {
|
||||||
// let x := 0xff
|
// let x := 0xff
|
||||||
// for { } lt(0xff, 0x100) { }
|
// for { } lt(x, 0x100) { }
|
||||||
// {
|
// {
|
||||||
// let y := add(0xff, 1)
|
// let y := add(x, 1)
|
||||||
// for { } lt(0xff, 0x200) { }
|
// for { } lt(x, 0x200) { }
|
||||||
// { let z := mul(0xff, 2) }
|
// { let z := mul(x, 2) }
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
Loading…
Reference in New Issue
Block a user