src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerBelowNode.java
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
hotspot Cdiff src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerBelowNode.java
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerBelowNode.java
Print this page
*** 1,7 ****
/*
! * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
--- 1,7 ----
/*
! * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*** 20,193 ****
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package org.graalvm.compiler.nodes.calc;
import org.graalvm.compiler.core.common.calc.Condition;
import org.graalvm.compiler.core.common.type.IntegerStamp;
- import org.graalvm.compiler.core.common.type.Stamp;
import org.graalvm.compiler.core.common.type.StampFactory;
import org.graalvm.compiler.graph.NodeClass;
- import org.graalvm.compiler.graph.spi.CanonicalizerTool;
import org.graalvm.compiler.nodeinfo.NodeInfo;
- import org.graalvm.compiler.nodes.LogicConstantNode;
- import org.graalvm.compiler.nodes.LogicNegationNode;
import org.graalvm.compiler.nodes.LogicNode;
import org.graalvm.compiler.nodes.ValueNode;
- import org.graalvm.compiler.nodes.util.GraphUtil;
import jdk.vm.ci.code.CodeUtil;
import jdk.vm.ci.meta.ConstantReflectionProvider;
- import jdk.vm.ci.meta.TriState;
@NodeInfo(shortName = "|<|")
! public final class IntegerBelowNode extends CompareNode {
public static final NodeClass<IntegerBelowNode> TYPE = NodeClass.create(IntegerBelowNode.class);
public IntegerBelowNode(ValueNode x, ValueNode y) {
! super(TYPE, Condition.BT, false, x, y);
assert x.stamp() instanceof IntegerStamp;
assert y.stamp() instanceof IntegerStamp;
}
public static LogicNode create(ValueNode x, ValueNode y, ConstantReflectionProvider constantReflection) {
! LogicNode result = CompareNode.tryConstantFold(Condition.BT, x, y, constantReflection, false);
! if (result != null) {
! return result;
! } else {
! result = findSynonym(x, y);
! if (result != null) {
! return result;
! }
! return new IntegerBelowNode(x, y);
! }
}
@Override
! public ValueNode canonical(CanonicalizerTool tool, ValueNode forX, ValueNode forY) {
! ValueNode result = super.canonical(tool, forX, forY);
! if (result != this) {
! return result;
! }
! LogicNode synonym = findSynonym(forX, forY);
! if (synonym != null) {
! return synonym;
! }
! if (forX.isConstant() && forX.asJavaConstant().asLong() == 0) {
! // 0 |<| y is the same as 0 != y
! return LogicNegationNode.create(CompareNode.createCompareNode(Condition.EQ, forX, forY, tool.getConstantReflection()));
! }
! return this;
}
! private static LogicNode findSynonym(ValueNode forX, ValueNode forY) {
! if (GraphUtil.unproxify(forX) == GraphUtil.unproxify(forY)) {
! return LogicConstantNode.contradiction();
! } else if (forX.stamp() instanceof IntegerStamp && forY.stamp() instanceof IntegerStamp) {
! IntegerStamp xStamp = (IntegerStamp) forX.stamp();
! IntegerStamp yStamp = (IntegerStamp) forY.stamp();
! if (yStamp.isPositive()) {
! if (xStamp.isPositive() && xStamp.upperBound() < yStamp.lowerBound()) {
! return LogicConstantNode.tautology();
! } else if (xStamp.isStrictlyNegative() || xStamp.lowerBound() >= yStamp.upperBound()) {
! return LogicConstantNode.contradiction();
! }
! }
! }
! return null;
! }
@Override
! protected CompareNode duplicateModified(ValueNode newX, ValueNode newY) {
! return new IntegerBelowNode(newX, newY);
}
@Override
! public Stamp getSucceedingStampForX(boolean negated) {
! Stamp xStampGeneric = getX().stamp();
! Stamp yStampGeneric = getY().stamp();
! if (xStampGeneric instanceof IntegerStamp) {
! IntegerStamp xStamp = (IntegerStamp) xStampGeneric;
! int bits = xStamp.getBits();
! if (yStampGeneric instanceof IntegerStamp) {
! IntegerStamp yStamp = (IntegerStamp) yStampGeneric;
! assert yStamp.getBits() == bits;
! if (negated) {
! // x >= y
! if (xStamp.isPositive() && yStamp.isPositive()) {
! long xLowerBound = xStamp.lowerBound();
! long yLowerBound = yStamp.lowerBound();
! if (yLowerBound > xLowerBound) {
! return StampFactory.forIntegerWithMask(bits, yLowerBound, xStamp.upperBound(), xStamp);
! }
! }
! } else {
! // x < y
! if (yStamp.isStrictlyPositive()) {
! // x >= 0 && x < y
! long xUpperBound = xStamp.upperBound();
! long yUpperBound = yStamp.upperBound();
! if (yUpperBound <= xUpperBound || !xStamp.isPositive()) {
! return StampFactory.forIntegerWithMask(bits, Math.max(0, xStamp.lowerBound()), Math.min(xUpperBound, yUpperBound - 1), xStamp);
! }
! }
! }
! }
! }
! return null;
}
@Override
! public Stamp getSucceedingStampForY(boolean negated) {
! Stamp xStampGeneric = getX().stamp();
! Stamp yStampGeneric = getY().stamp();
! if (xStampGeneric instanceof IntegerStamp) {
! IntegerStamp xStamp = (IntegerStamp) xStampGeneric;
! int bits = xStamp.getBits();
! if (yStampGeneric instanceof IntegerStamp) {
! IntegerStamp yStamp = (IntegerStamp) yStampGeneric;
! assert yStamp.getBits() == bits;
! if (negated) {
! // y <= x
! if (xStamp.isPositive()) {
! long xUpperBound = xStamp.upperBound();
! long yUpperBound = yStamp.upperBound();
! if (xUpperBound < yUpperBound || !yStamp.isPositive()) {
! return StampFactory.forIntegerWithMask(bits, Math.max(0, yStamp.lowerBound()), Math.min(xUpperBound, yUpperBound), yStamp);
! }
! }
! } else {
! // y > x
! if (xStamp.isPositive() && yStamp.isPositive()) {
! long xLowerBound = xStamp.lowerBound();
! long yLowerBound = yStamp.lowerBound();
! if (xLowerBound == CodeUtil.maxValue(bits)) {
! return null;
! } else if (xLowerBound >= yLowerBound) {
! assert xLowerBound != CodeUtil.maxValue(bits);
! return StampFactory.forIntegerWithMask(bits, xLowerBound + 1, yStamp.upperBound(), yStamp);
! }
}
}
}
}
! return null;
}
@Override
! public TriState tryFold(Stamp xStampGeneric, Stamp yStampGeneric) {
! if (xStampGeneric instanceof IntegerStamp) {
! IntegerStamp xStamp = (IntegerStamp) xStampGeneric;
! if (yStampGeneric instanceof IntegerStamp) {
! IntegerStamp yStamp = (IntegerStamp) yStampGeneric;
! if (yStamp.isPositive()) {
! if (xStamp.isPositive() && xStamp.upperBound() < yStamp.lowerBound()) {
! return TriState.TRUE;
! } else if (xStamp.isStrictlyNegative() || xStamp.lowerBound() >= yStamp.upperBound()) {
! return TriState.FALSE;
}
}
}
}
- return TriState.UNKNOWN;
}
}
--- 20,115 ----
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package org.graalvm.compiler.nodes.calc;
+ import org.graalvm.compiler.core.common.NumUtil;
import org.graalvm.compiler.core.common.calc.Condition;
import org.graalvm.compiler.core.common.type.IntegerStamp;
import org.graalvm.compiler.core.common.type.StampFactory;
import org.graalvm.compiler.graph.NodeClass;
import org.graalvm.compiler.nodeinfo.NodeInfo;
import org.graalvm.compiler.nodes.LogicNode;
import org.graalvm.compiler.nodes.ValueNode;
import jdk.vm.ci.code.CodeUtil;
import jdk.vm.ci.meta.ConstantReflectionProvider;
@NodeInfo(shortName = "|<|")
! public final class IntegerBelowNode extends IntegerLowerThanNode {
public static final NodeClass<IntegerBelowNode> TYPE = NodeClass.create(IntegerBelowNode.class);
+ private static final BelowOp OP = new BelowOp();
public IntegerBelowNode(ValueNode x, ValueNode y) {
! super(TYPE, x, y, OP);
assert x.stamp() instanceof IntegerStamp;
assert y.stamp() instanceof IntegerStamp;
}
public static LogicNode create(ValueNode x, ValueNode y, ConstantReflectionProvider constantReflection) {
! return OP.create(x, y, constantReflection);
}
@Override
! protected CompareNode duplicateModified(ValueNode newX, ValueNode newY) {
! assert newX.stamp() instanceof IntegerStamp && newY.stamp() instanceof IntegerStamp;
! return new IntegerBelowNode(newX, newY);
}
! public static class BelowOp extends LowerOp {
@Override
! protected long upperBound(IntegerStamp stamp) {
! return stamp.unsignedUpperBound();
}
@Override
! protected long lowerBound(IntegerStamp stamp) {
! return stamp.unsignedLowerBound();
}
@Override
! protected int compare(long a, long b) {
! return Long.compareUnsigned(a, b);
}
+
+ @Override
+ protected long min(long a, long b) {
+ return NumUtil.minUnsigned(a, b);
}
+
+ @Override
+ protected long max(long a, long b) {
+ return NumUtil.maxUnsigned(a, b);
}
+
+ @Override
+ protected long cast(long a, int bits) {
+ return CodeUtil.zeroExtend(a, bits);
}
!
! @Override
! protected long minValue(int bits) {
! return 0;
}
@Override
! protected long maxValue(int bits) {
! return NumUtil.maxValueUnsigned(bits);
}
+
+ @Override
+ protected IntegerStamp forInteger(int bits, long min, long max) {
+ return StampFactory.forUnsignedInteger(bits, min, max);
}
+
+ @Override
+ protected Condition getCondition() {
+ return Condition.BT;
}
+
+ @Override
+ protected IntegerLowerThanNode create(ValueNode x, ValueNode y) {
+ return new IntegerBelowNode(x, y);
}
}
}
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerBelowNode.java
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File