From cdea34017b190f08326c5f0e3124b5fcc2239035 Mon Sep 17 00:00:00 2001 From: Philipp Schuster Date: Fri, 10 Jan 2025 16:41:46 +0100 Subject: [PATCH] Fix finding free variables --- .../src/main/scala/effekt/generator/llvm/Transformer.scala | 5 ++--- effekt/shared/src/main/scala/effekt/machine/Analysis.scala | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/effekt/shared/src/main/scala/effekt/generator/llvm/Transformer.scala b/effekt/shared/src/main/scala/effekt/generator/llvm/Transformer.scala index 476ad2329..355cd41a1 100644 --- a/effekt/shared/src/main/scala/effekt/generator/llvm/Transformer.scala +++ b/effekt/shared/src/main/scala/effekt/generator/llvm/Transformer.scala @@ -110,15 +110,14 @@ object Transformer { case machine.Switch(value, clauses, default) => emit(Comment(s"switch ${value.name}, ${clauses.length} clauses")) - shareValues(List(value), clauses.flatMap(freeVariables).toSet) + val freeInClauses = clauses.flatMap(freeVariables) ++ default.map(freeVariables).getOrElse(Set.empty) + shareValues(List(value), freeInClauses.toSet) val tagName = freshName("tag") val objectName = freshName("fields") emit(ExtractValue(tagName, transform(value), 0)) emit(ExtractValue(objectName, transform(value), 1)) - val freeInClauses = clauses.flatMap(freeVariables) - val stack = getStack() def labelClause(clause: machine.Clause): String = { implicit val BC = BlockContext() diff --git a/effekt/shared/src/main/scala/effekt/machine/Analysis.scala b/effekt/shared/src/main/scala/effekt/machine/Analysis.scala index 06bb92ce0..b3dc6915b 100644 --- a/effekt/shared/src/main/scala/effekt/machine/Analysis.scala +++ b/effekt/shared/src/main/scala/effekt/machine/Analysis.scala @@ -24,7 +24,7 @@ def freeVariables(statement: Statement): Set[Variable] = case Construct(name, tag, values, rest) => Set.from(values) ++ (freeVariables(rest) -- Set(name)) case Switch(value, clauses, default: Option[Clause]) => - Set(value) ++ clauses.flatMap { case (tag, branch) => freeVariables(branch) } ++ default.map(freeVariables).getOrElse(Set.empty) + Set(value) ++ clauses.flatMap(freeVariables) ++ default.map(freeVariables).getOrElse(Set.empty) case New(name, clauses, rest) => freeVariables(clauses) ++ (freeVariables(rest) -- Set(name)) case Invoke(value, tag, values) =>