diff --git a/compiler/src/prog8/ast/AstToplevel.kt b/compiler/src/prog8/ast/AstToplevel.kt index 46d8af973..d74650044 100644 --- a/compiler/src/prog8/ast/AstToplevel.kt +++ b/compiler/src/prog8/ast/AstToplevel.kt @@ -54,6 +54,7 @@ interface INameScope { fun linkParents(parent: Node) fun subScopes(): Map { + // TODO PERFORMANCE: this is called very often and is relatively expensive. Optimize this. val subscopes = mutableMapOf() for(stmt in statements) { when(stmt) { @@ -126,7 +127,7 @@ interface INameScope { for(module in localContext.definingModule().program.modules) { var scope: INameScope? = module for(name in scopedName.dropLast(1)) { - scope = scope?.subScopes()?.get(name) + scope = scope?.subScopes()?.get(name) // TODO PERFORMANCE: EXPENSIVE! (creates new map every call) OPTIMIZE. if(scope==null) break } diff --git a/compiler/src/prog8/optimizer/CallGraph.kt b/compiler/src/prog8/optimizer/CallGraph.kt index ad497e61f..40bcd5c3f 100644 --- a/compiler/src/prog8/optimizer/CallGraph.kt +++ b/compiler/src/prog8/optimizer/CallGraph.kt @@ -29,7 +29,7 @@ class CallGraph(private val program: Program) : IAstVisitor { val subroutinesCalling = mutableMapOf>().withDefault { mutableListOf() } val subroutinesCalledBy = mutableMapOf>().withDefault { mutableListOf() } - // TODO add dataflow graph: what statements use what variables + // TODO add dataflow graph: what statements use what variables - can be used to eliminate unused vars val usedSymbols = mutableSetOf() init { diff --git a/compiler/src/prog8/optimizer/StatementOptimizer.kt b/compiler/src/prog8/optimizer/StatementOptimizer.kt index 5b283c333..9c2c25bb5 100644 --- a/compiler/src/prog8/optimizer/StatementOptimizer.kt +++ b/compiler/src/prog8/optimizer/StatementOptimizer.kt @@ -24,7 +24,7 @@ internal class StatementOptimizer(private val program: Program, private set private val pureBuiltinFunctions = BuiltinFunctions.filter { it.value.pure } - private val callgraph = CallGraph(program) + private val callgraph = CallGraph(program) // TODO PERFORMANCE: it is expensive to create this every round private val vardeclsToRemove = mutableListOf() override fun visit(program: Program) { @@ -37,6 +37,7 @@ internal class StatementOptimizer(private val program: Program, } private fun removeUnusedCode(callgraph: CallGraph) { + // TODO PERFORMANCE: expensive code (because of callgraph) OPTIMIZE THIS: only run once separately ? // remove all subroutines that aren't called, or are empty val removeSubroutines = mutableSetOf() val entrypoint = program.entrypoint()