Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion libyul/backends/evm/ssa/StackShuffler.h
Original file line number Diff line number Diff line change
Expand Up @@ -792,7 +792,7 @@ class StackShuffler
static std::optional<StackOffset> allNecessarySlotsReachableOrFinal(Stack<Callback> const& _stack, detail::State const& _state)
{
// check that args are either in position or reachable
for (StackOffset const offset: _state.stackArgsRange())
for (StackOffset offset{_state.target().tailSize}; offset < _state.target().size; ++offset.value)
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we need a helper method for this. This is the second occurrence where we need this kind of iteration, which means it is time to put it in a helper with a proper name. Just not sure what would a good name actually be.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what about argsRange in the State?
I.e. something along the lines of

auto argsRange() const
{
	return ranges::views::iota(m_target.tailSize, m_stackData.size()) | ranges::views::transform([](auto _i) { return StackOffset{_i}; });
}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this would work. The point is that the range cannot be limited by the current stack data.
The needs to cover the target arg slot offsets.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, sorry, I meant the iota range from tailSize to targetSize...

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, that should work. And we can call it targetArgsRange, maybe?

{
if (_state.isArgsCompatible(offset, offset))
continue;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,30 +11,13 @@ targetStackTop: [v2, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, phi1,
// DUP2| v3 * * * * * * * * * phi1 * v1 v2 lit2 v2
// PUSH lit1| v3 * * * * * * * * * phi1 * v1 v2 lit2 v2 lit1
// DUP2| v3 * * * * * * * * * phi1 * v1 v2 lit2 v2 lit1 v2
// DUP2| v3 * * * * * * * * * phi1 * v1 v2 lit2 v2 lit1 v2 lit1
// SWAP6| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 lit1 v2 v1
// SWAP1| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 lit1 v1 v2
// SWAP2| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1 lit1
// POP| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1
// DUP6| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1 lit1
// SWAP2| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 lit1 v1 v2
// SWAP2| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1 lit1
// POP| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1
// DUP6| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1 lit1
// SWAP2| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 lit1 v1 v2
// SWAP2| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1 lit1
// POP| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1
// DUP6| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1 lit1
// SWAP2| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 lit1 v1 v2
// SWAP2| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1 lit1
// POP| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1
// DUP6| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1 lit1
// SWAP2| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 lit1 v1 v2
// SWAP2| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1 lit1
// POP| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1
// DUP6| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v2 v1 lit1
// SWAP2| v3 * * * * * * * * * phi1 * lit1 v2 lit2 v2 lit1 v1 v2
// ...|
// SWAP1| v3 * * * * * * * * * phi1 * v1 v2 lit2 v2 v2 lit1
// POP| v3 * * * * * * * * * phi1 * v1 v2 lit2 v2 v2
// SWAP16| v2 * * * * * * * * * phi1 * v1 v2 lit2 v2 v3
// PUSH lit1| v2 * * * * * * * * * phi1 * v1 v2 lit2 v2 v3 lit1
// SWAP5| v2 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v3 v1
// DUP6| v2 * * * * * * * * * phi1 * lit1 v2 lit2 v2 v3 v1 lit1
// SWAP2| v2 * * * * * * * * * phi1 * lit1 v2 lit2 v2 lit1 v1 v3
// +-------------------------------------------------------------------------------------------------------------------------------------
// (target)| v2 * * * * * * * * * phi1 * lit1 v2 lit2 v2 lit1 v1 v3
// Status: MaxIterationsReached
// Status: Admissible
33 changes: 8 additions & 25 deletions test/libyul/ssa/stackShuffler/dup_value_into_tail_and_args.stack
Original file line number Diff line number Diff line change
Expand Up @@ -11,30 +11,13 @@ targetStackTop: [JUNK, JUNK, v2, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK, JUNK,
// DUP2| * * v3 * * * * * * * * * * * v1 v2 lit2 v2
// PUSH lit3| * * v3 * * * * * * * * * * * v1 v2 lit2 v2 lit3
// DUP2| * * v3 * * * * * * * * * * * v1 v2 lit2 v2 lit3 v2
// PUSH lit1| * * v3 * * * * * * * * * * * v1 v2 lit2 v2 lit3 v2 lit1
// SWAP6| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 lit3 v2 v1
// SWAP1| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 lit3 v1 v2
// SWAP2| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1 lit3
// POP| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1
// PUSH lit3| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1 lit3
// SWAP2| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 lit3 v1 v2
// SWAP2| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1 lit3
// POP| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1
// PUSH lit3| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1 lit3
// SWAP2| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 lit3 v1 v2
// SWAP2| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1 lit3
// POP| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1
// PUSH lit3| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1 lit3
// SWAP2| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 lit3 v1 v2
// SWAP2| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1 lit3
// POP| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1
// PUSH lit3| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1 lit3
// SWAP2| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 lit3 v1 v2
// SWAP2| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1 lit3
// POP| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1
// PUSH lit3| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 v2 v1 lit3
// SWAP2| * * v3 * * * * * * * * * * * lit1 v2 lit2 v2 lit3 v1 v2
// ...|
// SWAP1| * * v3 * * * * * * * * * * * v1 v2 lit2 v2 v2 lit3
// POP| * * v3 * * * * * * * * * * * v1 v2 lit2 v2 v2
// SWAP16| * * v2 * * * * * * * * * * * v1 v2 lit2 v2 v3
// PUSH lit1| * * v2 * * * * * * * * * * * v1 v2 lit2 v2 v3 lit1
// SWAP5| * * v2 * * * * * * * * * * * lit1 v2 lit2 v2 v3 v1
// PUSH lit3| * * v2 * * * * * * * * * * * lit1 v2 lit2 v2 v3 v1 lit3
// SWAP2| * * v2 * * * * * * * * * * * lit1 v2 lit2 v2 lit3 v1 v3
// +---------------------------------------------------------------------------------------------------------------------------------------------------
// (target)| * * v2 * * * * * * * * * * * lit1 v2 lit2 v2 lit3 v1 v3
// Status: MaxIterationsReached
// Status: Admissible
33 changes: 8 additions & 25 deletions test/libyul/ssa/stackShuffler/multi_dup_with_phi_in_tail.stack
Original file line number Diff line number Diff line change
Expand Up @@ -11,30 +11,13 @@ targetStackTop: [JUNK, v5, JUNK, v1, v2, JUNK, JUNK, JUNK, JUNK, phi1, JUNK, v3,
// DUP2| * v6 * v1 v2 * * * * phi1 * v3 phi2 v4 v5 lit2 v5
// PUSH lit3| * v6 * v1 v2 * * * * phi1 * v3 phi2 v4 v5 lit2 v5 lit3
// DUP2| * v6 * v1 v2 * * * * phi1 * v3 phi2 v4 v5 lit2 v5 lit3 v5
// PUSH lit1| * v6 * v1 v2 * * * * phi1 * v3 phi2 v4 v5 lit2 v5 lit3 v5 lit1
// SWAP6| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 lit3 v5 v4
// SWAP1| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 lit3 v4 v5
// SWAP2| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4 lit3
// POP| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4
// PUSH lit3| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4 lit3
// SWAP2| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 lit3 v4 v5
// SWAP2| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4 lit3
// POP| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4
// PUSH lit3| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4 lit3
// SWAP2| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 lit3 v4 v5
// SWAP2| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4 lit3
// POP| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4
// PUSH lit3| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4 lit3
// SWAP2| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 lit3 v4 v5
// SWAP2| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4 lit3
// POP| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4
// PUSH lit3| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4 lit3
// SWAP2| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 lit3 v4 v5
// SWAP2| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4 lit3
// POP| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4
// PUSH lit3| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v5 v4 lit3
// SWAP2| * v6 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 lit3 v4 v5
// ...|
// SWAP1| * v6 * v1 v2 * * * * phi1 * v3 phi2 v4 v5 lit2 v5 v5 lit3
// POP| * v6 * v1 v2 * * * * phi1 * v3 phi2 v4 v5 lit2 v5 v5
// SWAP16| * v5 * v1 v2 * * * * phi1 * v3 phi2 v4 v5 lit2 v5 v6
// PUSH lit1| * v5 * v1 v2 * * * * phi1 * v3 phi2 v4 v5 lit2 v5 v6 lit1
// SWAP5| * v5 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v6 v4
// PUSH lit3| * v5 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 v6 v4 lit3
// SWAP2| * v5 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 lit3 v4 v6
// +--------------------------------------------------------------------------------------------------------------------------------------------
// (target)| * v5 * v1 v2 * * * * phi1 * v3 phi2 lit1 v5 lit2 v5 lit3 v4 v6
// Status: MaxIterationsReached
// Status: Admissible
Loading