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;
     }