From 65d9215f96148ddb76fd4127815f6bdae46a5557 Mon Sep 17 00:00:00 2001 From: blishko Date: Wed, 15 Apr 2026 23:49:44 +0200 Subject: [PATCH 1/2] SSA: Use ranges::contains to be more concise --- libyul/backends/evm/ssa/StackShuffler.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libyul/backends/evm/ssa/StackShuffler.h b/libyul/backends/evm/ssa/StackShuffler.h index 70c381a899dc..d511fe115df4 100644 --- a/libyul/backends/evm/ssa/StackShuffler.h +++ b/libyul/backends/evm/ssa/StackShuffler.h @@ -23,6 +23,7 @@ #include +#include #include #include #include @@ -161,9 +162,9 @@ class StackShuffler // check that all required values are on stack detail::State const state(_stack.data(), target, ReachableStackDepth); for (auto const& liveVariable: _liveOut | ranges::views::keys | ranges::views::transform(Slot::makeValueID)) - yulAssert(_stack.canBeFreelyGenerated(liveVariable) || ranges::find(_stack.data(), liveVariable) != ranges::end(_stack.data())); + yulAssert(_stack.canBeFreelyGenerated(liveVariable) || ranges::contains(_stack.data(), liveVariable)); for (auto const& arg: _args) - yulAssert(_stack.canBeFreelyGenerated(arg) || ranges::find(_stack.data(), arg) != ranges::end(_stack.data())); + yulAssert(_stack.canBeFreelyGenerated(arg) || ranges::contains(_stack.data(), arg)); } static std::size_t constexpr maxIterations = 1000; From 1d0801461452d51995e92b348e81487da711b44b Mon Sep 17 00:00:00 2001 From: blishko Date: Wed, 15 Apr 2026 23:50:37 +0200 Subject: [PATCH 2/2] SSA: Only allow values in requested live variables --- libyul/backends/evm/ssa/StackShuffler.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libyul/backends/evm/ssa/StackShuffler.h b/libyul/backends/evm/ssa/StackShuffler.h index d511fe115df4..974fd2386ae5 100644 --- a/libyul/backends/evm/ssa/StackShuffler.h +++ b/libyul/backends/evm/ssa/StackShuffler.h @@ -162,7 +162,7 @@ class StackShuffler // check that all required values are on stack detail::State const state(_stack.data(), target, ReachableStackDepth); for (auto const& liveVariable: _liveOut | ranges::views::keys | ranges::views::transform(Slot::makeValueID)) - yulAssert(_stack.canBeFreelyGenerated(liveVariable) || ranges::contains(_stack.data(), liveVariable)); + yulAssert(!_stack.canBeFreelyGenerated(liveVariable) && ranges::contains(_stack.data(), liveVariable)); for (auto const& arg: _args) yulAssert(_stack.canBeFreelyGenerated(arg) || ranges::contains(_stack.data(), arg)); }