From 8f3aaf77a1cfdde37a2e808be9d53c18cbb74bd3 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Tue, 15 Nov 2022 01:40:13 +0100 Subject: [PATCH] fix optimizer hanging on uword xx :: xx >>= 8 / xx=msb(xx) --- .../src/prog8/optimizer/StatementOptimizer.kt | 19 ++++++------------- docs/source/todo.rst | 1 - 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/codeOptimizers/src/prog8/optimizer/StatementOptimizer.kt b/codeOptimizers/src/prog8/optimizer/StatementOptimizer.kt index 6c44d5ce4..ceccc2620 100644 --- a/codeOptimizers/src/prog8/optimizer/StatementOptimizer.kt +++ b/codeOptimizers/src/prog8/optimizer/StatementOptimizer.kt @@ -357,24 +357,17 @@ class StatementOptimizer(private val program: Program, } } - // word = msb(word) , word=lsb(word) + // word = lsb(word) if(assignment.target.inferType(program).isWords) { var fcall = assignment.value as? FunctionCallExpression if (fcall == null) fcall = (assignment.value as? TypecastExpression)?.expression as? FunctionCallExpression - if (fcall != null && (fcall.target.nameInSource == listOf("lsb") || fcall.target.nameInSource == listOf("msb"))) { + if (fcall != null && (fcall.target.nameInSource == listOf("lsb"))) { if (fcall.args.single() isSameAs assignment.target) { - return if (fcall.target.nameInSource == listOf("lsb")) { - // optimize word=lsb(word) ==> word &= $00ff - val and255 = BinaryExpression(fcall.args[0], "&", NumericLiteral(DataType.UWORD, 255.0, fcall.position), fcall.position) - val newAssign = Assignment(assignment.target, and255, AssignmentOrigin.OPTIMIZER, fcall.position) - listOf(IAstModification.ReplaceNode(assignment, newAssign, parent)) - } else { - // optimize word=msb(word) ==> word >>= 8 - val shift8 = BinaryExpression(fcall.args[0], ">>", NumericLiteral(DataType.UBYTE, 8.0, fcall.position), fcall.position) - val newAssign = Assignment(assignment.target, shift8, AssignmentOrigin.OPTIMIZER, fcall.position) - listOf(IAstModification.ReplaceNode(assignment, newAssign, parent)) - } + // optimize word=lsb(word) ==> word &= $00ff + val and255 = BinaryExpression(fcall.args[0], "&", NumericLiteral(DataType.UWORD, 255.0, fcall.position), fcall.position) + val newAssign = Assignment(assignment.target, and255, AssignmentOrigin.OPTIMIZER, fcall.position) + return listOf(IAstModification.ReplaceNode(assignment, newAssign, parent)) } } } diff --git a/docs/source/todo.rst b/docs/source/todo.rst index a7563e567..eec509f9e 100644 --- a/docs/source/todo.rst +++ b/docs/source/todo.rst @@ -3,7 +3,6 @@ TODO For next release ^^^^^^^^^^^^^^^^ -- fix 6502 optimizer hanging on uword xx = 100 :: uword yy = xx / 256 - why is func(x&15) fast, but func(x>>4) using stack eval for the arg? - ir/vm: allow label in block scope - 6502 codegen: make it possible to use cpu opcodes such as 'nop' as variable names by prefixing all asm vars with something such as ``p8v_``? Or not worth it (most 3 letter opcodes as variables are nonsensical anyway)