Skip to content

Commit 93cd9f7

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 e10eb96 commit 93cd9f7

9 files changed

Lines changed: 20 additions & 35 deletions

File tree

libyul/backends/evm/ssa/StackShuffler.h

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

472455
// 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: 79879
45-
// gas ssaCFGOptimized code: 331800
44+
// gas ssaCFGOptimized: 79815
45+
// gas ssaCFGOptimized code: 331000
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: 3077081
69+
// gas ssaCFGOptimized: 3066081

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: 809592
189-
// gas ssaCFGOptimized code: 569200
188+
// gas ssaCFGOptimized: 809647
189+
// gas ssaCFGOptimized code: 569800
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: 77772
46+
// gas ssaCFGOptimized code: 310800
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: 96128
62-
// gas ssaCFGOptimized code: 531800
61+
// gas ssaCFGOptimized: 95933
62+
// gas ssaCFGOptimized code: 529600
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: 1882325
83+
// gas ssaCFGOptimized: 1841205

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/shrink_lifting_deep_phi.stack

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ targetStackSize: 12
99
// POP| phi0 v0 lit0 | v0 lit0 v0 lit0 v0 v0 lit0 v0
1010
// DUP11| phi0 v0 lit0 | v0 lit0 v0 lit0 v0 v0 lit0 v0 phi0
1111
// SWAP5| phi0 v0 lit0 | v0 lit0 v0 phi0 v0 v0 lit0 v0 lit0
12-
// SWAP10| phi0 lit0 lit0 | v0 lit0 v0 phi0 v0 v0 lit0 v0 v0
12+
// POP| phi0 v0 lit0 | v0 lit0 v0 phi0 v0 v0 lit0 v0
13+
// DUP1| phi0 v0 lit0 | v0 lit0 v0 phi0 v0 v0 lit0 v0 v0
1314
// +--------------------- +---------------------------------------------------------------
1415
// (target)| {} | * lit0 v0 phi0 v0 v0 lit0 v0 v0
1516
// Status: Admissible

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)