src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerEqualsNode.java
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
*** old/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerEqualsNode.java Mon Mar 20 17:40:38 2017
--- new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerEqualsNode.java Mon Mar 20 17:40:37 2017
*** 26,36 ****
--- 26,35 ----
import org.graalvm.compiler.core.common.type.AbstractPointerStamp;
import org.graalvm.compiler.core.common.type.FloatStamp;
import org.graalvm.compiler.core.common.type.IntegerStamp;
import org.graalvm.compiler.core.common.type.Stamp;
import org.graalvm.compiler.debug.GraalError;
import org.graalvm.compiler.graph.IterableNodeType;
import org.graalvm.compiler.graph.NodeClass;
import org.graalvm.compiler.graph.spi.Canonicalizable.BinaryCommutative;
import org.graalvm.compiler.graph.spi.CanonicalizerTool;
import org.graalvm.compiler.nodeinfo.NodeInfo;
import org.graalvm.compiler.nodes.ConstantNode;
*** 45,55 ****
--- 44,54 ----
import jdk.vm.ci.meta.JavaKind;
import jdk.vm.ci.meta.PrimitiveConstant;
import jdk.vm.ci.meta.TriState;
@NodeInfo(shortName = "==")
- public final class IntegerEqualsNode extends CompareNode implements BinaryCommutative<ValueNode>, IterableNodeType {
public static final NodeClass<IntegerEqualsNode> TYPE = NodeClass.create(IntegerEqualsNode.class);
public IntegerEqualsNode(ValueNode x, ValueNode y) {
super(TYPE, Condition.EQ, false, x, y);
assert !x.getStackKind().isNumericFloat() && x.getStackKind() != JavaKind.Object;
*** 121,131 ****
--- 120,139 ----
return super.canonical(tool, forX, forY);
}
@Override
protected ValueNode canonicalizeSymmetricConstant(CanonicalizerTool tool, Constant constant, ValueNode nonConstant, boolean mirrored) {
- if (constant instanceof PrimitiveConstant && ((PrimitiveConstant) constant).asLong() == 0) {
+ PrimitiveConstant primitiveConstant = (PrimitiveConstant) constant;
+ IntegerStamp nonConstantStamp = ((IntegerStamp) nonConstant.stamp());
+ if ((primitiveConstant.asLong() == 1 && nonConstantStamp.upperBound() == 1 && nonConstantStamp.lowerBound() == 0) ||
+ (primitiveConstant.asLong() == -1 && nonConstantStamp.upperBound() == 0 && nonConstantStamp.lowerBound() == -1)) {
+ // nonConstant can only be 0 or 1 (respective -1), test against 0 instead of 1
+ // (respective -1) for a more canonical graph and also to allow for faster execution
+ // on specific platforms.
+ return LogicNegationNode.create(IntegerEqualsNode.create(nonConstant, ConstantNode.forIntegerKind(nonConstant.getStackKind(), 0), null));
+ } else if (primitiveConstant.asLong() == 0) {
if (nonConstant instanceof AndNode) {
AndNode andNode = (AndNode) nonConstant;
return new IntegerTestNode(andNode.getX(), andNode.getY());
} else if (nonConstant instanceof SubNode) {
SubNode subNode = (SubNode) nonConstant;
*** 168,202 ****
--- 176,216 ----
}
}
}
}
}
+ if (nonConstant instanceof AddNode) {
+ AddNode addNode = (AddNode) nonConstant;
+ if (addNode.getY().isJavaConstant()) {
+ return new IntegerEqualsNode(addNode.getX(), ConstantNode.forIntegerStamp(nonConstantStamp, primitiveConstant.asLong() - addNode.getY().asJavaConstant().asLong()));
+ }
+ }
if (nonConstant instanceof AndNode) {
/*
* a & c == c is the same as a & c != 0, if c is a single bit.
*/
AndNode andNode = (AndNode) nonConstant;
if (constant instanceof PrimitiveConstant && Long.bitCount(((PrimitiveConstant) constant).asLong()) == 1 && andNode.getY().isConstant() &&
andNode.getY().asJavaConstant().equals(constant)) {
+ if (Long.bitCount(((PrimitiveConstant) constant).asLong()) == 1 && andNode.getY().isConstant() && andNode.getY().asJavaConstant().equals(constant)) {
return new LogicNegationNode(new IntegerTestNode(andNode.getX(), andNode.getY()));
}
}
+ }
return super.canonicalizeSymmetricConstant(tool, constant, nonConstant, mirrored);
}
@Override
! public Stamp getSucceedingStampForX(boolean negated, Stamp xStamp, Stamp yStamp) {
if (!negated) {
! return getX().stamp().join(getY().stamp());
! return xStamp.join(yStamp);
}
return null;
}
@Override
! public Stamp getSucceedingStampForY(boolean negated, Stamp xStamp, Stamp yStamp) {
if (!negated) {
! return getX().stamp().join(getY().stamp());
! return xStamp.join(yStamp);
}
return null;
}
@Override
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerEqualsNode.java
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File