From 6b33cc49a84b7e9391b3f09b684623622aad2a4e Mon Sep 17 00:00:00 2001 From: Karol Stasiak Date: Fri, 12 Oct 2018 00:01:19 +0200 Subject: [PATCH] Fix bad code deduplication --- src/main/scala/millfork/output/Deduplicate.scala | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/scala/millfork/output/Deduplicate.scala b/src/main/scala/millfork/output/Deduplicate.scala index d530585e..57629885 100644 --- a/src/main/scala/millfork/output/Deduplicate.scala +++ b/src/main/scala/millfork/output/Deduplicate.scala @@ -18,6 +18,10 @@ abstract class Deduplicate[T <: AbstractCode](env: Environment, options: Compila } runStage(compiledFunctions, deduplicateIdenticalFunctions) runStage(compiledFunctions, eliminateTailJumps) + runStage(compiledFunctions, eliminateTailJumps) + runStage(compiledFunctions, eliminateTailJumps) + runStage(compiledFunctions, eliminateRemainingTrivialTailJumps) + runStage(compiledFunctions, eliminateRemainingTrivialTailJumps) runStage(compiledFunctions, eliminateRemainingTrivialTailJumps) fixDoubleRedirects(compiledFunctions) // println(compiledFunctions.map { @@ -28,6 +32,8 @@ abstract class Deduplicate[T <: AbstractCode](env: Environment, options: Compila // }.mkString(" ; ")) } + def removeChains(map: Map[String, String]): Map[String, String] = map.filterNot{case (_, to) => map.contains(to)} + def runStage(compiledFunctions: mutable.Map[String, CompiledFunction[T]], function: (String, Map[String, Either[String, CodeAndAlignment[T]]]) => Seq[(String, CompiledFunction[T])]): Unit = { bySegment(compiledFunctions).foreach { @@ -195,7 +201,7 @@ abstract class Deduplicate[T <: AbstractCode](env: Environment, options: Compila .map(name -> _) case _ => None } - val fallthroughPredecessors = fallThroughList.groupBy(_._2).mapValues(_.head._1) // TODO: be smarter than head + val fallthroughPredecessors = removeChains(fallThroughList).groupBy(_._2).mapValues(_.head._1) // TODO: be smarter than head fallthroughPredecessors.foreach { case (to, from) => options.log.debug(s"Fallthrough from $from to $to") @@ -228,7 +234,7 @@ abstract class Deduplicate[T <: AbstractCode](env: Environment, options: Compila .map(name -> _) case _ => None } - val fallthroughPredecessors = fallThroughList.groupBy(_._2).mapValues(_.keySet) + val fallthroughPredecessors = removeChains(fallThroughList).groupBy(_._2).mapValues(_.keySet) fallthroughPredecessors.foreach { case (to, froms) => for (from <- froms) {