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 } }