From 69dcb4dbdadf5536f4a49ada9f7e5091c0496761 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Sat, 27 Nov 2021 21:22:34 +0100 Subject: [PATCH] fix reporting of (not) unused code after GoSub jump --- .../src/prog8/optimizer/UnusedCodeRemover.kt | 11 ++++++----- examples/test.p8 | 11 +++++++++++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/codeOptimizers/src/prog8/optimizer/UnusedCodeRemover.kt b/codeOptimizers/src/prog8/optimizer/UnusedCodeRemover.kt index c118aea0a..a906a6a98 100644 --- a/codeOptimizers/src/prog8/optimizer/UnusedCodeRemover.kt +++ b/codeOptimizers/src/prog8/optimizer/UnusedCodeRemover.kt @@ -28,27 +28,28 @@ class UnusedCodeRemover(private val program: Program, } override fun before(breakStmt: Break, parent: Node): Iterable { - reportUnreachable(breakStmt, parent as IStatementContainer) + reportUnreachable(breakStmt) return emptyList() } override fun before(jump: Jump, parent: Node): Iterable { - reportUnreachable(jump, parent as IStatementContainer) + if(!jump.isGosub) + reportUnreachable(jump) return emptyList() } override fun before(returnStmt: Return, parent: Node): Iterable { - reportUnreachable(returnStmt, parent as IStatementContainer) + reportUnreachable(returnStmt) return emptyList() } override fun before(functionCallStatement: FunctionCallStatement, parent: Node): Iterable { if(functionCallStatement.target.nameInSource.last() == "exit") - reportUnreachable(functionCallStatement, parent as IStatementContainer) + reportUnreachable(functionCallStatement) return emptyList() } - private fun reportUnreachable(stmt: Statement, parent: IStatementContainer) { + private fun reportUnreachable(stmt: Statement) { when(val next = stmt.nextSibling()) { null, is Label, is Directive, is VarDecl, is InlineAssembly, is Subroutine -> {} else -> errors.warn("unreachable code", next.position) diff --git a/examples/test.p8 b/examples/test.p8 index e2fb4cf2d..a4c55d542 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -21,6 +21,13 @@ main { ; void sys.pop() routine2(uw, 11,22, true, 33) + routine2(uw, 11,22, true, 33) + routine2(uw, 11,22, true, 33) + routine2(uw, 11,22, true, 33) + blerp(22) + blerp(22) + blerp(22) + blerp(22) test_stack.test() @@ -29,6 +36,10 @@ main { } + sub blerp(uword z) { + z++ + } + asmsub routine2(uword num @AY, ubyte a1 @R1, ubyte a2 @R2, ubyte switch @Pc, ubyte a3 @X) { %asm {{ adc #20