Mercurial > hg > graal-compiler
changeset 16501:f0f4402a4f65
Canonicalize multiplication with 1.0 and addition with -0.0.
author | Roland Schatz <roland.schatz@oracle.com> |
---|---|
date | Mon, 14 Jul 2014 11:06:21 +0200 |
parents | 48d26e6289c7 |
children | 5f458fcc4f5a d86f948268da |
files | graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatAddNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatDivNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatMulNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatSubNode.java |
diffstat | 4 files changed, 75 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- 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; }
--- 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; }
--- 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; }
--- 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; }