--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/AndNode.java Thu Oct 31 14:23:06 2019 -0700
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/AndNode.java Thu Oct 31 16:54:16 2019 -0700
@@ -28,7 +28,6 @@
import org.graalvm.compiler.core.common.type.ArithmeticOpTable.BinaryOp;
import org.graalvm.compiler.core.common.type.ArithmeticOpTable.BinaryOp.And;
import org.graalvm.compiler.core.common.type.IntegerStamp;
-import org.graalvm.compiler.core.common.type.PrimitiveStamp;
import org.graalvm.compiler.core.common.type.Stamp;
import org.graalvm.compiler.graph.NodeClass;
import org.graalvm.compiler.graph.spi.Canonicalizable.BinaryCommutative;
@@ -41,7 +40,6 @@
import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool;
import org.graalvm.compiler.nodes.util.GraphUtil;
-import jdk.vm.ci.code.CodeUtil;
import jdk.vm.ci.meta.Constant;
import jdk.vm.ci.meta.PrimitiveConstant;
@@ -61,7 +59,7 @@
if (tryConstantFold != null) {
return tryConstantFold;
}
- return canonical(null, op, stamp, x, y, view);
+ return canonical(null, op, x, y, view);
}
@Override
@@ -77,16 +75,29 @@
}
NodeView view = NodeView.from(tool);
- return canonical(this, getOp(forX, forY), stamp(view), forX, forY, view);
+ return canonical(this, getOp(forX, forY), forX, forY, view);
}
- private static ValueNode canonical(AndNode self, BinaryOp<And> op, Stamp stamp, ValueNode forX, ValueNode forY, NodeView view) {
+ private static ValueNode canonical(AndNode self, BinaryOp<And> op, ValueNode forX, ValueNode forY, NodeView view) {
if (GraphUtil.unproxify(forX) == GraphUtil.unproxify(forY)) {
return forX;
}
if (forX.isConstant() && !forY.isConstant()) {
return new AndNode(forY, forX);
}
+
+ Stamp rawXStamp = forX.stamp(view);
+ Stamp rawYStamp = forY.stamp(view);
+ if (rawXStamp instanceof IntegerStamp && rawYStamp instanceof IntegerStamp) {
+ IntegerStamp xStamp = (IntegerStamp) rawXStamp;
+ IntegerStamp yStamp = (IntegerStamp) rawYStamp;
+ if (((~xStamp.downMask()) & yStamp.upMask()) == 0) {
+ return forY;
+ } else if (((~yStamp.downMask()) & xStamp.upMask()) == 0) {
+ return forX;
+ }
+ }
+
if (forY.isConstant()) {
Constant c = forY.asConstant();
if (op.isNeutral(c)) {
@@ -95,21 +106,12 @@
if (c instanceof PrimitiveConstant && ((PrimitiveConstant) c).getJavaKind().isNumericInteger()) {
long rawY = ((PrimitiveConstant) c).asLong();
- long mask = CodeUtil.mask(PrimitiveStamp.getBits(stamp));
- if ((rawY & mask) == 0) {
- return ConstantNode.forIntegerStamp(stamp, 0);
- }
if (forX instanceof SignExtendNode) {
SignExtendNode ext = (SignExtendNode) forX;
if (rawY == ((1L << ext.getInputBits()) - 1)) {
return new ZeroExtendNode(ext.getValue(), ext.getResultBits());
}
}
- IntegerStamp xStamp = (IntegerStamp) forX.stamp(view);
- if (((xStamp.upMask() | xStamp.downMask()) & ~rawY) == 0) {
- // No bits are set which are outside the mask, so the mask will have no effect.
- return forX;
- }
}
return reassociate(self != null ? self : (AndNode) new AndNode(forX, forY).maybeCommuteInputs(), ValueNode.isConstantPredicate(), forX, forY, view);