# HG changeset patch # User Tom Rodriguez # Date 1446591860 28800 # Node ID 2a5b62614a96c4ec775521fce138a494482f421b # Parent 4311a0d2fd364b324b25d2f3b65bc4fae324081c Factor out stamp folding logic for UnaryNode and BinaryNode diff -r 4311a0d2fd36 -r 2a5b62614a96 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CompressionNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CompressionNode.java Tue Nov 03 15:13:15 2015 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CompressionNode.java Tue Nov 03 15:04:20 2015 -0800 @@ -71,8 +71,9 @@ } @Override - public boolean inferStamp() { - return updateStamp(mkStamp(op, getValue().stamp(), encoding)); + public Stamp foldStamp(Stamp newStamp) { + assert newStamp.isCompatible(getValue().stamp()); + return mkStamp(op, newStamp, encoding); } public static CompressionNode compress(ValueNode input, CompressEncoding encoding) { diff -r 4311a0d2fd36 -r 2a5b62614a96 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BinaryArithmeticNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BinaryArithmeticNode.java Tue Nov 03 15:13:15 2015 -0800 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BinaryArithmeticNode.java Tue Nov 03 15:04:20 2015 -0800 @@ -86,13 +86,10 @@ return null; } - public Stamp tryFoldStamp(Stamp xStamp, Stamp yStamp) { - return getOp(getX(), getY()).foldStamp(xStamp, yStamp); - } - @Override - public boolean inferStamp() { - return updateStamp(getOp(getX(), getY()).foldStamp(getX().stamp(), getY().stamp())); + public Stamp foldStamp(Stamp stampX, Stamp stampY) { + assert stampX.isCompatible(x.stamp()) && stampY.isCompatible(y.stamp()); + return getOp(getX(), getY()).foldStamp(stampX, stampY); } public static AddNode add(StructuredGraph graph, ValueNode v1, ValueNode v2) { diff -r 4311a0d2fd36 -r 2a5b62614a96 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BinaryNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BinaryNode.java Tue Nov 03 15:13:15 2015 -0800 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BinaryNode.java Tue Nov 03 15:04:20 2015 -0800 @@ -68,4 +68,19 @@ this.x = x; this.y = y; } + + @Override + public boolean inferStamp() { + return updateStamp(foldStamp(getX().stamp(), getY().stamp())); + } + + /** + * Compute an improved for this node using the passed in stamps. The stamps must be compatible + * with the current values of {@link #x} and {@link #y}. This code is used to provide the + * default implementation of {@link #inferStamp()} and may be used by external optimizations. + * + * @param stampX + * @param stampY + */ + public abstract Stamp foldStamp(Stamp stampX, Stamp stampY); } diff -r 4311a0d2fd36 -r 2a5b62614a96 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 Tue Nov 03 15:13:15 2015 -0800 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerConvertNode.java Tue Nov 03 15:04:20 2015 -0800 @@ -89,8 +89,9 @@ } @Override - public boolean inferStamp() { - return updateStamp(getOp(getValue()).foldStamp(inputBits, resultBits, getValue().stamp())); + public Stamp foldStamp(Stamp newStamp) { + assert newStamp.isCompatible(getValue().stamp()); + return getOp(getValue()).foldStamp(inputBits, resultBits, newStamp); } @Override diff -r 4311a0d2fd36 -r 2a5b62614a96 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NormalizeCompareNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NormalizeCompareNode.java Tue Nov 03 15:13:15 2015 -0800 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NormalizeCompareNode.java Tue Nov 03 15:04:20 2015 -0800 @@ -27,6 +27,7 @@ import com.oracle.graal.compiler.common.calc.Condition; import com.oracle.graal.compiler.common.type.FloatStamp; +import com.oracle.graal.compiler.common.type.Stamp; import com.oracle.graal.compiler.common.type.StampFactory; import com.oracle.graal.graph.NodeClass; import com.oracle.graal.graph.spi.CanonicalizerTool; @@ -81,6 +82,11 @@ } @Override + public boolean inferStamp() { + return false; + } + + @Override public void lower(LoweringTool tool) { LogicNode equalComp; LogicNode lessComp; @@ -97,4 +103,9 @@ graph().replaceFloating(this, value); } + + @Override + public Stamp foldStamp(Stamp stampX, Stamp stampY) { + return stamp(); + } } diff -r 4311a0d2fd36 -r 2a5b62614a96 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ShiftNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ShiftNode.java Tue Nov 03 15:13:15 2015 -0800 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ShiftNode.java Tue Nov 03 15:04:20 2015 -0800 @@ -32,6 +32,7 @@ import com.oracle.graal.compiler.common.type.ArithmeticOpTable; import com.oracle.graal.compiler.common.type.ArithmeticOpTable.ShiftOp; import com.oracle.graal.compiler.common.type.IntegerStamp; +import com.oracle.graal.compiler.common.type.Stamp; import com.oracle.graal.graph.NodeClass; import com.oracle.graal.graph.spi.CanonicalizerTool; import com.oracle.graal.nodeinfo.NodeInfo; @@ -69,8 +70,8 @@ } @Override - public boolean inferStamp() { - return updateStamp(getOp(getX()).foldStamp(getX().stamp(), (IntegerStamp) getY().stamp())); + public Stamp foldStamp(Stamp stampX, Stamp stampY) { + return getOp(getX()).foldStamp(stampX, (IntegerStamp) stampY); } @Override diff -r 4311a0d2fd36 -r 2a5b62614a96 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 Tue Nov 03 15:13:15 2015 -0800 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnaryArithmeticNode.java Tue Nov 03 15:04:20 2015 -0800 @@ -27,6 +27,7 @@ import com.oracle.graal.compiler.common.type.ArithmeticOpTable; import com.oracle.graal.compiler.common.type.ArithmeticOpTable.UnaryOp; +import com.oracle.graal.compiler.common.type.Stamp; import com.oracle.graal.graph.NodeClass; import com.oracle.graal.graph.spi.CanonicalizerTool; import com.oracle.graal.nodeinfo.NodeInfo; @@ -54,8 +55,9 @@ } @Override - public boolean inferStamp() { - return updateStamp(getOp(getValue()).foldStamp(getValue().stamp())); + public Stamp foldStamp(Stamp newStamp) { + assert newStamp.isCompatible(getValue().stamp()); + return getOp(getValue()).foldStamp(newStamp); } @Override diff -r 4311a0d2fd36 -r 2a5b62614a96 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnaryNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnaryNode.java Tue Nov 03 15:13:15 2015 -0800 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnaryNode.java Tue Nov 03 15:04:20 2015 -0800 @@ -52,4 +52,20 @@ super(c, stamp); this.value = value; } + + @Override + public boolean inferStamp() { + return updateStamp(foldStamp(value.stamp())); + } + + /** + * Compute an improved for this node using the passed in stamp. The stamp must be compatible + * with the current value of {@link #value}. This code is used to provide the default + * implementation of {@link #inferStamp()} and may be used by external optimizations. + * + * @param newStamp + */ + public Stamp foldStamp(Stamp newStamp) { + return stamp(); + } } diff -r 4311a0d2fd36 -r 2a5b62614a96 graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64CountLeadingZerosNode.java --- a/graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64CountLeadingZerosNode.java Tue Nov 03 15:13:15 2015 -0800 +++ b/graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64CountLeadingZerosNode.java Tue Nov 03 15:04:20 2015 -0800 @@ -28,6 +28,7 @@ import com.oracle.graal.compiler.common.type.IntegerStamp; import com.oracle.graal.compiler.common.type.PrimitiveStamp; +import com.oracle.graal.compiler.common.type.Stamp; import com.oracle.graal.compiler.common.type.StampFactory; import com.oracle.graal.graph.NodeClass; import com.oracle.graal.graph.spi.CanonicalizerTool; @@ -53,16 +54,17 @@ } @Override - public boolean inferStamp() { + public Stamp foldStamp(Stamp newStamp) { + assert newStamp.isCompatible(getValue().stamp()); assert value.getStackKind() == JavaKind.Int || value.getStackKind() == JavaKind.Long; - IntegerStamp valueStamp = (IntegerStamp) getValue().stamp(); + IntegerStamp valueStamp = (IntegerStamp) newStamp; long mask = CodeUtil.mask(valueStamp.getBits()); // Don't count zeros from the mask in the result. int adjust = Long.numberOfLeadingZeros(mask); assert adjust == 0 || adjust == 32; int min = Long.numberOfLeadingZeros(valueStamp.upMask() & mask) - adjust; int max = Long.numberOfLeadingZeros(valueStamp.downMask() & mask) - adjust; - return updateStamp(StampFactory.forInteger(JavaKind.Int, min, max)); + return StampFactory.forInteger(JavaKind.Int, min, max); } public static ValueNode tryFold(ValueNode value) { diff -r 4311a0d2fd36 -r 2a5b62614a96 graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64CountTrailingZerosNode.java --- a/graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64CountTrailingZerosNode.java Tue Nov 03 15:13:15 2015 -0800 +++ b/graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64CountTrailingZerosNode.java Tue Nov 03 15:04:20 2015 -0800 @@ -28,6 +28,7 @@ import com.oracle.graal.compiler.common.type.IntegerStamp; import com.oracle.graal.compiler.common.type.PrimitiveStamp; +import com.oracle.graal.compiler.common.type.Stamp; import com.oracle.graal.compiler.common.type.StampFactory; import com.oracle.graal.graph.NodeClass; import com.oracle.graal.graph.spi.CanonicalizerTool; @@ -53,12 +54,13 @@ } @Override - public boolean inferStamp() { - IntegerStamp valueStamp = (IntegerStamp) getValue().stamp(); + public Stamp foldStamp(Stamp newStamp) { + assert newStamp.isCompatible(getValue().stamp()); + IntegerStamp valueStamp = (IntegerStamp) newStamp; long mask = CodeUtil.mask(valueStamp.getBits()); int min = Long.numberOfTrailingZeros(valueStamp.upMask() & mask); int max = Long.numberOfTrailingZeros(valueStamp.downMask() & mask); - return updateStamp(StampFactory.forInteger(JavaKind.Int, min, max)); + return StampFactory.forInteger(JavaKind.Int, min, max); } public static ValueNode tryFold(ValueNode value) { diff -r 4311a0d2fd36 -r 2a5b62614a96 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitCountNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitCountNode.java Tue Nov 03 15:13:15 2015 -0800 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitCountNode.java Tue Nov 03 15:04:20 2015 -0800 @@ -28,6 +28,7 @@ import com.oracle.graal.compiler.common.type.IntegerStamp; import com.oracle.graal.compiler.common.type.PrimitiveStamp; +import com.oracle.graal.compiler.common.type.Stamp; import com.oracle.graal.compiler.common.type.StampFactory; import com.oracle.graal.graph.NodeClass; import com.oracle.graal.graph.spi.CanonicalizerTool; @@ -50,11 +51,12 @@ } @Override - public boolean inferStamp() { - IntegerStamp valueStamp = (IntegerStamp) getValue().stamp(); + public Stamp foldStamp(Stamp newStamp) { + assert newStamp.isCompatible(getValue().stamp()); + IntegerStamp valueStamp = (IntegerStamp) newStamp; assert (valueStamp.downMask() & CodeUtil.mask(valueStamp.getBits())) == valueStamp.downMask(); assert (valueStamp.upMask() & CodeUtil.mask(valueStamp.getBits())) == valueStamp.upMask(); - return updateStamp(StampFactory.forInteger(JavaKind.Int, Long.bitCount(valueStamp.downMask()), Long.bitCount(valueStamp.upMask()))); + return StampFactory.forInteger(JavaKind.Int, Long.bitCount(valueStamp.downMask()), Long.bitCount(valueStamp.upMask())); } @Override diff -r 4311a0d2fd36 -r 2a5b62614a96 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanForwardNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanForwardNode.java Tue Nov 03 15:13:15 2015 -0800 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanForwardNode.java Tue Nov 03 15:04:20 2015 -0800 @@ -28,6 +28,7 @@ import com.oracle.graal.compiler.common.type.IntegerStamp; import com.oracle.graal.compiler.common.type.PrimitiveStamp; +import com.oracle.graal.compiler.common.type.Stamp; import com.oracle.graal.compiler.common.type.StampFactory; import com.oracle.graal.graph.NodeClass; import com.oracle.graal.graph.spi.CanonicalizerTool; @@ -54,8 +55,9 @@ } @Override - public boolean inferStamp() { - IntegerStamp valueStamp = (IntegerStamp) getValue().stamp(); + public Stamp foldStamp(Stamp newStamp) { + assert newStamp.isCompatible(getValue().stamp()); + IntegerStamp valueStamp = (IntegerStamp) newStamp; int min; int max; long mask = CodeUtil.mask(valueStamp.getBits()); @@ -69,7 +71,7 @@ min = firstMaybeSetBit; max = firstAlwaysSetBit; } - return updateStamp(StampFactory.forInteger(JavaKind.Int, min, max)); + return StampFactory.forInteger(JavaKind.Int, min, max); } @Override diff -r 4311a0d2fd36 -r 2a5b62614a96 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanReverseNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanReverseNode.java Tue Nov 03 15:13:15 2015 -0800 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanReverseNode.java Tue Nov 03 15:04:20 2015 -0800 @@ -28,6 +28,7 @@ import com.oracle.graal.compiler.common.type.IntegerStamp; import com.oracle.graal.compiler.common.type.PrimitiveStamp; +import com.oracle.graal.compiler.common.type.Stamp; import com.oracle.graal.compiler.common.type.StampFactory; import com.oracle.graal.graph.NodeClass; import com.oracle.graal.graph.spi.CanonicalizerTool; @@ -54,8 +55,9 @@ } @Override - public boolean inferStamp() { - IntegerStamp valueStamp = (IntegerStamp) getValue().stamp(); + public Stamp foldStamp(Stamp newStamp) { + assert newStamp.isCompatible(getValue().stamp()); + IntegerStamp valueStamp = (IntegerStamp) newStamp; int min; int max; long mask = CodeUtil.mask(valueStamp.getBits()); @@ -68,7 +70,7 @@ } int lastMaybeSetBit = scan(valueStamp.upMask() & mask); max = lastMaybeSetBit; - return updateStamp(StampFactory.forInteger(JavaKind.Int, min, max)); + return StampFactory.forInteger(JavaKind.Int, min, max); } @Override diff -r 4311a0d2fd36 -r 2a5b62614a96 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/ReverseBytesNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/ReverseBytesNode.java Tue Nov 03 15:13:15 2015 -0800 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/ReverseBytesNode.java Tue Nov 03 15:04:20 2015 -0800 @@ -50,18 +50,17 @@ } @Override - public boolean inferStamp() { - IntegerStamp valueStamp = (IntegerStamp) getValue().stamp(); - Stamp newStamp; + public Stamp foldStamp(Stamp newStamp) { + assert newStamp.isCompatible(getValue().stamp()); + IntegerStamp valueStamp = (IntegerStamp) newStamp; if (getStackKind() == JavaKind.Int) { long mask = CodeUtil.mask(JavaKind.Int.getBitCount()); - newStamp = IntegerStamp.stampForMask(valueStamp.getBits(), Integer.reverse((int) valueStamp.downMask()) & mask, Integer.reverse((int) valueStamp.upMask()) & mask); + return IntegerStamp.stampForMask(valueStamp.getBits(), Integer.reverse((int) valueStamp.downMask()) & mask, Integer.reverse((int) valueStamp.upMask()) & mask); } else if (getStackKind() == JavaKind.Long) { - newStamp = IntegerStamp.stampForMask(valueStamp.getBits(), Long.reverse(valueStamp.downMask()), Long.reverse(valueStamp.upMask())); + return IntegerStamp.stampForMask(valueStamp.getBits(), Long.reverse(valueStamp.downMask()), Long.reverse(valueStamp.upMask())); } else { - return false; + return stamp(); } - return updateStamp(newStamp); } @Override diff -r 4311a0d2fd36 -r 2a5b62614a96 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/arithmetic/IntegerAddExactNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/arithmetic/IntegerAddExactNode.java Tue Nov 03 15:13:15 2015 -0800 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/arithmetic/IntegerAddExactNode.java Tue Nov 03 15:04:20 2015 -0800 @@ -56,13 +56,9 @@ } @Override - public boolean inferStamp() { - return updateStamp(foldStamp(x.stamp(), y.stamp())); - } - - private static Stamp foldStamp(Stamp stamp1, Stamp stamp2) { - IntegerStamp a = (IntegerStamp) stamp1; - IntegerStamp b = (IntegerStamp) stamp2; + public Stamp foldStamp(Stamp stampX, Stamp stampY) { + IntegerStamp a = (IntegerStamp) stampX; + IntegerStamp b = (IntegerStamp) stampY; int bits = a.getBits(); assert bits == b.getBits(); diff -r 4311a0d2fd36 -r 2a5b62614a96 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/arithmetic/IntegerMulHighNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/arithmetic/IntegerMulHighNode.java Tue Nov 03 15:13:15 2015 -0800 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/arithmetic/IntegerMulHighNode.java Tue Nov 03 15:04:20 2015 -0800 @@ -28,6 +28,7 @@ import jdk.vm.ci.meta.Value; import com.oracle.graal.compiler.common.type.IntegerStamp; +import com.oracle.graal.compiler.common.type.Stamp; import com.oracle.graal.compiler.common.type.StampFactory; import com.oracle.graal.graph.NodeClass; import com.oracle.graal.graph.spi.CanonicalizerTool; @@ -55,9 +56,9 @@ * Determines the minimum and maximum result of this node for the given inputs and returns the * result of the given BiFunction on the minimum and maximum values. */ - private T processExtremes(ValueNode forX, ValueNode forY, BiFunction op) { - IntegerStamp xStamp = (IntegerStamp) forX.stamp(); - IntegerStamp yStamp = (IntegerStamp) forY.stamp(); + private T processExtremes(Stamp forX, Stamp forY, BiFunction op) { + IntegerStamp xStamp = (IntegerStamp) forX; + IntegerStamp yStamp = (IntegerStamp) forY; JavaKind kind = getStackKind(); assert kind == JavaKind.Int || kind == JavaKind.Long; @@ -76,14 +77,14 @@ } @Override - public boolean inferStamp() { - return updateStamp(processExtremes(getX(), getY(), (min, max) -> StampFactory.forInteger(getStackKind(), min, max))); + public Stamp foldStamp(Stamp stampX, Stamp stampY) { + return processExtremes(stampX, stampY, (min, max) -> StampFactory.forInteger(getStackKind(), min, max)); } @SuppressWarnings("cast") @Override public ValueNode canonical(CanonicalizerTool tool, ValueNode forX, ValueNode forY) { - return processExtremes(forX, forY, (min, max) -> min == (long) max ? ConstantNode.forIntegerKind(getStackKind(), min) : this); + return processExtremes(forX.stamp(), forY.stamp(), (min, max) -> min == (long) max ? ConstantNode.forIntegerKind(getStackKind(), min) : this); } @Override diff -r 4311a0d2fd36 -r 2a5b62614a96 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/arithmetic/UnsignedMulHighNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/arithmetic/UnsignedMulHighNode.java Tue Nov 03 15:13:15 2015 -0800 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/arithmetic/UnsignedMulHighNode.java Tue Nov 03 15:04:20 2015 -0800 @@ -28,6 +28,7 @@ import jdk.vm.ci.meta.Value; import com.oracle.graal.compiler.common.type.IntegerStamp; +import com.oracle.graal.compiler.common.type.Stamp; import com.oracle.graal.compiler.common.type.StampFactory; import com.oracle.graal.graph.NodeClass; import com.oracle.graal.graph.spi.CanonicalizerTool; @@ -58,9 +59,9 @@ * maxima are calculated using signed min/max functions, while the values themselves are * unsigned. */ - private T processExtremes(ValueNode forX, ValueNode forY, BiFunction op) { - IntegerStamp xStamp = (IntegerStamp) forX.stamp(); - IntegerStamp yStamp = (IntegerStamp) forY.stamp(); + private T processExtremes(Stamp forX, Stamp forY, BiFunction op) { + IntegerStamp xStamp = (IntegerStamp) forX; + IntegerStamp yStamp = (IntegerStamp) forY; JavaKind kind = getStackKind(); assert kind == JavaKind.Int || kind == JavaKind.Long; @@ -80,15 +81,15 @@ @SuppressWarnings("cast") @Override - public boolean inferStamp() { + public Stamp foldStamp(Stamp stampX, Stamp stampY) { // if min is negative, then the value can reach into the unsigned range - return updateStamp(processExtremes(getX(), getY(), (min, max) -> (min == (long) max || min >= 0) ? StampFactory.forInteger(getStackKind(), min, max) : StampFactory.forKind(getStackKind()))); + return processExtremes(stampX, stampY, (min, max) -> (min == (long) max || min >= 0) ? StampFactory.forInteger(getStackKind(), min, max) : StampFactory.forKind(getStackKind())); } @SuppressWarnings("cast") @Override public ValueNode canonical(CanonicalizerTool tool, ValueNode forX, ValueNode forY) { - return processExtremes(forX, forY, (min, max) -> min == (long) max ? ConstantNode.forIntegerKind(getStackKind(), min) : this); + return processExtremes(forX.stamp(), forY.stamp(), (min, max) -> min == (long) max ? ConstantNode.forIntegerKind(getStackKind(), min) : this); } @Override