diff graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java @ 12729:64d960e854e6

Canonicalize comparison of type conversion with constants.
author Roland Schatz <roland.schatz@oracle.com>
date Fri, 08 Nov 2013 16:59:01 +0100
parents 4aec62c32a82
children bb992a44734e
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java	Fri Nov 08 16:14:16 2013 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java	Fri Nov 08 16:59:01 2013 +0100
@@ -140,10 +140,35 @@
                 setX(convertX.value());
                 setY(convertY.value());
             }
+        } else if (x() instanceof ConvertNode && y().isConstant()) {
+            ConvertNode convertX = (ConvertNode) x();
+            ConstantNode newY = canonicalConvertConstant(convertX, y().asConstant());
+            if (newY != null) {
+                setX(convertX.value());
+                setY(newY);
+            }
+        } else if (y() instanceof ConvertNode && x().isConstant()) {
+            ConvertNode convertY = (ConvertNode) y();
+            ConstantNode newX = canonicalConvertConstant(convertY, x().asConstant());
+            if (newX != null) {
+                setX(newX);
+                setY(convertY.value());
+            }
         }
         return this;
     }
 
+    private static ConstantNode canonicalConvertConstant(ConvertNode convert, Constant constant) {
+        if (convert.isLossless()) {
+            assert constant.getKind() == convert.getToKind();
+            Constant reverseConverted = ConvertNode.convert(convert.getToKind(), convert.getFromKind(), constant);
+            if (convert.evalConst(reverseConverted).equals(constant)) {
+                return ConstantNode.forPrimitive(reverseConverted, convert.graph());
+            }
+        }
+        return null;
+    }
+
     public static CompareNode createCompareNode(StructuredGraph graph, Condition condition, ValueNode x, ValueNode y) {
         assert x.kind() == y.kind();
         assert condition.isCanonical() : "condition is not canonical: " + condition;