# HG changeset patch # User Roland Schatz # Date 1383926341 -3600 # Node ID 64d960e854e6d9396af33f84970b1eb1e46490cd # Parent 3e88ee655612caaa3f5ef9663c064e41fa74ca1b Canonicalize comparison of type conversion with constants. diff -r 3e88ee655612 -r 64d960e854e6 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 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; diff -r 3e88ee655612 -r 64d960e854e6 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 16:14:16 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConvertNode.java Fri Nov 08 16:59:01 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,6 +226,11 @@ 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()) {