# HG changeset patch # User Andreas Woess # Date 1393046270 -3600 # Node ID 22804fafdb9f8cabced56ea71b11233757c0ffae # Parent ec2f0ede90463d85d1c5514be1d2f8566ba53bae add canonicalization to FloatConvertNode diff -r ec2f0ede9046 -r 22804fafdb9f graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatConvertNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatConvertNode.java Fri Feb 21 19:35:08 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatConvertNode.java Sat Feb 22 06:17:50 2014 +0100 @@ -24,6 +24,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; +import com.oracle.graal.graph.spi.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -32,7 +33,7 @@ * A {@code FloatConvert} converts between integers and floating point numbers according to Java * semantics. */ -public class FloatConvertNode extends ConvertNode implements Lowerable, ArithmeticLIRLowerable { +public class FloatConvertNode extends ConvertNode implements Canonicalizable, Lowerable, ArithmeticLIRLowerable { public enum FloatConvert { F2I, D2I, F2L, D2L, I2F, L2F, D2F, I2D, L2D, F2D; @@ -173,6 +174,19 @@ } } + @Override + public Node canonical(CanonicalizerTool tool) { + if (getInput().isConstant()) { + return ConstantNode.forPrimitive(evalConst(getInput().asConstant()), graph()); + } else if (getInput() instanceof FloatConvertNode) { + FloatConvertNode other = (FloatConvertNode) getInput(); + if (other.isLossless() && other.op == this.op.reverse()) { + return other.getInput(); + } + } + return this; + } + public void lower(LoweringTool tool) { tool.getLowerer().lower(this, tool); }