mirror of
https://github.com/irmen/prog8.git
synced 2024-10-25 00:24:16 +00:00
fix invalid removal of repeated assignments.
This commit is contained in:
parent
d56eb397f9
commit
b042b7705e
@ -116,9 +116,9 @@ internal class VariableAllocator(private val symboltable: SymbolTable,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
println(" number of allocated vars: $numberOfAllocatableVariables")
|
// println(" number of allocated vars: $numberOfAllocatableVariables")
|
||||||
println(" put into zeropage: $numVariablesAllocatedInZP, non-zp allocatable: ${numberOfNonIntegerVariables+numberOfExplicitNonZpVariables}")
|
// println(" put into zeropage: $numVariablesAllocatedInZP, non-zp allocatable: ${numberOfNonIntegerVariables+numberOfExplicitNonZpVariables}")
|
||||||
println(" zeropage free space: ${zeropage.free.size} bytes")
|
// println(" zeropage free space: ${zeropage.free.size} bytes")
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun collectAllVariables(st: SymbolTable): Collection<StStaticVariable> {
|
private fun collectAllVariables(st: SymbolTable): Collection<StStaticVariable> {
|
||||||
|
@ -1,11 +1,9 @@
|
|||||||
package prog8.compiler.astprocessing
|
package prog8.compiler.astprocessing
|
||||||
|
|
||||||
import prog8.ast.IFunctionCall
|
|
||||||
import prog8.ast.Node
|
import prog8.ast.Node
|
||||||
import prog8.ast.Program
|
import prog8.ast.Program
|
||||||
import prog8.ast.expressions.ArrayIndexedExpression
|
import prog8.ast.expressions.ArrayIndexedExpression
|
||||||
import prog8.ast.expressions.BinaryExpression
|
import prog8.ast.expressions.BinaryExpression
|
||||||
import prog8.ast.expressions.DirectMemoryRead
|
|
||||||
import prog8.ast.expressions.Expression
|
import prog8.ast.expressions.Expression
|
||||||
import prog8.ast.statements.AssignTarget
|
import prog8.ast.statements.AssignTarget
|
||||||
import prog8.ast.statements.DirectMemoryWrite
|
import prog8.ast.statements.DirectMemoryWrite
|
||||||
@ -15,7 +13,6 @@ import prog8.ast.walk.IAstModification
|
|||||||
import prog8.code.core.CompilationOptions
|
import prog8.code.core.CompilationOptions
|
||||||
import prog8.code.core.DataType
|
import prog8.code.core.DataType
|
||||||
import prog8.code.target.VMTarget
|
import prog8.code.target.VMTarget
|
||||||
import prog8.compiler.InplaceModifyingBuiltinFunctions
|
|
||||||
|
|
||||||
|
|
||||||
internal class AstOnetimeTransforms(private val program: Program, private val options: CompilationOptions) : AstWalker() {
|
internal class AstOnetimeTransforms(private val program: Program, private val options: CompilationOptions) : AstWalker() {
|
||||||
@ -33,10 +30,14 @@ internal class AstOnetimeTransforms(private val program: Program, private val op
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun replacePointerVarIndexWithMemreadOrMemwrite(arrayIndexedExpression: ArrayIndexedExpression, parent: Node): Iterable<IAstModification> {
|
private fun replacePointerVarIndexWithMemreadOrMemwrite(arrayIndexedExpression: ArrayIndexedExpression, parent: Node): Iterable<IAstModification> {
|
||||||
|
if(options.compTarget.name== VMTarget.NAME)
|
||||||
|
return noModifications
|
||||||
|
|
||||||
val arrayVar = arrayIndexedExpression.arrayvar.targetVarDecl(program)
|
val arrayVar = arrayIndexedExpression.arrayvar.targetVarDecl(program)
|
||||||
if(arrayVar!=null && arrayVar.datatype == DataType.UWORD) {
|
if(arrayVar!=null && arrayVar.datatype == DataType.UWORD) {
|
||||||
if(parent is AssignTarget) {
|
if(parent is AssignTarget) {
|
||||||
// rewrite assignment target pointervar[index] into @(pointervar+index)
|
// rewrite assignment target pointervar[index] into @(pointervar+index)
|
||||||
|
//println("REWRITE POINTER INDEXED: ${arrayVar.name}[${arrayIndexedExpression.indexer.indexExpr}] as assignment target at ${parent.position}") // TODO
|
||||||
val indexer = arrayIndexedExpression.indexer
|
val indexer = arrayIndexedExpression.indexer
|
||||||
val add: Expression =
|
val add: Expression =
|
||||||
if(indexer.indexExpr.constValue(program)?.number==0.0)
|
if(indexer.indexExpr.constValue(program)?.number==0.0)
|
||||||
|
@ -59,7 +59,7 @@ internal class VariousCleanups(val program: Program, val errors: IErrorReporter,
|
|||||||
override fun after(assignment: Assignment, parent: Node): Iterable<IAstModification> {
|
override fun after(assignment: Assignment, parent: Node): Iterable<IAstModification> {
|
||||||
val nextAssign = assignment.nextSibling() as? Assignment
|
val nextAssign = assignment.nextSibling() as? Assignment
|
||||||
if(nextAssign!=null && nextAssign.target.isSameAs(assignment.target, program)) {
|
if(nextAssign!=null && nextAssign.target.isSameAs(assignment.target, program)) {
|
||||||
if(nextAssign.value isSameAs assignment.value && assignment.value !is IFunctionCall) // don't remove function calls even when they're duplicates
|
if(!nextAssign.isAugmentable && nextAssign.value isSameAs assignment.value && assignment.value !is IFunctionCall) // don't remove function calls even when they're duplicates
|
||||||
return listOf(IAstModification.Remove(assignment, parent as IStatementContainer))
|
return listOf(IAstModification.Remove(assignment, parent as IStatementContainer))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -326,7 +326,7 @@ class ArrayIndexedExpression(var arrayvar: IdentifierReference,
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun toString(): String {
|
override fun toString(): String {
|
||||||
return "ArrayIndexed(ident=$arrayvar, arraysize=$indexer; pos=$position)"
|
return "ArrayIndexed(ident=$arrayvar, idx=$indexer; pos=$position)"
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun copy() = ArrayIndexedExpression(arrayvar.copy(), indexer.copy(), position)
|
override fun copy() = ArrayIndexedExpression(arrayvar.copy(), indexer.copy(), position)
|
||||||
|
@ -3,7 +3,6 @@ TODO
|
|||||||
|
|
||||||
For next release
|
For next release
|
||||||
^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^
|
||||||
- vm: fix optimized pointervar indexing codegen when it is an assignment target (i.e. writing to ptr[ix])
|
|
||||||
- 6502: fix optimized pointervar indexing codegen when it is an assignment target (i.e. writing to ptr[ix])
|
- 6502: fix optimized pointervar indexing codegen when it is an assignment target (i.e. writing to ptr[ix])
|
||||||
- pipe operator: (targets other than 'Virtual'): allow non-unary function calls in the pipe that specify the other argument(s) in the calls. Already working for VM target.
|
- pipe operator: (targets other than 'Virtual'): allow non-unary function calls in the pipe that specify the other argument(s) in the calls. Already working for VM target.
|
||||||
- add McCarthy evaluation to shortcircuit and/or expressions. First do ifs by splitting them up? Then do expressions that compute a value?
|
- add McCarthy evaluation to shortcircuit and/or expressions. First do ifs by splitting them up? Then do expressions that compute a value?
|
||||||
|
@ -40,41 +40,49 @@ main {
|
|||||||
uword bitmapbuf = &data
|
uword bitmapbuf = &data
|
||||||
|
|
||||||
; 11 22 33
|
; 11 22 33
|
||||||
txt.print_ub(bitmapbuf[0])
|
; txt.print_ub(bitmapbuf[0])
|
||||||
txt.spc()
|
; txt.spc()
|
||||||
txt.print_ub(bitmapbuf[1])
|
; txt.print_ub(bitmapbuf[1])
|
||||||
txt.spc()
|
; txt.spc()
|
||||||
txt.print_ub(bitmapbuf[2])
|
; txt.print_ub(bitmapbuf[2])
|
||||||
txt.nl()
|
; txt.nl()
|
||||||
rol(bitmapbuf[0])
|
; rol(bitmapbuf[0])
|
||||||
rol(bitmapbuf[0])
|
; rol(bitmapbuf[0])
|
||||||
txt.print_ub(bitmapbuf[0]) ; 44
|
; txt.print_ub(bitmapbuf[0]) ; 44
|
||||||
txt.spc()
|
; txt.spc()
|
||||||
ror(bitmapbuf[0])
|
; ror(bitmapbuf[0])
|
||||||
ror(bitmapbuf[0])
|
; ror(bitmapbuf[0])
|
||||||
txt.print_ub(bitmapbuf[0]) ; 11
|
; txt.print_ub(bitmapbuf[0]) ; 11
|
||||||
txt.nl()
|
; txt.nl()
|
||||||
|
;
|
||||||
|
; ; 22 44 66
|
||||||
|
; txt.print_ub(bitmapbuf[0]*2)
|
||||||
|
; txt.spc()
|
||||||
|
; txt.print_ub(bitmapbuf[1]*2)
|
||||||
|
; txt.spc()
|
||||||
|
; txt.print_ub(bitmapbuf[2]*2)
|
||||||
|
; txt.nl()
|
||||||
|
;
|
||||||
|
; value = one+one+one+one+one
|
||||||
|
; txt.print_ub(value) ; 5
|
||||||
|
; txt.nl()
|
||||||
|
|
||||||
; 22 44 66
|
bitmapbuf[0] = one+one+one
|
||||||
txt.print_ub(bitmapbuf[0]*2)
|
bitmapbuf[0] = one+one+one
|
||||||
txt.spc()
|
bitmapbuf[0] = one+one+one
|
||||||
txt.print_ub(bitmapbuf[1]*2)
|
|
||||||
txt.spc()
|
|
||||||
txt.print_ub(bitmapbuf[2]*2)
|
|
||||||
txt.nl()
|
|
||||||
|
|
||||||
value = one+one+one+one+one
|
|
||||||
txt.print_ub(value) ; 5
|
|
||||||
txt.nl()
|
|
||||||
|
|
||||||
bitmapbuf[0] = one
|
|
||||||
bitmapbuf[1] = one+one
|
bitmapbuf[1] = one+one
|
||||||
bitmapbuf[2] = one+one+one
|
bitmapbuf[1] = one+one
|
||||||
bitmapbuf[2] += 4
|
bitmapbuf[1] = one+one
|
||||||
bitmapbuf[2] -= 2
|
bitmapbuf[2] = one
|
||||||
bitmapbuf[2] -= 2
|
bitmapbuf[2] = one
|
||||||
|
bitmapbuf[2] = one
|
||||||
|
bitmapbuf[2] += 100
|
||||||
|
bitmapbuf[2] -= 1
|
||||||
|
bitmapbuf[2] -= 1
|
||||||
|
bitmapbuf[2] -= 1
|
||||||
|
bitmapbuf[2] -= 1
|
||||||
|
|
||||||
; 1 2 3
|
; 3 2 97
|
||||||
txt.print_ub(bitmapbuf[0])
|
txt.print_ub(bitmapbuf[0])
|
||||||
txt.spc()
|
txt.spc()
|
||||||
txt.print_ub(bitmapbuf[1])
|
txt.print_ub(bitmapbuf[1])
|
||||||
@ -83,7 +91,7 @@ main {
|
|||||||
txt.nl()
|
txt.nl()
|
||||||
|
|
||||||
for value in data {
|
for value in data {
|
||||||
txt.print_ub(value)
|
txt.print_ub(value) ; 3 2 97 4 5 6 7 8 9 10
|
||||||
txt.spc()
|
txt.spc()
|
||||||
}
|
}
|
||||||
txt.nl()
|
txt.nl()
|
||||||
|
Loading…
Reference in New Issue
Block a user