From 586ce1fc80cec5048023473f43b157809ff29f0a Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Mon, 24 Jan 2022 01:10:04 +0100 Subject: [PATCH] tweak return's use of intermediate variable --- .../src/prog8/optimizer/StatementOptimizer.kt | 12 +++++++---- docs/source/todo.rst | 5 +---- examples/test.p8 | 20 +++++++++---------- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/codeOptimizers/src/prog8/optimizer/StatementOptimizer.kt b/codeOptimizers/src/prog8/optimizer/StatementOptimizer.kt index 868112b42..5d55d2544 100644 --- a/codeOptimizers/src/prog8/optimizer/StatementOptimizer.kt +++ b/codeOptimizers/src/prog8/optimizer/StatementOptimizer.kt @@ -459,10 +459,14 @@ class StatementOptimizer(private val program: Program, return null } - if(returnStmt.value is BinaryExpression) { - val mod = returnViaIntermediaryVar(returnStmt.value!!) - if(mod!=null) - return mod + // TODO decision when to use intermediary variable to calculate returnvalue seems a bit arbitrary... + val returnvalue = returnStmt.value + if (returnvalue!=null) { + if (returnvalue is BinaryExpression || (returnvalue is TypecastExpression && !returnvalue.expression.isSimple)) { + val mod = returnViaIntermediaryVar(returnvalue) + if(mod!=null) + return mod + } } return noModifications diff --git a/docs/source/todo.rst b/docs/source/todo.rst index 806279620..a192a8b0d 100644 --- a/docs/source/todo.rst +++ b/docs/source/todo.rst @@ -3,10 +3,7 @@ TODO For next release ^^^^^^^^^^^^^^^^ -- why does this use stack eval on return: - sub sprite_y_for_row(ubyte row) -> word { - return (8-row as byte) - } +... Need help with diff --git a/examples/test.p8 b/examples/test.p8 index 0add3f324..fe89488da 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -4,22 +4,20 @@ main { sub start() { - ubyte ccc - ubyte @shared qq = string.find("irmendejong", ccc)!=0 - word ww - ww = calculate(6) + word ww = calculate(6) txt.print_w(ww) txt.nl() - ww = calculate(8) - txt.print_w(ww) - txt.nl() - ww = calculate(10) - txt.print_w(ww) + ubyte bb = calculate2(6) + txt.print_ub(bb) txt.nl() - qq = string.find("irmendejong", ccc)!=0 } + sub calculate2(ubyte row) -> ubyte { + return 8+row + } + + sub calculate(ubyte row) -> word { - return 8-(row as byte) + return 8+row } }