changeset 14007:22804fafdb9f

add canonicalization to FloatConvertNode
author Andreas Woess <andreas.woess@jku.at>
date Sat, 22 Feb 2014 06:17:50 +0100
parents ec2f0ede9046
children 1658d30cd273
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatConvertNode.java
diffstat 1 files changed, 15 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatConvertNode.java	Fri Feb 21 19:35:08 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatConvertNode.java	Sat Feb 22 06:17:50 2014 +0100
@@ -24,6 +24,7 @@
 
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.graph.*;
+import com.oracle.graal.graph.spi.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.spi.*;
 import com.oracle.graal.nodes.type.*;
@@ -32,7 +33,7 @@
  * A {@code FloatConvert} converts between integers and floating point numbers according to Java
  * semantics.
  */
-public class FloatConvertNode extends ConvertNode implements Lowerable, ArithmeticLIRLowerable {
+public class FloatConvertNode extends ConvertNode implements Canonicalizable, Lowerable, ArithmeticLIRLowerable {
 
     public enum FloatConvert {
         F2I, D2I, F2L, D2L, I2F, L2F, D2F, I2D, L2D, F2D;
@@ -173,6 +174,19 @@
         }
     }
 
+    @Override
+    public Node canonical(CanonicalizerTool tool) {
+        if (getInput().isConstant()) {
+            return ConstantNode.forPrimitive(evalConst(getInput().asConstant()), graph());
+        } else if (getInput() instanceof FloatConvertNode) {
+            FloatConvertNode other = (FloatConvertNode) getInput();
+            if (other.isLossless() && other.op == this.op.reverse()) {
+                return other.getInput();
+            }
+        }
+        return this;
+    }
+
     public void lower(LoweringTool tool) {
         tool.getLowerer().lower(this, tool);
     }