# HG changeset patch # User Doug Simon # Date 1383932097 -3600 # Node ID 2caa21ef52bbfbb8221559982e322bfcf76ad080 # Parent 8d8d9d0b04bba21f55340f27217b0ea10d4f8b27# Parent 0646713243fb5dadd3febbf41b2b9c7daf73a835 Merge. diff -r 8d8d9d0b04bb -r 2caa21ef52bb graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java --- 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; diff -r 8d8d9d0b04bb -r 2caa21ef52bb graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConvertNode.java --- 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; }