# HG changeset patch # User Gilles Duboscq # Date 1412778038 -7200 # Node ID 9aa9db862403a6970e20d1cda33ef4acccb8a0ee # Parent fa11aa10bf2c6c49c8502e94e10174357622c5ff Implement foldStamp for Float to Integer ops diff -r fa11aa10bf2c -r 9aa9db862403 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/FloatStamp.java --- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/FloatStamp.java Wed Oct 08 15:27:10 2014 +0200 +++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/FloatStamp.java Wed Oct 08 16:20:38 2014 +0200 @@ -666,8 +666,19 @@ @Override public Stamp foldStamp(Stamp stamp) { - assert stamp instanceof FloatStamp && ((FloatStamp) stamp).getBits() == 32; - return StampFactory.forKind(Kind.Int); + FloatStamp floatStamp = (FloatStamp) stamp; + assert floatStamp.getBits() == 32; + boolean mustHaveZero = !floatStamp.isNonNaN(); + int lowerBound = (int) floatStamp.lowerBound(); + int upperBound = (int) floatStamp.upperBound(); + if (mustHaveZero) { + if (lowerBound > 0) { + lowerBound = 0; + } else if (upperBound < 0) { + upperBound = 0; + } + } + return StampFactory.forInteger(Kind.Int, lowerBound, upperBound); } }, @@ -681,8 +692,19 @@ @Override public Stamp foldStamp(Stamp stamp) { - assert stamp instanceof FloatStamp && ((FloatStamp) stamp).getBits() == 32; - return StampFactory.forKind(Kind.Long); + FloatStamp floatStamp = (FloatStamp) stamp; + assert floatStamp.getBits() == 32; + boolean mustHaveZero = !floatStamp.isNonNaN(); + long lowerBound = (long) floatStamp.lowerBound(); + long upperBound = (long) floatStamp.upperBound(); + if (mustHaveZero) { + if (lowerBound > 0) { + lowerBound = 0; + } else if (upperBound < 0) { + upperBound = 0; + } + } + return StampFactory.forInteger(Kind.Long, lowerBound, upperBound); } }, @@ -696,8 +718,19 @@ @Override public Stamp foldStamp(Stamp stamp) { - assert stamp instanceof FloatStamp && ((FloatStamp) stamp).getBits() == 64; - return StampFactory.forKind(Kind.Int); + FloatStamp floatStamp = (FloatStamp) stamp; + assert floatStamp.getBits() == 64; + boolean mustHaveZero = !floatStamp.isNonNaN(); + int lowerBound = (int) floatStamp.lowerBound(); + int upperBound = (int) floatStamp.upperBound(); + if (mustHaveZero) { + if (lowerBound > 0) { + lowerBound = 0; + } else if (upperBound < 0) { + upperBound = 0; + } + } + return StampFactory.forInteger(Kind.Int, lowerBound, upperBound); } }, @@ -711,8 +744,19 @@ @Override public Stamp foldStamp(Stamp stamp) { - assert stamp instanceof FloatStamp && ((FloatStamp) stamp).getBits() == 64; - return StampFactory.forKind(Kind.Long); + FloatStamp floatStamp = (FloatStamp) stamp; + assert floatStamp.getBits() == 64; + boolean mustHaveZero = !floatStamp.isNonNaN(); + long lowerBound = (long) floatStamp.lowerBound(); + long upperBound = (long) floatStamp.upperBound(); + if (mustHaveZero) { + if (lowerBound > 0) { + lowerBound = 0; + } else if (upperBound < 0) { + upperBound = 0; + } + } + return StampFactory.forInteger(Kind.Long, lowerBound, upperBound); } }, @@ -726,8 +770,9 @@ @Override public Stamp foldStamp(Stamp stamp) { - assert stamp instanceof FloatStamp && ((FloatStamp) stamp).getBits() == 32; - return StampFactory.forKind(Kind.Double); + FloatStamp floatStamp = (FloatStamp) stamp; + assert floatStamp.getBits() == 32; + return StampFactory.forFloat(Kind.Double, floatStamp.lowerBound(), floatStamp.upperBound(), floatStamp.isNonNaN()); } }, @@ -741,8 +786,9 @@ @Override public Stamp foldStamp(Stamp stamp) { - assert stamp instanceof FloatStamp && ((FloatStamp) stamp).getBits() == 64; - return StampFactory.forKind(Kind.Float); + FloatStamp floatStamp = (FloatStamp) stamp; + assert floatStamp.getBits() == 64; + return StampFactory.forFloat(Kind.Float, (float) floatStamp.lowerBound(), (float) floatStamp.upperBound(), floatStamp.isNonNaN()); } }); }