Skip to content

Commit e1662f8

Browse files
committed
Fix stack compression in stack layout generator.
1 parent c2a5c84 commit e1662f8

File tree

5 files changed

+10
-8
lines changed

5 files changed

+10
-8
lines changed

libyul/backends/evm/StackLayoutGenerator.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,9 @@ Stack StackLayoutGenerator::propagateStackThroughOperation(Stack _exitStack, CFG
336336
stack.pop_back();
337337
else if (auto offset = util::findOffset(stack | ranges::views::reverse | ranges::views::drop(1), stack.back()))
338338
{
339-
if (*offset + 2 < m_reachableStackDepth)
339+
// *offset == n requires, after popping the topmost slot, a DUP<n+1> to recover it.
340+
// So if *offset + 1 is within stack reach, we can pop.
341+
if (*offset + 1 <= m_reachableStackDepth)
340342
stack.pop_back();
341343
else
342344
break;

test/libsolidity/semanticTests/externalContracts/base64.sol

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ contract test {
3333
// EVMVersion: >=constantinople
3434
// ----
3535
// constructor()
36-
// gas irOptimized: 79076
37-
// gas irOptimized code: 322000
36+
// gas irOptimized: 78830
37+
// gas irOptimized code: 319000
3838
// gas legacy: 102214
3939
// gas legacy code: 629800
4040
// gas legacyOptimized: 87926
@@ -58,6 +58,6 @@ contract test {
5858
// gas legacy: 1554038
5959
// gas legacyOptimized: 1132031
6060
// encode_no_asm_large()
61-
// gas irOptimized: 3512081
61+
// gas irOptimized: 3497081
6262
// gas legacy: 4600082
6363
// gas legacyOptimized: 2813075

test/libsolidity/semanticTests/externalContracts/deposit_contract.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,8 @@ contract DepositContract is IDepositContract, ERC165 {
176176
}
177177
// ----
178178
// constructor()
179-
// gas irOptimized: 809570
180-
// gas irOptimized code: 558000
179+
// gas irOptimized: 809356
180+
// gas irOptimized code: 555400
181181
// gas legacy: 920228
182182
// gas legacy code: 1438800
183183
// gas legacyOptimized: 848699

test/libsolidity/semanticTests/externalContracts/snark.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,6 @@ contract Test {
297297
// gas legacyOptimized: 276313
298298
// verifyTx() -> true
299299
// ~ emit Verified(string): 0x20, 0x16, "Successfully verified."
300-
// gas irOptimized: 818076
300+
// gas irOptimized: 817995
301301
// gas legacy: 904397
302302
// gas legacyOptimized: 816770

test/libsolidity/semanticTests/types/mapping/copy_from_mapping_to_mapping.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@ contract C {
2929
}
3030
// ----
3131
// f() -> 0x20, 7, 8, 9, 0xa0, 13, 2, 0x40, 0xa0, 2, 3, 4, 2, 3, 4
32-
// gas irOptimized: 197102
32+
// gas irOptimized: 197092
3333
// gas legacy: 199887
3434
// gas legacyOptimized: 196845

0 commit comments

Comments
 (0)