# HG changeset patch # User Roland Schatz # Date 1405328781 -7200 # Node ID f0f4402a4f65bc5456feeb4d78e6b4843ec23d8c # Parent 48d26e6289c74e655a5027d891c46d49f9fdf5ca Canonicalize multiplication with 1.0 and addition with -0.0. diff -r 48d26e6289c7 -r f0f4402a4f65 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatAddNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatAddNode.java Fri Jul 11 17:54:57 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatAddNode.java Mon Jul 14 11:06:21 2014 +0200 @@ -56,6 +56,26 @@ return ConstantNode.forConstant(evalConst(forX.asConstant(), forY.asConstant()), null); } // Constant 0.0 can't be eliminated since it can affect the sign of the result. + // Constant -0.0 is an additive identity. + if (forY.isConstant()) { + Constant y = forY.asConstant(); + switch (y.getKind()) { + case Float: + // use Float.compare because -0.0f == 0.0f + if (Float.compare(y.asFloat(), -0.0f) == 0) { + return forX; + } + break; + case Double: + // use Double.compare because -0.0f == 0.0f + if (Double.compare(y.asDouble(), -0.0) == 0) { + return forX; + } + break; + default: + throw GraalGraphInternalError.shouldNotReachHere(); + } + } return this; } diff -r 48d26e6289c7 -r f0f4402a4f65 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatDivNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatDivNode.java Fri Jul 11 17:54:57 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatDivNode.java Mon Jul 14 11:06:21 2014 +0200 @@ -52,6 +52,23 @@ if (forX.isConstant() && forY.isConstant()) { return ConstantNode.forPrimitive(evalConst(forX.asConstant(), forY.asConstant())); } + if (forY.isConstant()) { + Constant y = forY.asConstant(); + switch (y.getKind()) { + case Float: + if (y.asFloat() == 1.0f) { + return forX; + } + break; + case Double: + if (y.asDouble() == 1.0) { + return forX; + } + break; + default: + throw GraalGraphInternalError.shouldNotReachHere(); + } + } return this; } diff -r 48d26e6289c7 -r f0f4402a4f65 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatMulNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatMulNode.java Fri Jul 11 17:54:57 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatMulNode.java Mon Jul 14 11:06:21 2014 +0200 @@ -55,6 +55,23 @@ if (forX.isConstant()) { return ConstantNode.forPrimitive(evalConst(forX.asConstant(), forY.asConstant())); } + if (forY.isConstant()) { + Constant y = forY.asConstant(); + switch (y.getKind()) { + case Float: + if (y.asFloat() == 1.0f) { + return forX; + } + break; + case Double: + if (y.asDouble() == 1.0) { + return forX; + } + break; + default: + throw GraalGraphInternalError.shouldNotReachHere(); + } + } return this; } diff -r 48d26e6289c7 -r f0f4402a4f65 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatSubNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatSubNode.java Fri Jul 11 17:54:57 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatSubNode.java Mon Jul 14 11:06:21 2014 +0200 @@ -56,7 +56,27 @@ if (forX.isConstant() && forY.isConstant()) { return ConstantNode.forPrimitive(evalConst(forX.asConstant(), forY.asConstant())); } - // Constant 0.0 can't be eliminated since it can affect the sign of the result. + // Constant -0.0 can't be eliminated since it can affect the sign of the result. + // Constant 0.0 is a subtractive identity. + if (forY.isConstant()) { + Constant y = forY.asConstant(); + switch (y.getKind()) { + case Float: + // use Float.compare because -0.0f == 0.0f + if (Float.compare(y.asFloat(), 0.0f) == 0) { + return forX; + } + break; + case Double: + // use Double.compare because -0.0f == 0.0f + if (Double.compare(y.asDouble(), 0.0) == 0) { + return forX; + } + break; + default: + throw GraalGraphInternalError.shouldNotReachHere(); + } + } return this; }