# HG changeset patch # User Thomas Wuerthinger # Date 1423859570 -3600 # Node ID 2d6a2f18fe8c767f019fc9ed588b4bbd894f6252 # Parent 6a2d58249a69e8a942b4de684b1c7ceda24b87a6 Add graph builder folding support for integer conversion nodes. diff -r 6a2d58249a69 -r 2d6a2f18fe8c 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 Fri Feb 13 19:39:03 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Fri Feb 13 21:32:50 2015 +0100 @@ -613,17 +613,17 @@ @Override protected ValueNode genNarrow(ValueNode input, int bitCount) { - return new NarrowNode(input, bitCount); + return NarrowNode.create(input, bitCount); } @Override protected ValueNode genSignExtend(ValueNode input, int bitCount) { - return new SignExtendNode(input, bitCount); + return SignExtendNode.create(input, bitCount); } @Override protected ValueNode genZeroExtend(ValueNode input, int bitCount) { - return new ZeroExtendNode(input, bitCount); + return ZeroExtendNode.create(input, bitCount); } @Override diff -r 6a2d58249a69 -r 2d6a2f18fe8c graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerConvertNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerConvertNode.java Fri Feb 13 19:39:03 2015 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerConvertNode.java Fri Feb 13 21:32:50 2015 +0100 @@ -86,13 +86,20 @@ @Override public ValueNode canonical(CanonicalizerTool tool, ValueNode forValue) { + ValueNode synonym = findSynonym(getOp(forValue), forValue, inputBits, resultBits, stamp()); + if (synonym != null) { + return synonym; + } + return this; + } + + protected static ValueNode findSynonym(IntegerConvertOp operation, ValueNode value, int inputBits, int resultBits, Stamp stamp) { if (inputBits == resultBits) { return value; } else if (value.isConstant()) { - return ConstantNode.forPrimitive(stamp(), convert(forValue.asConstant(), tool.getConstantReflection())); - } else { - return this; + return ConstantNode.forPrimitive(stamp, operation.foldConstant(inputBits, resultBits, value.asConstant())); } + return null; } public static ValueNode convert(ValueNode input, Stamp stamp) { diff -r 6a2d58249a69 -r 2d6a2f18fe8c graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NarrowNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NarrowNode.java Fri Feb 13 19:39:03 2015 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NarrowNode.java Fri Feb 13 21:32:50 2015 +0100 @@ -23,6 +23,7 @@ package com.oracle.graal.nodes.calc; import com.oracle.graal.compiler.common.type.*; +import com.oracle.graal.compiler.common.type.ArithmeticOpTable.*; import com.oracle.graal.compiler.common.type.ArithmeticOpTable.IntegerConvertOp.Narrow; import com.oracle.graal.compiler.common.type.ArithmeticOpTable.IntegerConvertOp.SignExtend; import com.oracle.graal.graph.spi.*; @@ -46,6 +47,20 @@ super(ArithmeticOpTable::getNarrow, ArithmeticOpTable::getSignExtend, inputBits, resultBits, input); } + public static ValueNode create(ValueNode input, int resultBits) { + return create(input, PrimitiveStamp.getBits(input.stamp()), resultBits); + } + + public static ValueNode create(ValueNode input, int inputBits, int resultBits) { + IntegerConvertOp signExtend = ArithmeticOpTable.forStamp(input.stamp()).getNarrow(); + ValueNode synonym = findSynonym(signExtend, input, inputBits, resultBits, signExtend.foldStamp(inputBits, resultBits, input.stamp())); + if (synonym != null) { + return synonym; + } else { + return new NarrowNode(input, inputBits, resultBits); + } + } + @Override public boolean isLossless() { return false; diff -r 6a2d58249a69 -r 2d6a2f18fe8c graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/SignExtendNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/SignExtendNode.java Fri Feb 13 19:39:03 2015 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/SignExtendNode.java Fri Feb 13 21:32:50 2015 +0100 @@ -23,6 +23,7 @@ package com.oracle.graal.nodes.calc; import com.oracle.graal.compiler.common.type.*; +import com.oracle.graal.compiler.common.type.ArithmeticOpTable.IntegerConvertOp; import com.oracle.graal.compiler.common.type.ArithmeticOpTable.IntegerConvertOp.Narrow; import com.oracle.graal.compiler.common.type.ArithmeticOpTable.IntegerConvertOp.SignExtend; import com.oracle.graal.graph.spi.*; @@ -46,6 +47,20 @@ super(ArithmeticOpTable::getSignExtend, ArithmeticOpTable::getNarrow, inputBits, resultBits, input); } + public static ValueNode create(ValueNode input, int resultBits) { + return create(input, PrimitiveStamp.getBits(input.stamp()), resultBits); + } + + public static ValueNode create(ValueNode input, int inputBits, int resultBits) { + IntegerConvertOp signExtend = ArithmeticOpTable.forStamp(input.stamp()).getSignExtend(); + ValueNode synonym = findSynonym(signExtend, input, inputBits, resultBits, signExtend.foldStamp(inputBits, resultBits, input.stamp())); + if (synonym != null) { + return synonym; + } else { + return new SignExtendNode(input, inputBits, resultBits); + } + } + @Override public boolean isLossless() { return true; diff -r 6a2d58249a69 -r 2d6a2f18fe8c graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ZeroExtendNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ZeroExtendNode.java Fri Feb 13 19:39:03 2015 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ZeroExtendNode.java Fri Feb 13 21:32:50 2015 +0100 @@ -25,8 +25,8 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.compiler.common.calc.*; import com.oracle.graal.compiler.common.type.*; -import com.oracle.graal.compiler.common.type.ArithmeticOpTable.IntegerConvertOp.Narrow; -import com.oracle.graal.compiler.common.type.ArithmeticOpTable.IntegerConvertOp.ZeroExtend; +import com.oracle.graal.compiler.common.type.ArithmeticOpTable.*; +import com.oracle.graal.compiler.common.type.ArithmeticOpTable.IntegerConvertOp.*; import com.oracle.graal.graph.spi.*; import com.oracle.graal.lir.gen.*; import com.oracle.graal.nodeinfo.*; @@ -48,6 +48,20 @@ super(ArithmeticOpTable::getZeroExtend, ArithmeticOpTable::getNarrow, inputBits, resultBits, input); } + public static ValueNode create(ValueNode input, int resultBits) { + return create(input, PrimitiveStamp.getBits(input.stamp()), resultBits); + } + + public static ValueNode create(ValueNode input, int inputBits, int resultBits) { + IntegerConvertOp signExtend = ArithmeticOpTable.forStamp(input.stamp()).getZeroExtend(); + ValueNode synonym = findSynonym(signExtend, input, inputBits, resultBits, signExtend.foldStamp(inputBits, resultBits, input.stamp())); + if (synonym != null) { + return synonym; + } else { + return new ZeroExtendNode(input, inputBits, resultBits); + } + } + @Override public boolean isLossless() { return true;