From 1a87929ad3905793e16d86522c6a3dd23f2e4e9d Mon Sep 17 00:00:00 2001 From: Karol Stasiak Date: Sun, 4 Aug 2019 13:40:49 +0200 Subject: [PATCH] Fix TCO --- CHANGELOG.md | 2 ++ .../millfork/assembly/mos/opt/AlwaysGoodOptimizations.scala | 2 +- .../scala/millfork/assembly/z80/opt/LaterI80Optimizations.scala | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 70470471..ddfa6211 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,8 @@ This matches both the CC65 behaviour and the return values from `readkey()`. * Fixed many optimization bugs: * incorrect removal of unused local variables; + + * broken parameter passing to tail calls; * 6502: miscompilation when using the zeropage pseudoregister; diff --git a/src/main/scala/millfork/assembly/mos/opt/AlwaysGoodOptimizations.scala b/src/main/scala/millfork/assembly/mos/opt/AlwaysGoodOptimizations.scala index 5eafe84b..ecddee06 100644 --- a/src/main/scala/millfork/assembly/mos/opt/AlwaysGoodOptimizations.scala +++ b/src/main/scala/millfork/assembly/mos/opt/AlwaysGoodOptimizations.scala @@ -825,7 +825,7 @@ object AlwaysGoodOptimizations { (Elidable & HasOpcode(JSR)) ~ HasOpcode(LABEL).* ~ NoopDiscardsFlags.*.capture(0) ~ - HasOpcode(RTS) ~~> ((code, ctx) => ctx.get[List[AssemblyLine]](0) ++ (code.head.copy(opcode = JMP) :: code.tail)), + HasOpcode(RTS) ~~> ((code, ctx) => code.head.copy(opcode = JMP) :: code.tail), ) val UnusedCodeRemoval = new RuleBasedAssemblyOptimization("Unreachable code removal", diff --git a/src/main/scala/millfork/assembly/z80/opt/LaterI80Optimizations.scala b/src/main/scala/millfork/assembly/z80/opt/LaterI80Optimizations.scala index 70e2dd53..016c34af 100644 --- a/src/main/scala/millfork/assembly/z80/opt/LaterI80Optimizations.scala +++ b/src/main/scala/millfork/assembly/z80/opt/LaterI80Optimizations.scala @@ -138,7 +138,7 @@ object LaterI80Optimizations { HasOpcode(LABEL).* ~ (Elidable & HasOpcodeIn(ZOpcodeClasses.NoopDiscards)).*.capture(0) ~ (Elidable & HasOpcode(RET) & HasRegisters(NoRegisters)) ~~> { (code, ctx) => - ctx.get[List[ZLine]](0) ++ (code.head.copy(opcode = JP) :: code.tail) + code.head.copy(opcode = JP) :: code.tail }, )