Mercurial > hg > truffle
changeset 16537:5936fa0edb6f
Fix wrong NaN handling in FloatStamp.meet.
author | Roland Schatz <roland.schatz@oracle.com> |
---|---|
date | Wed, 16 Jul 2014 15:29:24 +0200 |
parents | 82ec79372221 |
children | 5bf37ff211bd |
files | graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/FloatStamp.java |
diffstat | 1 files changed, 14 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/FloatStamp.java Tue Jul 15 19:42:10 2014 +0200 +++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/FloatStamp.java Wed Jul 16 15:29:24 2014 +0200 @@ -22,6 +22,8 @@ */ package com.oracle.graal.compiler.common.type; +import java.util.function.*; + import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.*; import com.oracle.graal.compiler.common.spi.*; @@ -134,6 +136,16 @@ return str.toString(); } + private static double meetBounds(double a, double b, DoubleBinaryOperator op) { + if (Double.isNaN(a)) { + return b; + } else if (Double.isNaN(b)) { + return a; + } else { + return op.applyAsDouble(a, b); + } + } + @Override public Stamp meet(Stamp otherStamp) { if (otherStamp == this) { @@ -144,8 +156,8 @@ } FloatStamp other = (FloatStamp) otherStamp; assert getBits() == other.getBits(); - double meetUpperBound = Math.max(upperBound, other.upperBound); - double meetLowerBound = Math.min(lowerBound, other.lowerBound); + double meetUpperBound = meetBounds(upperBound, other.upperBound, Math::max); + double meetLowerBound = meetBounds(lowerBound, other.lowerBound, Math::min); boolean meetNonNaN = nonNaN && other.nonNaN; if (meetLowerBound == lowerBound && meetUpperBound == upperBound && meetNonNaN == nonNaN) { return this;