fixed invalid integer constant expression evaluation leading to wrong results

This commit is contained in:
Irmen de Jong 2021-01-02 20:33:59 +01:00
parent baf9dfb46c
commit 5a846bdeb5

View File

@ -136,6 +136,7 @@ internal class ConstantFoldingOptimizer(private val program: Program) : AstWalke
}
}
if(expr.inferType(program).istype(DataType.FLOAT)) {
val subExpr: BinaryExpression? = when {
leftconst != null -> expr.right as? BinaryExpression
rightconst != null -> expr.left as? BinaryExpression
@ -146,13 +147,16 @@ internal class ConstantFoldingOptimizer(private val program: Program) : AstWalke
val subrightconst = subExpr.right.constValue(program)
if ((subleftconst != null && subrightconst == null) || (subleftconst == null && subrightconst != null)) {
// try reordering.
val change = groupTwoConstsTogether(expr, subExpr,
val change = groupTwoFloatConstsTogether(
expr, subExpr,
leftconst != null, rightconst != null,
subleftconst != null, subrightconst != null)
subleftconst != null, subrightconst != null
)
if (change != null)
modifications += change
}
}
}
// const fold when both operands are a const
if(leftconst != null && rightconst != null) {
@ -298,13 +302,15 @@ internal class ConstantFoldingOptimizer(private val program: Program) : AstWalke
}
}
private fun groupTwoConstsTogether(expr: BinaryExpression,
private fun groupTwoFloatConstsTogether(expr: BinaryExpression,
subExpr: BinaryExpression,
leftIsConst: Boolean,
rightIsConst: Boolean,
subleftIsConst: Boolean,
subrightIsConst: Boolean): IAstModification?
{
// NOTE: THIS IS ONLY VALID ON FLOATING POINT CONSTANTS
// todo: this implements only a small set of possible reorderings at this time
if(expr.operator==subExpr.operator) {
// both operators are the same.