mirror of
https://github.com/irmen/prog8.git
synced 2024-09-07 03:54:27 +00:00
add assignment optimization X=value-X --> X=-X ; X+=value (to avoid need of stack-evaluation)
This commit is contained in:
parent
107935ed31
commit
2491509c6a
@ -355,14 +355,26 @@ class StatementOptimizer(private val program: Program,
|
|||||||
throw FatalAstException("can't infer type of assignment target")
|
throw FatalAstException("can't infer type of assignment target")
|
||||||
|
|
||||||
// optimize binary expressions a bit
|
// optimize binary expressions a bit
|
||||||
val targetDt = targetIDt.getOr(DataType.UNDEFINED)
|
|
||||||
val bexpr=assignment.value as? BinaryExpression
|
val bexpr=assignment.value as? BinaryExpression
|
||||||
if(bexpr!=null) {
|
if(bexpr!=null) {
|
||||||
val rightCv = bexpr.right.constValue(program)?.number
|
val rightCv = bexpr.right.constValue(program)?.number
|
||||||
|
if(bexpr.operator=="-" && rightCv==null) {
|
||||||
|
if(bexpr.right isSameAs assignment.target) {
|
||||||
|
// X = value - X --> X = -X ; X += value (to avoid need of stack-evaluation)
|
||||||
|
val negation = PrefixExpression("-", bexpr.right.copy(), bexpr.position)
|
||||||
|
val addValue = Assignment(assignment.target.copy(), BinaryExpression(bexpr.right, "+", bexpr.left, bexpr.position), assignment.position)
|
||||||
|
return listOf(
|
||||||
|
IAstModification.ReplaceNode(bexpr, negation, assignment),
|
||||||
|
IAstModification.InsertAfter(assignment, addValue, parent as IStatementContainer)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (rightCv != null && assignment.target isSameAs bexpr.left) {
|
if (rightCv != null && assignment.target isSameAs bexpr.left) {
|
||||||
// assignments of the form: X = X <operator> <expr>
|
// assignments of the form: X = X <operator> <expr>
|
||||||
// remove assignments that have no effect (such as X=X+0)
|
// remove assignments that have no effect (such as X=X+0)
|
||||||
// optimize/rewrite some other expressions
|
// optimize/rewrite some other expressions
|
||||||
|
val targetDt = targetIDt.getOr(DataType.UNDEFINED)
|
||||||
val vardeclDt = (assignment.target.identifier?.targetVarDecl(program))?.type
|
val vardeclDt = (assignment.target.identifier?.targetVarDecl(program))?.type
|
||||||
when (bexpr.operator) {
|
when (bexpr.operator) {
|
||||||
"+" -> {
|
"+" -> {
|
||||||
|
Loading…
Reference in New Issue
Block a user