aboutsummaryrefslogtreecommitdiffstats
path: root/libyul/optimiser/ExpressionSplitter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libyul/optimiser/ExpressionSplitter.cpp')
-rw-r--r--libyul/optimiser/ExpressionSplitter.cpp8
1 files changed, 7 insertions, 1 deletions
diff --git a/libyul/optimiser/ExpressionSplitter.cpp b/libyul/optimiser/ExpressionSplitter.cpp
index a3b2dc11..2f80fc32 100644
--- a/libyul/optimiser/ExpressionSplitter.cpp
+++ b/libyul/optimiser/ExpressionSplitter.cpp
@@ -24,6 +24,7 @@
#include <libyul/optimiser/ASTWalker.h>
#include <libyul/AsmData.h>
+#include <libyul/Dialect.h>
#include <libdevcore/CommonData.h>
@@ -43,6 +44,11 @@ void ExpressionSplitter::operator()(FunctionalInstruction& _instruction)
void ExpressionSplitter::operator()(FunctionCall& _funCall)
{
+ if (BuiltinFunction const* builtin = m_dialect.builtin(_funCall.functionName.name))
+ if (builtin->literalArguments)
+ // We cannot outline function arguments that have to be literals
+ return;
+
for (auto& arg: _funCall.arguments | boost::adaptors::reversed)
outlineExpression(arg);
}
@@ -100,7 +106,7 @@ void ExpressionSplitter::outlineExpression(Expression& _expr)
m_statementsToPrefix.emplace_back(VariableDeclaration{
location,
{{TypedName{location, var, {}}}},
- make_shared<Expression>(std::move(_expr))
+ make_unique<Expression>(std::move(_expr))
});
_expr = Identifier{location, var};
}