conditional expressions are optimized more intelligently (simple ones are not split off in separate assignments)

This commit is contained in:
Irmen de Jong 2021-11-14 12:38:56 +01:00
parent 5190594c8a
commit ab2d1122a9
4 changed files with 12 additions and 15 deletions

View File

@ -240,10 +240,7 @@ internal class BeforeAsmGenerationAstChanger(val program: Program, private val o
var rightAssignment: Assignment? = null var rightAssignment: Assignment? = null
var rightOperandReplacement: Expression? = null var rightOperandReplacement: Expression? = null
if(!expr.left.isSimple && expr.left !is IFunctionCall) {
// TODO don't optimize simple conditionals that are just a function call
if(!expr.left.isSimple) {
val dt = expr.left.inferType(program) val dt = expr.left.inferType(program)
val name = when { val name = when {
dt.istype(DataType.UBYTE) -> listOf("cx16","r9L") // assume (hope) cx16.r9 isn't used for anything else... dt.istype(DataType.UBYTE) -> listOf("cx16","r9L") // assume (hope) cx16.r9 isn't used for anything else...
@ -259,7 +256,7 @@ internal class BeforeAsmGenerationAstChanger(val program: Program, private val o
expr.position expr.position
) )
} }
if(!expr.right.isSimple) { if(!expr.right.isSimple && expr.right !is IFunctionCall) {
val dt = expr.right.inferType(program) val dt = expr.right.inferType(program)
val name = when { val name = when {
dt.istype(DataType.UBYTE) -> listOf("prog8_lib","retval_interm_ub") dt.istype(DataType.UBYTE) -> listOf("prog8_lib","retval_interm_ub")

View File

@ -118,7 +118,7 @@ class PrefixExpression(val operator: String, var expression: Expression, overrid
} }
} }
override val isSimple = false override val isSimple = true
override fun toString(): String { override fun toString(): String {
return "Prefix($operator $expression)" return "Prefix($operator $expression)"

View File

@ -3,7 +3,6 @@ TODO
For next compiler release (7.3) For next compiler release (7.3)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- simplifyConditionalExpression: don't change conditinal expressions that are just a single function call
- add expression simplification to while and until loops as well. - add expression simplification to while and until loops as well.

View File

@ -5,15 +5,16 @@
main { main {
sub start() { sub start() {
float[] farr = [1.111,2.222,3.333,4.444,5.555,6.666] byte xx=1
float f2 = 9.999
ubyte xx=1
ubyte yy=2
floats.print_f(farr[3]) if -xx {
txt.nl() xx++
floats.print_f(farr[xx+yy]) }
txt.nl()
sub test() -> ubyte {
xx++
return xx
}
} }