Skip to content

Commit 929b4e2

Browse files
committed
SSA: Remove some shuffler logic
This piece of logic was swapping top to the tail region if case the top is not in its right place and it wants to be in tail anyway. I don't have an explanation why this is useful, but it seems to improve code generation on most external benchmarks.
1 parent 28d6217 commit 929b4e2

8 files changed

Lines changed: 18 additions & 34 deletions

File tree

libyul/backends/evm/ssa/StackShuffler.h

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -446,23 +446,6 @@ class StackShuffler
446446
_stack.swap(offset);
447447
return {ShuffleHelperResult::Status::StackModified};
448448
}
449-
450-
// try swapping top with a tail slot that has what we need at top
451-
for (StackOffset tailOffset: _state.stackTailRange())
452-
if (
453-
_stack.isValidSwapTarget(tailOffset) &&
454-
_state.isArgsCompatible(tailOffset, stackTop) &&
455-
(!_state.requiredInTail(_stack[tailOffset]) || _state.countInTail(_stack[tailOffset]) > 1) &&
456-
// current top can safely go to tail (not needed in args, or we have excess)
457-
(
458-
!_state.requiredInArgs(_stack[stackTop]) ||
459-
_state.countInArgs(_stack[stackTop]) > _state.targetArgsCount(_stack[stackTop])
460-
)
461-
)
462-
{
463-
_stack.swap(tailOffset);
464-
return {ShuffleHelperResult::Status::StackModified};
465-
}
466449
}
467450

468451
// swap up any slot in args that is out of position and has a slot available in args that it can occupy

test/libsolidity/semanticTests/externalContracts/base64.sol

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ contract test {
4141
// gas legacy code: 629800
4242
// gas legacyOptimized: 87926
4343
// gas legacyOptimized code: 429800
44-
// gas ssaCFGOptimized: 79931
45-
// gas ssaCFGOptimized code: 332600
44+
// gas ssaCFGOptimized: 79867
45+
// gas ssaCFGOptimized code: 331800
4646
// encode_inline_asm(bytes): 0x20, 0 -> 0x20, 0
4747
// encode_inline_asm(bytes): 0x20, 1, "f" -> 0x20, 4, "Zg=="
4848
// encode_inline_asm(bytes): 0x20, 2, "fo" -> 0x20, 4, "Zm8="
@@ -61,9 +61,9 @@ contract test {
6161
// gas irOptimized: 1406025
6262
// gas legacy: 1554038
6363
// gas legacyOptimized: 1132031
64-
// gas ssaCFGOptimized: 1388025
64+
// gas ssaCFGOptimized: 1386025
6565
// encode_no_asm_large()
6666
// gas irOptimized: 3512081
6767
// gas legacy: 4600082
6868
// gas legacyOptimized: 2813075
69-
// gas ssaCFGOptimized: 3089081
69+
// gas ssaCFGOptimized: 3078081

test/libsolidity/semanticTests/externalContracts/deposit_contract.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,8 +185,8 @@ contract DepositContract is IDepositContract, ERC165 {
185185
// gas legacy code: 1438800
186186
// gas legacyOptimized: 848699
187187
// gas legacyOptimized code: 878200
188-
// gas ssaCFGOptimized: 809663
189-
// gas ssaCFGOptimized code: 570000
188+
// gas ssaCFGOptimized: 809711
189+
// gas ssaCFGOptimized code: 570600
190190
// supportsInterface(bytes4): 0x0 -> 0
191191
// supportsInterface(bytes4): 0xffffffff00000000000000000000000000000000000000000000000000000000 -> false # defined to be false by ERC-165 #
192192
// supportsInterface(bytes4): 0x01ffc9a700000000000000000000000000000000000000000000000000000000 -> true # ERC-165 id #

test/libsolidity/semanticTests/externalContracts/ramanujan_pi.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ contract test {
4242
// gas legacy code: 523600
4343
// gas legacyOptimized: 82667
4444
// gas legacyOptimized code: 369200
45-
// gas ssaCFGOptimized: 77956
46-
// gas ssaCFGOptimized code: 313400
45+
// gas ssaCFGOptimized: 77788
46+
// gas ssaCFGOptimized code: 311000
4747
// prb_pi() -> 3141592656369545286
4848
// gas irOptimized: 55036
4949
// gas legacy: 100657

test/libsolidity/semanticTests/externalContracts/snark.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -297,10 +297,10 @@ contract Test {
297297
// gas irOptimized: 275229
298298
// gas legacy: 293579
299299
// gas legacyOptimized: 276313
300-
// gas ssaCFGOptimized: 275795
300+
// gas ssaCFGOptimized: 275787
301301
// verifyTx() -> true
302302
// ~ emit Verified(string): 0x20, 0x16, "Successfully verified."
303303
// gas irOptimized: 818076
304304
// gas legacy: 904397
305305
// gas legacyOptimized: 816770
306-
// gas ssaCFGOptimized: 820130
306+
// gas ssaCFGOptimized: 820110

test/libsolidity/semanticTests/externalContracts/strings.sol

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ contract test {
5858
// gas legacy code: 932600
5959
// gas legacyOptimized: 102639
6060
// gas legacyOptimized code: 612400
61-
// gas ssaCFGOptimized: 96160
62-
// gas ssaCFGOptimized code: 532200
61+
// gas ssaCFGOptimized: 95989
62+
// gas ssaCFGOptimized code: 530000
6363
// toSlice(string): 0x20, 11, "hello world" -> 11, 0xa0
6464
// gas irOptimized: 22646
6565
// gas legacy: 23168
@@ -80,4 +80,4 @@ contract test {
8080
// gas irOptimized: 1976778
8181
// gas legacy: 4234020
8282
// gas legacyOptimized: 2318668
83-
// gas ssaCFGOptimized: 1882355
83+
// gas ssaCFGOptimized: 1841235

test/libyul/ssa/stackLayoutGenerator/nested_for.yul

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,11 +107,11 @@
107107
// Block0_3 [label="\
108108
// IN: [phi0, phi3, JUNK]\l\
109109
// \l\
110-
// [JUNK, phi3, lit2, phi0]\l\
110+
// [phi3, lit2, phi0]\l\
111111
// add\l\
112-
// [JUNK, phi3, v5]\l\
112+
// [phi3, v5]\l\
113113
// \l\
114-
// OUT: [JUNK, phi3, v5]\l\
114+
// OUT: [phi3, v5]\l\
115115
// "];
116116
// Block0_3 -> Block0_3Exit [arrowhead=none];
117117
// Block0_3Exit [label="Jump" shape=oval];

test/libyul/ssa/stackShuffler/swap_junk_over_pop.stack

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ targetStackSize: 4
88
// (initial)| v0 | * v2
99
// PUSH lit2| v0 | * v2 lit2
1010
// SWAP2| v0 | lit2 v2 *
11-
// SWAP3| * | lit2 v2 v0
11+
// POP| v0 | lit2 v2
12+
// DUP3| v0 | lit2 v2 v0
1213
// +------- +---------------------
1314
// (target)| {} | lit2 v2 v0
1415
// Status: Admissible

0 commit comments

Comments
 (0)