@@ -15,6 +15,7 @@ import prog8.ast.statements.*
1515import prog8.code.core.DataType
1616import prog8.code.core.Position
1717import prog8.code.target.C64Target
18+ import prog8.code.target.Cx16Target
1819import prog8.compiler.printProgram
1920import prog8tests.helpers.*
2021
@@ -736,4 +737,60 @@ class TestOptimization: FunSpec({
736737 val stmts = result.program.entrypoint.statements
737738 stmts.size shouldBe 3
738739 }
740+
741+ test("repeated assignments to IO register should remain") {
742+ val srcX16="""
743+ main {
744+ sub start() {
745+ ubyte @shared xx
746+ xx = 42
747+ xx = 42 ; removed
748+ xx = 42 ; removed
749+ cx16.VERA_DATA0 = 0
750+ cx16.VERA_DATA0 = 0
751+ cx16.VERA_DATA0 = 0
752+ @($9fff) = 0
753+ @($9fff) = 0
754+ @($9fff) = 0
755+ return
756+ }
757+ }"""
758+ var result = compileText(Cx16Target (), true, srcX16, writeAssembly = true)!!
759+ var statements = result.program.entrypoint.statements
760+ statements.size shouldBe 9
761+ (statements[1] as Assignment ).target.identifier!!.nameInSource shouldBe listOf("xx")
762+ (statements[2] as Assignment ).target.identifier!!.nameInSource shouldBe listOf("cx16", "VERA_DATA0 ")
763+ (statements[3] as Assignment ).target.identifier!!.nameInSource shouldBe listOf("cx16", "VERA_DATA0 ")
764+ (statements[4] as Assignment ).target.identifier!!.nameInSource shouldBe listOf("cx16", "VERA_DATA0 ")
765+ (statements[5] as Assignment ).target.memoryAddress!!.addressExpression.constValue(result.program)!!.number shouldBe 0x9fff
766+ (statements[6] as Assignment ).target.memoryAddress!!.addressExpression.constValue(result.program)!!.number shouldBe 0x9fff
767+ (statements[7] as Assignment ).target.memoryAddress!!.addressExpression.constValue(result.program)!!.number shouldBe 0x9fff
768+
769+ val srcC64="""
770+ main {
771+ sub start() {
772+ ubyte @shared xx
773+ xx = 42
774+ xx = 42 ;removed
775+ xx = 42 ;removed
776+ c64.EXTCOL = 0
777+ c64.EXTCOL = 0
778+ c64.EXTCOL = 0
779+ @(53281) = 0
780+ @(53281) = 0
781+ @(53281) = 0
782+ return
783+ }
784+ }"""
785+ result = compileText(C64Target (), true, srcC64, writeAssembly = true)!!
786+ statements = result.program.entrypoint.statements
787+ statements.size shouldBe 9
788+ (statements[1] as Assignment ).target.identifier!!.nameInSource shouldBe listOf("xx")
789+ (statements[2] as Assignment ).target.identifier!!.nameInSource shouldBe listOf("c64", "EXTCOL ")
790+ (statements[3] as Assignment ).target.identifier!!.nameInSource shouldBe listOf("c64", "EXTCOL ")
791+ (statements[4] as Assignment ).target.identifier!!.nameInSource shouldBe listOf("c64", "EXTCOL ")
792+ (statements[5] as Assignment ).target.memoryAddress!!.addressExpression.constValue(result.program)!!.number shouldBe 53281.0
793+ (statements[6] as Assignment ).target.memoryAddress!!.addressExpression.constValue(result.program)!!.number shouldBe 53281.0
794+ (statements[7] as Assignment ).target.memoryAddress!!.addressExpression.constValue(result.program)!!.number shouldBe 53281.0
795+ }
739796})
0 commit comments