changeset 12734:2caa21ef52bb

Merge.
author Doug Simon <doug.simon@oracle.com>
date Fri, 08 Nov 2013 18:34:57 +0100
parents 8d8d9d0b04bb (current diff) 0646713243fb (diff)
children bb85b81258a0
files
diffstat 2 files changed, 36 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java	Fri Nov 08 18:34:36 2013 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java	Fri Nov 08 18:34:57 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;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConvertNode.java	Fri Nov 08 18:34:36 2013 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConvertNode.java	Fri Nov 08 18:34:57 2013 +0100
@@ -87,9 +87,7 @@
         throw GraalInternalError.shouldNotReachHere();
     }
 
-    public Constant evalConst(Constant... inputs) {
-        assert inputs.length == 1;
-        Constant c = inputs[0];
+    public static Constant convert(Kind from, Kind to, Constant c) {
         switch (from) {
             case Byte:
                 byte byteVal = (byte) c.asInt();
@@ -228,10 +226,20 @@
         throw GraalInternalError.shouldNotReachHere();
     }
 
+    public Constant evalConst(Constant... inputs) {
+        assert inputs.length == 1;
+        return convert(from, to, inputs[0]);
+    }
+
     @Override
     public Node canonical(CanonicalizerTool tool) {
         if (value.isConstant()) {
             return ConstantNode.forPrimitive(evalConst(value.asConstant()), graph());
+        } else if (value instanceof ConvertNode) {
+            ConvertNode other = (ConvertNode) value;
+            if (other.isLossless() && other.to != Kind.Char) {
+                return graph().unique(new ConvertNode(other.from, this.to, other.value()));
+            }
         }
         return this;
     }