Mercurial > hg > truffle
changeset 19364:2d6a2f18fe8c
Add graph builder folding support for integer conversion nodes.
author | Thomas Wuerthinger <thomas.wuerthinger@oracle.com> |
---|---|
date | Fri, 13 Feb 2015 21:32:50 +0100 |
parents | 6a2d58249a69 |
children | bef4a591e0b3 |
files | graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerConvertNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NarrowNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/SignExtendNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ZeroExtendNode.java |
diffstat | 5 files changed, 59 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- 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
--- 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 <T> ValueNode findSynonym(IntegerConvertOp<T> 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) {
--- 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<Narrow> 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;
--- 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> 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;
--- 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<ZeroExtend> 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;