Mercurial > hg > graal-jvmci-8
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; }