2222
2323#include < libyul/optimiser/SSAValueTracker.h>
2424
25+ #include < liblangutil/Exceptions.h>
26+
2527#include < libyul/AST.h>
2628
2729using namespace solidity ;
@@ -31,10 +33,18 @@ void SSAValueTracker::operator()(Assignment const& _assignment)
3133{
3234 for (auto const & var: _assignment.variableNames )
3335 m_values.erase (var.name );
36+
37+ for (auto const & var: _assignment.variableNames )
38+ m_functionParameters.erase (var.name );
3439}
3540
3641void SSAValueTracker::operator ()(FunctionDefinition const & _funDef)
3742{
43+ solAssert (!m_functionParameters.contains (_funDef.name ), " SSAValueTracker requires Disambiguator to run first" );
44+
45+ for (auto const & param: _funDef.parameters )
46+ m_functionParameters.insert (param.name );
47+
3848 for (auto const & var: _funDef.returnVariables )
3949 setValue (var.name , nullptr );
4050 ASTWalker::operator ()(_funDef);
@@ -49,6 +59,35 @@ void SSAValueTracker::operator()(VariableDeclaration const& _varDecl)
4959 setValue (_varDecl.variables .front ().name , _varDecl.value .get ());
5060}
5161
62+ bool SSAValueTracker::isSSAWithDependencies (Expression const * _expression) const
63+ {
64+ if (_expression == nullptr )
65+ return true ;
66+
67+ if (auto const * functionCall = std::get_if<FunctionCall>(_expression))
68+ {
69+ for (auto const & argument: functionCall->arguments )
70+ if (!isSSAWithDependencies (&argument))
71+ return false ;
72+
73+ return true ;
74+ }
75+ else if (auto const * identifier = std::get_if<Identifier>(_expression))
76+ {
77+ if (m_functionParameters.contains (identifier->name ))
78+ return true ;
79+
80+ auto const it = m_values.find (identifier->name );
81+ if (it == m_values.end ())
82+ return false ;
83+ return isSSAWithDependencies (it->second );
84+ }
85+ else
86+ solAssert (std::holds_alternative<Literal>(*_expression), " Impossible expression type" );
87+
88+ return true ;
89+ }
90+
5291std::set<YulName> SSAValueTracker::ssaVariables (Block const & _ast)
5392{
5493 SSAValueTracker t;
0 commit comments