Mercurial > hg > truffle
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;