Skip to content

Commit 30984b1

Browse files
authored
Merge pull request #16603 from argotorg/ssa-fix-shuffler-cycling
SSA: More controlled stack growing in shuffler
2 parents 28d6217 + 6b61167 commit 30984b1

9 files changed

Lines changed: 28 additions & 52 deletions

libyul/backends/evm/ssa/StackShuffler.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,3 +195,13 @@ bool State::willRequireShrinking() const
195195
}
196196
return deficit + size() > target().size;
197197
}
198+
199+
std::optional<StackDepth> State::findDeepestIncorrectArgSlot() const
200+
{
201+
for (StackOffset const offset: stackArgsRange())
202+
{
203+
if (!isArgsCompatible(offset, offset))
204+
return StackDepth{m_stackData.size() - offset.value};
205+
}
206+
return std::nullopt;
207+
}

libyul/backends/evm/ssa/StackShuffler.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,9 @@ class State
124124
return ranges::views::iota(0u, std::min(m_stackData.size(), m_reachableStackDepth)) | ranges::views::transform([&](auto _i) { return StackOffset{m_stackData.size() - _i - 1}; });
125125
}
126126

127+
/// Depth of the deepest arg slot incompatible with target or Nothing for no incompatibility in current state
128+
std::optional<StackDepth> findDeepestIncorrectArgSlot() const;
129+
127130
private:
128131
StackData const& m_stackData;
129132
Target const& m_target;
@@ -505,6 +508,8 @@ class StackShuffler
505508
if (auto result = dupDeepSlotIfRequired(_stack, _state); result.status != ShuffleHelperResult::Status::NoAction)
506509
return result;
507510

