src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerDivRemNode.java
--- 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() {