diff --git a/libyul/CMakeLists.txt b/libyul/CMakeLists.txt
index bc686ddf3..dee8d1224 100644
--- a/libyul/CMakeLists.txt
+++ b/libyul/CMakeLists.txt
@@ -62,6 +62,8 @@ add_library(yul
optimiser/BlockFlattener.h
optimiser/BlockHasher.cpp
optimiser/BlockHasher.h
+ optimiser/CallGraphGenerator.cpp
+ optimiser/CallGraphGenerator.h
optimiser/CommonSubexpressionEliminator.cpp
optimiser/CommonSubexpressionEliminator.h
optimiser/ControlFlowSimplifier.cpp
diff --git a/libyul/optimiser/CallGraphGenerator.cpp b/libyul/optimiser/CallGraphGenerator.cpp
new file mode 100644
index 000000000..0e2a63578
--- /dev/null
+++ b/libyul/optimiser/CallGraphGenerator.cpp
@@ -0,0 +1,54 @@
+/*
+ This file is part of solidity.
+
+ solidity is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ solidity is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with solidity. If not, see .
+*/
+/**
+ * Specific AST walker that generates the call graph.
+ */
+
+#include
+#include
+
+#include
+
+#include
+
+using namespace std;
+using namespace dev;
+using namespace yul;
+
+
+void CallGraphGenerator::operator()(FunctionalInstruction const& _functionalInstruction)
+{
+ m_callGraph.insert(m_currentFunction, YulString{
+ dev::eth::instructionInfo(_functionalInstruction.instruction).name
+ });
+ ASTWalker::operator()(_functionalInstruction);
+}
+
+void CallGraphGenerator::operator()(FunctionCall const& _functionCall)
+{
+ m_callGraph.insert(m_currentFunction, _functionCall.functionName.name);
+ ASTWalker::operator()(_functionCall);
+}
+
+void CallGraphGenerator::operator()(FunctionDefinition const& _functionDefinition)
+{
+ YulString previousFunction = m_currentFunction;
+ m_currentFunction = _functionDefinition.name;
+ ASTWalker::operator()(_functionDefinition);
+ m_currentFunction = previousFunction;
+}
+
diff --git a/libyul/optimiser/CallGraphGenerator.h b/libyul/optimiser/CallGraphGenerator.h
new file mode 100644
index 000000000..212d29d04
--- /dev/null
+++ b/libyul/optimiser/CallGraphGenerator.h
@@ -0,0 +1,57 @@
+/*
+ This file is part of solidity.
+
+ solidity is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ solidity is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with solidity. If not, see .
+*/
+/**
+ * Specific AST walker that generates the call graph.
+ */
+
+#pragma once
+
+#include
+
+#include
+
+#include
+
+#include
+#include