From 0694a187d76e900b20030d027ceff4ccf2cd4618 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Mon, 12 Dec 2022 20:37:57 +0100 Subject: [PATCH] unsigned>0 now optimized into unsigned!=0 --- .../src/prog8/optimizer/ExpressionSimplifier.kt | 16 ++++++++++++---- docs/source/todo.rst | 1 + 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/codeOptimizers/src/prog8/optimizer/ExpressionSimplifier.kt b/codeOptimizers/src/prog8/optimizer/ExpressionSimplifier.kt index 9234081fb..86b9d0b24 100644 --- a/codeOptimizers/src/prog8/optimizer/ExpressionSimplifier.kt +++ b/codeOptimizers/src/prog8/optimizer/ExpressionSimplifier.kt @@ -193,11 +193,15 @@ class ExpressionSimplifier(private val program: Program, return listOf(IAstModification.ReplaceNode(expr.right, NumericLiteral.optimalInteger(0, expr.right.position), expr)) } - if(expr.operator == ">=" && rightVal?.number == 0.0) { - if (leftDt == DataType.UBYTE || leftDt == DataType.UWORD) { + if (leftDt == DataType.UBYTE || leftDt == DataType.UWORD) { + if(expr.operator == ">=" && rightVal?.number == 0.0) { // unsigned >= 0 --> true return listOf(IAstModification.ReplaceNode(expr, NumericLiteral.fromBoolean(true, expr.position), parent)) } + else if(expr.operator == ">" && rightVal?.number == 0.0) { + // unsigned > 0 --> unsigned != 0 + return listOf(IAstModification.SetExpression({expr.operator="!="}, expr, parent)) + } } if(leftDt!=DataType.FLOAT && expr.operator == "<" && rightVal?.number == 1.0) { @@ -206,11 +210,15 @@ class ExpressionSimplifier(private val program: Program, return listOf(IAstModification.ReplaceNode(expr.right, NumericLiteral.optimalInteger(0, expr.right.position), expr)) } - if(expr.operator == "<" && rightVal?.number == 0.0) { - if (leftDt == DataType.UBYTE || leftDt == DataType.UWORD) { + if (leftDt == DataType.UBYTE || leftDt == DataType.UWORD) { + if(expr.operator == "<" && rightVal?.number == 0.0) { // unsigned < 0 --> false return listOf(IAstModification.ReplaceNode(expr, NumericLiteral.fromBoolean(false, expr.position), parent)) } + else if(expr.operator == "<=" && rightVal?.number == 0.0) { + // unsigned <= 0 --> unsigned==0 + return listOf(IAstModification.SetExpression({expr.operator="=="}, expr, parent)) + } } // boolvar & 1 --> boolvar diff --git a/docs/source/todo.rst b/docs/source/todo.rst index 0d0fdfe4f..fd843c093 100644 --- a/docs/source/todo.rst +++ b/docs/source/todo.rst @@ -3,6 +3,7 @@ TODO For next release ^^^^^^^^^^^^^^^^ +- "until not bytearray[index]" creates some pretty silly assembly code. what about while? if? - regression test the various projects before release ...