511+
auto const maybeIncorrectArgSlotDepth = _state.findDeepestIncorrectArgSlot();
512+
if (!maybeIncorrectArgSlotDepth || maybeIncorrectArgSlotDepth->value < ReachableStackDepth - 1)
508513
{
509514
StackOffset const targetOffset{_stack.size()};
510515
if (_state.count(_state.targetArg(targetOffset)) < _state.targetMinCount(_state.targetArg(targetOffset)))

test/libyul/ssa/stackShuffler/deep_values_grow_to_args.stack

Lines changed: 7 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,12 @@ targetStackTop: [JUNK, v2, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK,
88
// POP| * * * * * * * * * * * * * v1 v2
99
// PUSH lit2| * * * * * * * * * * * * * v1 v2 lit2
1010
// DUP2| * * * * * * * * * * * * * v1 v2 lit2 v2
11-
// PUSH lit3| * * * * * * * * * * * * * v1 v2 lit2 v2 lit3
12-
// DUP2| * * * * * * * * * * * * * v1 v2 lit2 v2 lit3 v2
13-
// PUSH lit1| * * * * * * * * * * * * * v1 v2 lit2 v2 lit3 v2 lit1
14-
// SWAP6| * * * * * * * * * * * * * lit1 v2 lit2 v2 lit3 v2 v1
15-
// SWAP1| * * * * * * * * * * * * * lit1 v2 lit2 v2 lit3 v1 v2
16-
// SWAP7| * * * * * * * * * * * * v2 lit1 v2 lit2 v2 lit3 v1 *
17-
// POP| * * * * * * * * * * * * v2 lit1 v2 lit2 v2 lit3 v1
18-
// DUP3| * * * * * * * * * * * * v2 lit1 v2 lit2 v2 lit3 v1 v2
19-
// SWAP8| * * * * * * * * * * * v2 v2 lit1 v2 lit2 v2 lit3 v1 *
20-
// POP| * * * * * * * * * * * v2 v2 lit1 v2 lit2 v2 lit3 v1
21-
// DUP3| * * * * * * * * * * * v2 v2 lit1 v2 lit2 v2 lit3 v1 v2
22-
// SWAP9| * * * * * * * * * * v2 v2 v2 lit1 v2 lit2 v2 lit3 v1 *
23-
// POP| * * * * * * * * * * v2 v2 v2 lit1 v2 lit2 v2 lit3 v1
24-
// DUP3| * * * * * * * * * * v2 v2 v2 lit1 v2 lit2 v2 lit3 v1 v2
25-
// SWAP10| * * * * * * * * * v2 v2 v2 v2 lit1 v2 lit2 v2 lit3 v1 *
26-
// POP| * * * * * * * * * v2 v2 v2 v2 lit1 v2 lit2 v2 lit3 v1
27-
// DUP3| * * * * * * * * * v2 v2 v2 v2 lit1 v2 lit2 v2 lit3 v1 v2
28-
// SWAP11| * * * * * * * * v2 v2 v2 v2 v2 lit1 v2 lit2 v2 lit3 v1 *
29-
// POP| * * * * * * * * v2 v2 v2 v2 v2 lit1 v2 lit2 v2 lit3 v1
30-
// DUP3| * * * * * * * * v2 v2 v2 v2 v2 lit1 v2 lit2 v2 lit3 v1 v2
31-
// SWAP12| * * * * * * * v2 v2 v2 v2 v2 v2 lit1 v2 lit2 v2 lit3 v1 *
32-
// POP| * * * * * * * v2 v2 v2 v2 v2 v2 lit1 v2 lit2 v2 lit3 v1
33-
// DUP3| * * * * * * * v2 v2 v2 v2 v2 v2 lit1 v2 lit2 v2 lit3 v1 v2
34-
// SWAP13| * * * * * * v2 v2 v2 v2 v2 v2 v2 lit1 v2 lit2 v2 lit3 v1 *
35-
// POP| * * * * * * v2 v2 v2 v2 v2 v2 v2 lit1 v2 lit2 v2 lit3 v1
36-
// DUP3| * * * * * * v2 v2 v2 v2 v2 v2 v2 lit1 v2 lit2 v2 lit3 v1 v2
37-
// ...|
11+
// DUP1| * * * * * * * * * * * * * v1 v2 lit2 v2 v2
12+
// SWAP16| * v2 * * * * * * * * * * * v1 v2 lit2 v2 *
13+
// PUSH lit1| * v2 * * * * * * * * * * * v1 v2 lit2 v2 * lit1
14+
// SWAP5| * v2 * * * * * * * * * * * lit1 v2 lit2 v2 * v1
15+
// PUSH lit3| * v2 * * * * * * * * * * * lit1 v2 lit2 v2 * v1 lit3
16+
// SWAP2| * v2 * * * * * * * * * * * lit1 v2 lit2 v2 lit3 v1 *
3817
// +--------------------------------------------------------------------------------------------------------------------------------------------
3918
// (target)| * v2 * * * * * * * * * * * lit1 v2 lit2 v2 lit3 v1 *
40-
// Status: MaxIterationsReached
19+
// Status: Admissible

test/libyul/ssa/stackShuffler/dup_value_into_args_with_grow_1.stack

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,7 @@ targetStackTop: [v2, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, phi1,
99
// POP| v3 * * * * * * * * * phi1 * v1 v2
1010
// PUSH lit2| v3 * * * * * * * * * phi1 * v1 v2 lit2
1111
// DUP2| v3 * * * * * * * * * phi1 * v1 v2 lit2 v2
12-
// PUSH lit1| v3 * * * * * * * * * phi1 * v1 v2 lit2 v2 lit1
13-
// DUP2| v3 * * * * * * * * * phi1 * v1 v2 lit2 v2 lit1 v2
14-
// SWAP1| v3 * * * * * * * * * phi1 * v1 v2 lit2 v2 v2 lit1
15-
// POP| v3 * * * * * * * * * phi1 * v1 v2 lit2 v2 v2
12+
// DUP1| v3 * * * * * * * * * phi1 * v1 v2 lit2 v2 v2
1613
// SWAP16| v2 * * * * * * * * * phi1 * v1 v2 lit2 v2 v3
1714
// PUSH lit1| v2 * * * * * * * * * phi1 * v1 v2 lit2 v2 v3 lit1
1815
// SWAP5| v2 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v3 v1

test/libyul/ssa/stackShuffler/dup_value_into_tail_and_args.stack

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,7 @@ targetStackTop: [JUNK, JUNK, v2, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK,
99
// POP| * * v3 * * * * * * * * * * * v1 v2
1010
// PUSH lit2| * * v3 * * * * * * * * * * * v1 v2 lit2
1111
// DUP2| * * v3 * * * * * * * * * * * v1 v2 lit2 v2
12-
// PUSH lit3| * * v3 * * * * * * * * * * * v1 v2 lit2 v2 lit3
13-
// DUP2| * * v3 * * * * * * * * * * * v1 v2 lit2 v2 lit3 v2
14-
// SWAP1| * * v3 * * * * * * * * * * * v1 v2 lit2 v2 v2 lit3
15-
// POP| * * v3 * * * * * * * * * * * v1 v2 lit2 v2 v2
12+
// DUP1| * * v3 * * * * * * * * * * * v1 v2 lit2 v2 v2
1613
// SWAP16| * * v2 * * * * * * * * * * * v1 v2 lit2 v2 v3
1714
// PUSH lit1| * * v2 * * * * * * * * * * * v1 v2 lit2 v2 v3 lit1
1815
// SWAP5| * * v2 * * * * * * * * * * * lit1 v2 lit2 v2 v3 v1

test/libyul/ssa/stackShuffler/multi_dup_with_phi_in_tail.stack

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,7 @@ targetStackTop: [JUNK, v5, JUNK, v1, v2, JUNK, JUNK, JUNK, JUNK, phi1, JUNK, v3,
99
// POP| * v6 * v1 v2 * * * * phi1 * v3 phi2 v4 v5
1010
// PUSH lit2| * v6 * v1 v2 * * * * phi1 * v3 phi2 v4 v5 lit2
1111
// DUP2| * v6 * v1 v2 * * * * phi1 * v3 phi2 v4 v5 lit2 v5
12-
// PUSH lit3| * v6 * v1 v2 * * * * phi1 * v3 phi2 v4 v5 lit2 v5 lit3
13-
// DUP2| * v6 * v1 v2 * * * * phi1 * v3 phi2 v4 v5 lit2 v5 lit3 v5
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
12+
// DUP1| * v6 * v1 v2 * * * * phi1 * v3 phi2 v4 v5 lit2 v5 v5
1613
// SWAP16| * v5 * v1 v2 * * * * phi1 * v3 phi2 v4 v5 lit2 v5 v6
1714
// PUSH lit1| * v5 * v1 v2 * * * * phi1 * v3 phi2 v4 v5 lit2 v5 v6 lit1
1815
// SWAP5| * v5 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v6 v4

test/libyul/ssa/stackShuffler/return_label_with_dup_and_grow.stack

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,7 @@ targetStackTop: [ReturnLabel[1], JUNK, JUNK, v2, JUNK, JUNK, JUNK, JUNK, JUNK, J
2020
// POP| ReturnLabel[1] * * v3 * * * * * * * * * * * v1 v2
2121
// PUSH lit2| ReturnLabel[1] * * v3 * * * * * * * * * * * v1 v2 lit2
2222
// DUP2| ReturnLabel[1] * * v3 * * * * * * * * * * * v1 v2 lit2 v2
23-
// PUSH lit1| ReturnLabel[1] * * v3 * * * * * * * * * * * v1 v2 lit2 v2 lit1
24-
// DUP2| ReturnLabel[1] * * v3 * * * * * * * * * * * v1 v2 lit2 v2 lit1 v2
25-
// SWAP1| ReturnLabel[1] * * v3 * * * * * * * * * * * v1 v2 lit2 v2 v2 lit1
26-
// POP| ReturnLabel[1] * * v3 * * * * * * * * * * * v1 v2 lit2 v2 v2
23+
// DUP1| ReturnLabel[1] * * v3 * * * * * * * * * * * v1 v2 lit2 v2 v2
2724
// SWAP16| ReturnLabel[1] * * v2 * * * * * * * * * * * v1 v2 lit2 v2 v3
2825
// PUSH lit1| ReturnLabel[1] * * v2 * * * * * * * * * * * v1 v2 lit2 v2 v3 lit1
2926
// SWAP5| ReturnLabel[1] * * v2 * * * * * * * * * * * lit1 v2 lit2 v2 v3 v1

test/libyul/ssa/stackShuffler/triple_dup_no_phi.stack

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,7 @@ targetStackTop: [JUNK, v2, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK,
99
// POP| * v3 * * * * * * * * * * * v1 v2
1010
// PUSH lit2| * v3 * * * * * * * * * * * v1 v2 lit2
1111
// DUP2| * v3 * * * * * * * * * * * v1 v2 lit2 v2
12-
// PUSH lit3| * v3 * * * * * * * * * * * v1 v2 lit2 v2 lit3
13-
// DUP2| * v3 * * * * * * * * * * * v1 v2 lit2 v2 lit3 v2
14-
// SWAP1| * v3 * * * * * * * * * * * v1 v2 lit2 v2 v2 lit3
15-
// POP| * v3 * * * * * * * * * * * v1 v2 lit2 v2 v2
12+
// DUP1| * v3 * * * * * * * * * * * v1 v2 lit2 v2 v2
1613
// SWAP16| * v2 * * * * * * * * * * * v1 v2 lit2 v2 v3
1714
// PUSH lit1| * v2 * * * * * * * * * * * v1 v2 lit2 v2 v3 lit1
1815
// SWAP5| * v2 * * * * * * * * * * * lit1 v2 lit2 v2 v3 v1

test/libyul/ssa/stackShuffler/triple_dup_with_phi.stack

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,7 @@ targetStackTop: [JUNK, v2, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, phi1, JUNK, JUNK,
99
// POP| * v3 * * * * * * phi1 * * * * v1 v2
1010
// PUSH lit2| * v3 * * * * * * phi1 * * * * v1 v2 lit2
1111
// DUP2| * v3 * * * * * * phi1 * * * * v1 v2 lit2 v2
12-
// PUSH lit3| * v3 * * * * * * phi1 * * * * v1 v2 lit2 v2 lit3
13-
// DUP2| * v3 * * * * * * phi1 * * * * v1 v2 lit2 v2 lit3 v2
14-
// SWAP1| * v3 * * * * * * phi1 * * * * v1 v2 lit2 v2 v2 lit3
15-
// POP| * v3 * * * * * * phi1 * * * * v1 v2 lit2 v2 v2
12+
// DUP1| * v3 * * * * * * phi1 * * * * v1 v2 lit2 v2 v2
1613
// SWAP16| * v2 * * * * * * phi1 * * * * v1 v2 lit2 v2 v3
1714
// PUSH lit1| * v2 * * * * * * phi1 * * * * v1 v2 lit2 v2 v3 lit1
1815
// SWAP5| * v2 * * * * * * phi1 * * * * lit1 v2 lit2 v2 v3 v1

0 commit comments

Comments
 (0)