From db80417bd7da1a877c698c8644cf39253e61add1 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Tue, 9 Apr 2024 22:09:29 +0200 Subject: [PATCH] fix a problem with const fold optimization in if expressions, and IR compilation of that --- .../prog8/codegen/intermediate/IRCodeGen.kt | 4 +++ compiler/src/prog8/compiler/Compiler.kt | 7 ++++- examples/test.p8 | 26 +++++-------------- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/codeGenIntermediate/src/prog8/codegen/intermediate/IRCodeGen.kt b/codeGenIntermediate/src/prog8/codegen/intermediate/IRCodeGen.kt index 0684086d7..6add55339 100644 --- a/codeGenIntermediate/src/prog8/codegen/intermediate/IRCodeGen.kt +++ b/codeGenIntermediate/src/prog8/codegen/intermediate/IRCodeGen.kt @@ -1451,6 +1451,10 @@ class IRCodeGen( } when(val cond=ifElse.condition) { + is PtBool -> { + // normally this will be optimized away, but not with -noopt + translateSimple(cond, Opcode.BSTEQ) + } is PtTypeCast -> { require(cond.type==DataType.BOOL && cond.value.type in NumericDatatypes) translateSimple(cond, Opcode.BSTEQ) diff --git a/compiler/src/prog8/compiler/Compiler.kt b/compiler/src/prog8/compiler/Compiler.kt index 70129fe06..6deb2752f 100644 --- a/compiler/src/prog8/compiler/Compiler.kt +++ b/compiler/src/prog8/compiler/Compiler.kt @@ -458,8 +458,13 @@ private fun optimizeAst(program: Program, compilerOptions: CompilationOptions, e break } removeUnusedCode(program, errors, compilerOptions) - if(errors.noErrors()) + if(errors.noErrors()) { + // last round of optimizations because constFold may have enabled more... + program.simplifyExpressions(errors, compilerOptions) + program.optimizeStatements(errors, functions, compilerOptions) program.constantFold(errors, compilerOptions) // because simplified statements and expressions can result in more constants that can be folded away + } + errors.report() } diff --git a/examples/test.p8 b/examples/test.p8 index b745d7f55..1eb783641 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -1,28 +1,16 @@ -%import bmx -%import diskio -%import emudbg -%import floats -%import gfx2 -%import graphics -%import monogfx -%import palette -%import psg -%import sprites -%import syslib %import textio -%import verafx -%import conv -%import cx16logo -%import math -%import prog8_lib -%import string -%import test_stack - %zeropage basicsafe %option no_sysinit main { sub start() { + const ubyte x=0 + + if x==3 { + txt.print("three") + } else if x==4 { + txt.print("four") + } } }