Skip to content

Commit 28d6217

Browse files
authored
Merge pull request #16595 from argotorg/fix-cycling-shuffler
SSA: Fix cycle in stack shuffler
2 parents cc58705 + 47c8361 commit 28d6217

7 files changed

Lines changed: 49 additions & 140 deletions

libyul/backends/evm/ssa/StackShuffler.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -792,7 +792,7 @@ class StackShuffler
792792
static std::optional<StackOffset> allNecessarySlotsReachableOrFinal(Stack<Callback> const& _stack, detail::State const& _state)
793793
{
794794
// check that args are either in position or reachable
795-
for (StackOffset const offset: _state.stackArgsRange())
795+
for (StackOffset offset{_state.target().tailSize}; offset < _state.target().size; ++offset.value)
796796
{
797797
if (_state.isArgsCompatible(offset, offset))
798798
continue;

test/libyul/ssa/stackShuffler/dup_value_into_args_with_grow_1.stack

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,30 +11,13 @@ targetStackTop: [v2, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, phi1,
1111
// DUP2| v3 * * * * * * * * * phi1 * v1 v2 lit2 v2
1212
// PUSH lit1| v3 * * * * * * * * * phi1 * v1 v2 lit2 v2 lit1
1313
// DUP2| v3 * * * * * * * * * phi1 * v1 v2 lit2 v2 lit1 v2
14-
// DUP2| v3 * * * * * * * * * phi1 * v1 v2 lit2 v2 lit1 v2 lit1
15-
// SWAP6| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 lit1 v2 v1
16-
// SWAP1| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 lit1 v1 v2
17-
// SWAP2| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1 lit1
18-
// POP| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1
19-
// DUP6| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1 lit1
20-
// SWAP2| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 lit1 v1 v2
21-
// SWAP2| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1 lit1
22-
// POP| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1
23-
// DUP6| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1 lit1
24-
// SWAP2| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 lit1 v1 v2
25-
// SWAP2| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1 lit1
26-
// POP| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1
27-
// DUP6| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1 lit1
28-
// SWAP2| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 lit1 v1 v2
29-
// SWAP2| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1 lit1
30-
// POP| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1
31-
// DUP6| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1 lit1
32-
// SWAP2| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 lit1 v1 v2
33-
// SWAP2| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1 lit1
34-
// POP| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1
35-
// DUP6| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1 lit1
36-
// SWAP2| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 lit1 v1 v2
37-
// ...|
14+
// SWAP1| v3 * * * * * * * * * phi1 * v1 v2 lit2 v2 v2 lit1
15+
// POP| v3 * * * * * * * * * phi1 * v1 v2 lit2 v2 v2
16+
// SWAP16| v2 * * * * * * * * * phi1 * v1 v2 lit2 v2 v3
17+
// PUSH lit1| v2 * * * * * * * * * phi1 * v1 v2 lit2 v2 v3 lit1
18+
// SWAP5| v2 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v3 v1
19+
// DUP6| v2 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v3 v1 lit1
20+
// SWAP2| v2 * * * * * * * * * phi1 * lit1 v2 lit2 v2 lit1 v1 v3
3821
// +-------------------------------------------------------------------------------------------------------------------------------------
3922
// (target)| v2 * * * * * * * * * phi1 * lit1 v2 lit2 v2 lit1 v1 v3
40-
// Status: MaxIterationsReached
23+
// Status: Admissible

test/libyul/ssa/stackShuffler/dup_value_into_tail_and_args.stack

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,30 +11,13 @@ targetStackTop: [JUNK, JUNK, v2, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK,
1111
// DUP2| * * v3 * * * * * * * * * * * v1 v2 lit2 v2
1212
// PUSH lit3| * * v3 * * * * * * * * * * * v1 v2 lit2 v2 lit3
1313
// DUP2| * * v3 * * * * * * * * * * * v1 v2 lit2 v2 lit3 v2
14-
// PUSH lit1| * * v3 * * * * * * * * * * * v1 v2 lit2 v2 lit3 v2 lit1
15-
// SWAP6| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 lit3 v2 v1
16-
// SWAP1| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 lit3 v1 v2
17-
// SWAP2| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1 lit3
18-
// POP| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1
19-
// PUSH lit3| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1 lit3
20-
// SWAP2| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 lit3 v1 v2
21-
// SWAP2| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1 lit3
22-
// POP| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1
23-
// PUSH lit3| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1 lit3
24-
// SWAP2| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 lit3 v1 v2
25-
// SWAP2| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1 lit3
26-
// POP| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1
27-
// PUSH lit3| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1 lit3
28-
// SWAP2| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 lit3 v1 v2
29-
// SWAP2| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1 lit3
30-
// POP| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1
31-
// PUSH lit3| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1 lit3
32-
// SWAP2| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 lit3 v1 v2
33-
// SWAP2| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1 lit3
34-
// POP| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1
35-
// PUSH lit3| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1 lit3
36-
// SWAP2| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 lit3 v1 v2
37-
// ...|
14+
// SWAP1| * * v3 * * * * * * * * * * * v1 v2 lit2 v2 v2 lit3
15+
// POP| * * v3 * * * * * * * * * * * v1 v2 lit2 v2 v2
16+
// SWAP16| * * v2 * * * * * * * * * * * v1 v2 lit2 v2 v3
17+
// PUSH lit1| * * v2 * * * * * * * * * * * v1 v2 lit2 v2 v3 lit1
18+
// SWAP5| * * v2 * * * * * * * * * * * lit1 v2 lit2 v2 v3 v1
19+
// PUSH lit3| * * v2 * * * * * * * * * * * lit1 v2 lit2 v2 v3 v1 lit3
20+
// SWAP2| * * v2 * * * * * * * * * * * lit1 v2 lit2 v2 lit3 v1 v3
3821
// +---------------------------------------------------------------------------------------------------------------------------------------------------
3922
// (target)| * * v2 * * * * * * * * * * * lit1 v2 lit2 v2 lit3 v1 v3
40-
// Status: MaxIterationsReached
23+
// Status: Admissible

test/libyul/ssa/stackShuffler/multi_dup_with_phi_in_tail.stack

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,30 +11,13 @@ targetStackTop: [JUNK, v5, JUNK, v1, v2, JUNK, JUNK, JUNK, JUNK, phi1, JUNK, v3,
1111
// DUP2| * v6 * v1 v2 * * * * phi1 * v3 phi2 v4 v5 lit2 v5
1212
// PUSH lit3| * v6 * v1 v2 * * * * phi1 * v3 phi2 v4 v5 lit2 v5 lit3
1313
// DUP2| * v6 * v1 v2 * * * * phi1 * v3 phi2 v4 v5 lit2 v5 lit3 v5
14-
// PUSH lit1| * v6 * v1 v2 * * * * phi1 * v3 phi2 v4 v5 lit2 v5 lit3 v5 lit1
15-
// SWAP6| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 lit3 v5 v4
16-
// SWAP1| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 lit3 v4 v5
17-
// SWAP2| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4 lit3
18-
// POP| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4
19-
// PUSH lit3| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4 lit3
20-
// SWAP2| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 lit3 v4 v5
21-
// SWAP2| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4 lit3
22-
// POP| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4
23-
// PUSH lit3| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4 lit3
24-
// SWAP2| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 lit3 v4 v5
25-
// SWAP2| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4 lit3
26-
// POP| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4
27-
// PUSH lit3| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4 lit3
28-
// SWAP2| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 lit3 v4 v5
29-
// SWAP2| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4 lit3
30-
// POP| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4
31-
// PUSH lit3| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4 lit3
32-
// SWAP2| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 lit3 v4 v5
33-
// SWAP2| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4 lit3
34-
// POP| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4
35-
// PUSH lit3| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4 lit3
36-
// SWAP2| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 lit3 v4 v5
37-
// ...|
14+
// SWAP1| * v6 * v1 v2 * * * * phi1 * v3 phi2 v4 v5 lit2 v5 v5 lit3
15+
// POP| * v6 * v1 v2 * * * * phi1 * v3 phi2 v4 v5 lit2 v5 v5
16+
// SWAP16| * v5 * v1 v2 * * * * phi1 * v3 phi2 v4 v5 lit2 v5 v6
17+
// PUSH lit1| * v5 * v1 v2 * * * * phi1 * v3 phi2 v4 v5 lit2 v5 v6 lit1
18+
// SWAP5| * v5 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v6 v4
19+
// PUSH lit3| * v5 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v6 v4 lit3
20+
// SWAP2| * v5 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 lit3 v4 v6
3821
// +--------------------------------------------------------------------------------------------------------------------------------------------
3922
// (target)| * v5 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 lit3 v4 v6
40-
// Status: MaxIterationsReached
23+
// Status: Admissible

0 commit comments

Comments
 (0)