# HG changeset patch # User Thomas Wuerthinger # Date 1424010506 -3600 # Node ID 9220566922ab77fcc4aac3f50b885093d779e5e4 # Parent b720a1e02fa08e30bbd19577a9dee32229011cf4 Parse time constant folding for div and float convert. diff -r b720a1e02fa0 -r 9220566922ab graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Sun Feb 15 14:33:16 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Sun Feb 15 15:28:26 2015 +0100 @@ -299,7 +299,7 @@ processBlock(this, returnBlock); processBlock(this, unwindBlock); - if (Debug.isDumpEnabled()) { + if (Debug.isDumpEnabled() && this.beforeReturnNode != startInstruction) { Debug.dump(currentGraph, "Bytecodes parsed: " + method.getDeclaringClass().getUnqualifiedName() + "." + method.getName()); } } @@ -552,7 +552,7 @@ @Override protected ValueNode genFloatDiv(Kind kind, ValueNode x, ValueNode y, boolean isStrictFP) { - return new DivNode(x, y); + return DivNode.create(x, y); } @Override @@ -612,7 +612,7 @@ @Override protected ValueNode genFloatConvert(FloatConvert op, ValueNode input) { - return new FloatConvertNode(op, input); + return FloatConvertNode.create(op, input); } @Override diff -r b720a1e02fa0 -r 9220566922ab graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/DivNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/DivNode.java Sun Feb 15 14:33:16 2015 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/DivNode.java Sun Feb 15 15:28:26 2015 +0100 @@ -25,7 +25,8 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.type.*; -import com.oracle.graal.compiler.common.type.ArithmeticOpTable.BinaryOp.Div; +import com.oracle.graal.compiler.common.type.ArithmeticOpTable.*; +import com.oracle.graal.compiler.common.type.ArithmeticOpTable.BinaryOp.*; import com.oracle.graal.graph.spi.*; import com.oracle.graal.lir.gen.*; import com.oracle.graal.nodeinfo.*; @@ -39,6 +40,17 @@ super(ArithmeticOpTable::getDiv, x, y); } + public static ValueNode create(ValueNode x, ValueNode y) { + BinaryOp
op = ArithmeticOpTable.forStamp(x.stamp()).getDiv(); + Stamp stamp = op.foldStamp(x.stamp(), y.stamp()); + ConstantNode tryConstantFold = tryConstantFold(op, x, y, stamp); + if (tryConstantFold != null) { + return tryConstantFold; + } else { + return new DivNode(x, y); + } + } + @Override public ValueNode canonical(CanonicalizerTool tool, ValueNode forX, ValueNode forY) { ValueNode ret = super.canonical(tool, forX, forY); diff -r b720a1e02fa0 -r 9220566922ab 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 Sun Feb 15 14:33:16 2015 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatConvertNode.java Sun Feb 15 15:28:26 2015 +0100 @@ -46,6 +46,14 @@ this.op = op; } + public static ValueNode create(FloatConvert op, ValueNode input) { + ValueNode synonym = findSynonym(input, ArithmeticOpTable.forStamp(input.stamp()).getFloatConvert(op)); + if (synonym != null) { + return synonym; + } + return new FloatConvertNode(op, input); + } + public FloatConvert getFloatConvert() { return op; } diff -r b720a1e02fa0 -r 9220566922ab graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnaryArithmeticNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnaryArithmeticNode.java Sun Feb 15 14:33:16 2015 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnaryArithmeticNode.java Sun Feb 15 15:28:26 2015 +0100 @@ -56,9 +56,17 @@ @Override public ValueNode canonical(CanonicalizerTool tool, ValueNode forValue) { - if (forValue.isConstant()) { - return ConstantNode.forPrimitive(stamp(), getOp(forValue).foldConstant(forValue.asConstant())); + ValueNode synonym = findSynonym(forValue, getOp(forValue)); + if (synonym != null) { + return synonym; } return this; } + + protected static ValueNode findSynonym(ValueNode forValue, UnaryOp op) { + if (forValue.isConstant()) { + return ConstantNode.forPrimitive(op.foldStamp(forValue.stamp()), op.foldConstant(forValue.asConstant())); + } + return null; + } }