From 44d232f52af5906114ed79b4533ff922ad6bf5a0 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Sun, 26 Nov 2023 02:24:18 +0100 Subject: [PATCH] optimize for x in something downto 0 --- .../src/prog8/optimizer/StatementOptimizer.kt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/codeOptimizers/src/prog8/optimizer/StatementOptimizer.kt b/codeOptimizers/src/prog8/optimizer/StatementOptimizer.kt index 1949a09aa..d0f6a6971 100644 --- a/codeOptimizers/src/prog8/optimizer/StatementOptimizer.kt +++ b/codeOptimizers/src/prog8/optimizer/StatementOptimizer.kt @@ -212,6 +212,24 @@ class StatementOptimizer(private val program: Program, } } } + + if (range != null && range.to.constValue(program)?.number == 0.0 && range.step.constValue(program)?.number==-1.0) { + val fromExpr = range.from + if(fromExpr.constValue(program)==null) { + // FOR X = something DOWNTO 0 {...} --> X=something, DO { ... , X-- } UNTIL X=255 (or 65535 if uword) + val pos = forLoop.position + val checkValue = NumericLiteral(loopvarDt.getOr(DataType.UNDEFINED), if(loopvarDt.istype(DataType.UBYTE)) 255.0 else 65535.0, pos) + val condition = BinaryExpression(forLoop.loopVar.copy(), "==", checkValue, pos) + val decOne = PostIncrDecr(AssignTarget(forLoop.loopVar.copy(), null, null, pos), "--", pos) + forLoop.body.statements.add(decOne) + val replacement = AnonymousScope(mutableListOf( + Assignment(AssignTarget(forLoop.loopVar.copy(), null, null, pos), + fromExpr, AssignmentOrigin.OPTIMIZER, pos), + UntilLoop(forLoop.body, condition, pos) + ), pos) + return listOf(IAstModification.ReplaceNode(forLoop, replacement, parent)) + } + } } return noModifications