changeset 22942:2a5b62614a96

Factor out stamp folding logic for UnaryNode and BinaryNode
author Tom Rodriguez <tom.rodriguez@oracle.com>
date Tue, 03 Nov 2015 15:04:20 -0800
parents 4311a0d2fd36
children 86bee10c31b0
files graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CompressionNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BinaryArithmeticNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BinaryNode.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/NormalizeCompareNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ShiftNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnaryArithmeticNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnaryNode.java graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64CountLeadingZerosNode.java graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64CountTrailingZerosNode.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitCountNode.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanForwardNode.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanReverseNode.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/ReverseBytesNode.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/arithmetic/IntegerAddExactNode.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/arithmetic/IntegerMulHighNode.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/arithmetic/UnsignedMulHighNode.java
diffstat 17 files changed, 106 insertions(+), 55 deletions(-) [+]
line wrap: on
line diff
--- 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) {
--- 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) {
--- 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);
 }
--- 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
--- 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();
+    }
 }
--- 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
--- 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
--- 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();
+    }
 }
--- 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) {
--- 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) {
--- 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
--- 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
--- 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
--- 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
--- 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();
--- 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> T processExtremes(ValueNode forX, ValueNode forY, BiFunction<Long, Long, T> op) {
-        IntegerStamp xStamp = (IntegerStamp) forX.stamp();
-        IntegerStamp yStamp = (IntegerStamp) forY.stamp();
+    private <T> T processExtremes(Stamp forX, Stamp forY, BiFunction<Long, Long, T> 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
--- 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> T processExtremes(ValueNode forX, ValueNode forY, BiFunction<Long, Long, T> op) {
-        IntegerStamp xStamp = (IntegerStamp) forX.stamp();
-        IntegerStamp yStamp = (IntegerStamp) forY.stamp();
+    private <T> T processExtremes(Stamp forX, Stamp forY, BiFunction<Long, Long, T> 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