From dfd9dd4c6ae2d1c50593ea5865348cc5e51e6788 Mon Sep 17 00:00:00 2001 From: Karol Stasiak Date: Mon, 17 Dec 2018 17:03:01 +0100 Subject: [PATCH] Don't remove things referred to only by aliases --- .../scala/millfork/node/opt/NodeOptimization.scala | 10 ++++++++++ src/main/scala/millfork/node/opt/UnusedFunctions.scala | 6 +++++- .../millfork/node/opt/UnusedGlobalVariables.scala | 7 +++++-- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/main/scala/millfork/node/opt/NodeOptimization.scala b/src/main/scala/millfork/node/opt/NodeOptimization.scala index 9078813b..c1f47e83 100644 --- a/src/main/scala/millfork/node/opt/NodeOptimization.scala +++ b/src/main/scala/millfork/node/opt/NodeOptimization.scala @@ -14,4 +14,14 @@ trait NodeOptimization { def optimizeStatements(nodes: List[Statement], options: CompilationOptions): List[Statement] = optimize(nodes, options).asInstanceOf[List[Statement]] + + def resolveAliases(aliases: Map[String, String], set: Set[String]):Set[String] = { + var result = set + var lastSize = set.size + do { + lastSize = set.size + result = result.flatMap(name => aliases.get(name).fold(Set(name))(Set(_, name))) + } while(lastSize != set.size) + result + } } diff --git a/src/main/scala/millfork/node/opt/UnusedFunctions.scala b/src/main/scala/millfork/node/opt/UnusedFunctions.scala index 8de59207..74313268 100644 --- a/src/main/scala/millfork/node/opt/UnusedFunctions.scala +++ b/src/main/scala/millfork/node/opt/UnusedFunctions.scala @@ -28,12 +28,16 @@ object UnusedFunctions extends NodeOptimization { ) override def optimize(nodes: List[Node], options: CompilationOptions): List[Node] = { + val aliases = nodes.flatMap{ + case AliasDefinitionStatement(source, target) => Some(source -> target) + case _ => None + }.toMap val panicRequired = options.flags(CompilationFlag.CheckIndexOutOfBounds) val allNormalFunctions = nodes.flatMap { case v: FunctionDeclarationStatement => if (v.address.isDefined && v.statements.isDefined || v.interrupt || v.name == "main" || panicRequired && v.name == "_panic") Nil else List(v.name) case _ => Nil }.toSet - val allCalledFunctions = getAllCalledFunctions(nodes).toSet + val allCalledFunctions = resolveAliases(aliases, getAllCalledFunctions(nodes).toSet) var unusedFunctions = allNormalFunctions -- allCalledFunctions val effectiveZpSize = options.platform.cpuFamily match { case CpuFamily.M6502 => options.zpRegisterSize diff --git a/src/main/scala/millfork/node/opt/UnusedGlobalVariables.scala b/src/main/scala/millfork/node/opt/UnusedGlobalVariables.scala index 2319cbb2..3e8f27c9 100644 --- a/src/main/scala/millfork/node/opt/UnusedGlobalVariables.scala +++ b/src/main/scala/millfork/node/opt/UnusedGlobalVariables.scala @@ -11,14 +11,17 @@ import millfork.node._ object UnusedGlobalVariables extends NodeOptimization { override def optimize(nodes: List[Node], options: CompilationOptions): List[Node] = { - + val aliases = nodes.flatMap{ + case AliasDefinitionStatement(source, target) => Some(source -> target) + case _ => None + }.toMap // TODO: volatile val allNonvolatileGlobalVariables = nodes.flatMap { case v: VariableDeclarationStatement => if (v.address.isDefined) Nil else List(v.name) case v: ArrayDeclarationStatement => if (v.address.isDefined) Nil else List(v.name) case _ => Nil }.toSet - val allReadVariables = getAllReadVariables(nodes).toSet + val allReadVariables = resolveAliases(aliases, getAllReadVariables(nodes).toSet) val unusedVariables = allNonvolatileGlobalVariables -- allReadVariables if (unusedVariables.nonEmpty) { options.log.debug("Removing unused global variables: " + unusedVariables.mkString(", "))