From 12cb7d7abe5651ae599706d136fb022bb867008d Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Wed, 10 Jul 2019 01:52:04 +0200 Subject: [PATCH] optimize redundant typecasts more --- compiler/src/prog8/ast/base/Base.kt | 2 +- compiler/src/prog8/optimizer/SimplifyExpressions.kt | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/compiler/src/prog8/ast/base/Base.kt b/compiler/src/prog8/ast/base/Base.kt index 150927433..b30f5afef 100644 --- a/compiler/src/prog8/ast/base/Base.kt +++ b/compiler/src/prog8/ast/base/Base.kt @@ -38,7 +38,7 @@ enum class DataType { infix fun isAssignableTo(targetTypes: Set) = targetTypes.any { this isAssignableTo it } - infix fun biggerThan(other: DataType) = + infix fun largerThan(other: DataType) = when(this) { in ByteDatatypes -> false in WordDatatypes -> other in ByteDatatypes diff --git a/compiler/src/prog8/optimizer/SimplifyExpressions.kt b/compiler/src/prog8/optimizer/SimplifyExpressions.kt index 5395151e2..14e58c94e 100644 --- a/compiler/src/prog8/optimizer/SimplifyExpressions.kt +++ b/compiler/src/prog8/optimizer/SimplifyExpressions.kt @@ -49,6 +49,15 @@ internal class SimplifyExpressions(private val program: Program) : IAstModifying return tc.expression } } + + // if the previous typecast was casting to a 'bigger' type, just ignore that one + val subTc = tc.expression as? TypecastExpression + if(subTc!=null && subTc.type largerThan tc.type) { + subTc.type = tc.type + subTc.parent = tc.parent + optimizationsDone++ + return subTc + } return super.visit(tc) } optimizationsDone++ @@ -385,7 +394,7 @@ internal class SimplifyExpressions(private val program: Program) : IAstModifying } if(leftConstVal==null && rightConstVal!=null) { - if(leftDt biggerThan rightDt) { + if(leftDt largerThan rightDt) { val (adjusted, newValue) = adjust(rightConstVal, leftDt) if (adjusted) { expr.right = newValue @@ -395,7 +404,7 @@ internal class SimplifyExpressions(private val program: Program) : IAstModifying } return false } else if(leftConstVal!=null && rightConstVal==null) { - if(rightDt biggerThan leftDt) { + if(rightDt largerThan leftDt) { val (adjusted, newValue) = adjust(leftConstVal, rightDt) if (adjusted) { expr.left = newValue