src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerDivRemNode.java
changeset 50330 2cbc42a5764b
parent 48398 79afa4c434f6
child 50858 2d3e99a72541
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerDivRemNode.java	Thu May 31 10:14:41 2018 -0700
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerDivRemNode.java	Thu May 31 10:38:05 2018 -0700
@@ -28,9 +28,11 @@
 import org.graalvm.compiler.core.common.type.IntegerStamp;
 import org.graalvm.compiler.core.common.type.Stamp;
 import org.graalvm.compiler.graph.NodeClass;
+import org.graalvm.compiler.nodeinfo.InputType;
 import org.graalvm.compiler.nodeinfo.NodeInfo;
 import org.graalvm.compiler.nodes.NodeView;
 import org.graalvm.compiler.nodes.ValueNode;
+import org.graalvm.compiler.nodes.extended.GuardingNode;
 import org.graalvm.compiler.nodes.spi.Lowerable;
 import org.graalvm.compiler.nodes.spi.LoweringTool;
 
@@ -49,19 +51,26 @@
         UNSIGNED
     }
 
+    @OptionalInput(InputType.Guard) private GuardingNode zeroCheck;
+
     private final Op op;
     private final Type type;
     private final boolean canDeopt;
 
-    protected IntegerDivRemNode(NodeClass<? extends IntegerDivRemNode> c, Stamp stamp, Op op, Type type, ValueNode x, ValueNode y) {
+    protected IntegerDivRemNode(NodeClass<? extends IntegerDivRemNode> c, Stamp stamp, Op op, Type type, ValueNode x, ValueNode y, GuardingNode zeroCheck) {
         super(c, stamp, x, y);
+        this.zeroCheck = zeroCheck;
         this.op = op;
         this.type = type;
 
         // Assigning canDeopt during constructor, because it must never change during lifetime of
         // the node.
         IntegerStamp yStamp = (IntegerStamp) getY().stamp(NodeView.DEFAULT);
-        this.canDeopt = yStamp.contains(0) || yStamp.contains(-1);
+        this.canDeopt = (yStamp.contains(0) && zeroCheck == null) || yStamp.contains(-1);
+    }
+
+    public final GuardingNode getZeroCheck() {
+        return zeroCheck;
     }
 
     public final Op getOp() {