From 0d2c3901a3c98e5b14a6d9ed7aa8fefae8f1fec3 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Thu, 9 Dec 2021 22:12:31 +0100 Subject: [PATCH] added more constfolding --- .../optimizer/ConstantFoldingOptimizer.kt | 13 +++--- compiler/test/TestOptimization.kt | 45 +++++++++++-------- examples/test.p8 | 15 ++++++- 3 files changed, 47 insertions(+), 26 deletions(-) diff --git a/codeOptimizers/src/prog8/optimizer/ConstantFoldingOptimizer.kt b/codeOptimizers/src/prog8/optimizer/ConstantFoldingOptimizer.kt index 90162eec5..984af6471 100644 --- a/codeOptimizers/src/prog8/optimizer/ConstantFoldingOptimizer.kt +++ b/codeOptimizers/src/prog8/optimizer/ConstantFoldingOptimizer.kt @@ -200,18 +200,19 @@ class ConstantFoldingOptimizer(private val program: Program) : AstWalker() { if(expr.operator=="+" || expr.operator=="-") { if(leftBinExpr!=null && rightconst!=null) { - if(leftBinExpr.operator=="+") { + if(leftBinExpr.operator in listOf("+", "-")) { val c2 = leftBinExpr.right.constValue(program) if(c2!=null) { // (X + C2) +/- rightConst --> X + (C2 +/- rightConst) - // TODO SAME FOR (X - C1) +/- C2 --> X - (C1+C2) mind the operator flip? - // TODO SAME FOR (X * C1) * C2 --> X * (C1*C2) - // TODO SAME FOR (X / C1) / C2 --> X / (C1*C2) - val constants = BinaryExpression(c2, expr.operator, rightconst, c2.position) - val newExpr = BinaryExpression(leftBinExpr.left, "+", constants, expr.position) + // (X - C2) +/- rightConst --> X - (C2 +/- rightConst) mind the flipped right operator + val operator = if(leftBinExpr.operator=="+") expr.operator else if(expr.operator=="-") "+" else "-" + val constants = BinaryExpression(c2, operator, rightconst, c2.position) + val newExpr = BinaryExpression(leftBinExpr.left, leftBinExpr.operator, constants, expr.position) return listOf(IAstModification.ReplaceNode(expr, newExpr, parent)) } } + // TODO SAME FOR (X * C1) * C2 --> X * (C1*C2) + // TODO SAME FOR (X / C1) / C2 --> X / (C1*C2) } if(leftBinExpr!=null && rightBinExpr!=null) { diff --git a/compiler/test/TestOptimization.kt b/compiler/test/TestOptimization.kt index d0b086bbe..10412fce6 100644 --- a/compiler/test/TestOptimization.kt +++ b/compiler/test/TestOptimization.kt @@ -114,47 +114,54 @@ class TestOptimization: FunSpec({ sub start() { uword load_location = 12345 + word llw = 12345 cx16.r0 = load_location + 8000 + 1000 + 1000 - cx16.r1L = @(load_location + 8000 + 1000 + 1000) cx16.r2 = 8000 + 1000 + 1000 + load_location - cx16.r3L = @(8000 + 1000 + 1000 + load_location) cx16.r4 = load_location + boardOffsetC + boardHeightC - 1 + cx16.r5s = llw - 900 - 999 + cx16.r7s = llw - 900 + 999 } }""" val result = compileText(C64Target, true, source, writeAssembly = false).assertSuccess() + printProgram(result.program) // expected: // uword load_location // load_location = 12345 +// word llw +// llw = 12345 // cx16.r0 = load_location // cx16.r0 += 10000 -// cx16.r1L = @((load_location+10000)) // cx16.r2 = load_location // cx16.r2 += 10000 -// cx16.r3L = @((load_location+10000)) // cx16.r4 = load_location // cx16.r4 += 22 +// cx16.r5s = llw +// cx16.r5s -= 1899 +// cx16.r7s = llw +// cx16.r7s += 99 val stmts = result.program.entrypoint.statements - stmts.size shouldBe 10 + stmts.size shouldBe 14 - val addR0value = (stmts[3] as Assignment).value + val addR0value = (stmts[5] as Assignment).value val binexpr0 = addR0value as BinaryExpression + binexpr0.operator shouldBe "+" binexpr0.right shouldBe NumericLiteralValue(DataType.UWORD, 10000.0, Position.DUMMY) - val valueR1L = (stmts[4] as Assignment).value - val addrExpr1 = ((valueR1L as DirectMemoryRead).addressExpression as BinaryExpression) - addrExpr1.left shouldBe IdentifierReference(listOf("load_location"), Position.DUMMY) - addrExpr1.right shouldBe NumericLiteralValue(DataType.UWORD, 10000.0, Position.DUMMY) - - val addR2value = (stmts[6] as Assignment).value - var binexpr2 = addR2value as BinaryExpression + val addR2value = (stmts[7] as Assignment).value + val binexpr2 = addR2value as BinaryExpression + binexpr2.operator shouldBe "+" binexpr2.right shouldBe NumericLiteralValue(DataType.UWORD, 10000.0, Position.DUMMY) - val valueR3L = (stmts[7] as Assignment).value - val addrExpr3 = ((valueR3L as DirectMemoryRead).addressExpression as BinaryExpression) - addrExpr3.left shouldBe IdentifierReference(listOf("load_location"), Position.DUMMY) - addrExpr3.right shouldBe NumericLiteralValue(DataType.UWORD, 10000.0, Position.DUMMY) - val addR4value = (stmts[9] as Assignment).value val binexpr4 = addR4value as BinaryExpression + binexpr4.operator shouldBe "+" binexpr4.right shouldBe NumericLiteralValue(DataType.UWORD, 22.0, Position.DUMMY) + val subR5value = (stmts[11] as Assignment).value + val binexpr5 = subR5value as BinaryExpression + binexpr5.operator shouldBe "-" + binexpr5.right shouldBe NumericLiteralValue(DataType.UWORD, 1899.0, Position.DUMMY) + val subR7value = (stmts[13] as Assignment).value + val binexpr7 = subR7value as BinaryExpression + binexpr7.operator shouldBe "+" + binexpr7.right shouldBe NumericLiteralValue(DataType.UWORD, 99.0, Position.DUMMY) } test("constantfolded and silently typecasted for initializervalues") { @@ -169,7 +176,7 @@ class TestOptimization: FunSpec({ } } """ - val result = compileText(C64Target, true, sourcecode).assertSuccess() + val result = compileText(C64Target, false, sourcecode).assertSuccess() val mainsub = result.program.entrypoint mainsub.statements.size shouldBe 10 val declTest = mainsub.statements[0] as VarDecl diff --git a/examples/test.p8 b/examples/test.p8 index 84cdf72c0..9c0b3635d 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -5,9 +5,22 @@ main { sub start() { ; TODO other variants of this const folding uword load_location = $6000 - cx16.r0 = load_location + 8000 + 1000 + 1000 + word llw = $6000 + + cx16.r0 = load_location + 9000 + 1000 + 1000 cx16.r1L = @(load_location + 8000 + 1000 + 1000) cx16.r2 = 8000 + 1000 + 1000 + load_location cx16.r3L = @(8000 + 1000 + 1000 + load_location) + + cx16.r0s = llw - 900 + 999 + cx16.r1L = @(llw - 900 + 999) + cx16.r0s = llw - 900 + 999 + cx16.r1L = @(llw - 9000 + 999) + + cx16.r0s = llw - 900 - 999 + cx16.r1L = @(llw - 900 - 999) + cx16.r0s = llw - 900 - 999 + cx16.r1L = @(llw - 9000 - 999) + } }