< prev index next >
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/IntegerLessThanNode.java
Print this page
rev 52509 : [mq]: graal2
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2018, 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.
@@ -45,11 +45,10 @@
import org.graalvm.compiler.options.OptionValues;
import jdk.vm.ci.code.CodeUtil;
import jdk.vm.ci.meta.Constant;
import jdk.vm.ci.meta.ConstantReflectionProvider;
-import jdk.vm.ci.meta.JavaConstant;
import jdk.vm.ci.meta.JavaKind;
import jdk.vm.ci.meta.MetaAccessProvider;
import jdk.vm.ci.meta.PrimitiveConstant;
@NodeInfo(shortName = "<")
@@ -173,11 +172,15 @@
if (forX.stamp(view) instanceof IntegerStamp && forY.stamp(view) instanceof IntegerStamp) {
if (IntegerStamp.sameSign((IntegerStamp) forX.stamp(view), (IntegerStamp) forY.stamp(view))) {
return new IntegerBelowNode(forX, forY);
}
}
- if (forY.isConstant() && forX instanceof SubNode) {
+
+ // Attempt to optimize the case where we can fold a constant from the left side (either
+ // from an add or sub) into the constant on the right side.
+ if (forY.isConstant()) {
+ if (forX instanceof SubNode) {
SubNode sub = (SubNode) forX;
ValueNode xx = null;
ValueNode yy = null;
boolean negate = false;
if (forY.asConstant().isDefaultForKind()) {
@@ -203,59 +206,38 @@
logic = LogicNegationNode.create(logic);
}
return logic;
}
}
+ } else if (forX instanceof AddNode) {
+
+ // (x + xConstant) < forY => x < (forY - xConstant)
+ AddNode addNode = (AddNode) forX;
+ if (addNode.getY().isJavaConstant()) {
+ IntegerStamp xStamp = (IntegerStamp) addNode.getX().stamp(view);
+ if (!IntegerStamp.addCanOverflow(xStamp, (IntegerStamp) addNode.getY().stamp(view))) {
+ long minValue = CodeUtil.minValue(xStamp.getBits());
+ long maxValue = CodeUtil.maxValue(xStamp.getBits());
+ long yConstant = forY.asJavaConstant().asLong();
+ long xConstant = addNode.getY().asJavaConstant().asLong();
+ if (!subtractMayUnderflow(yConstant, xConstant, minValue) && !subtractMayOverflow(yConstant, xConstant, maxValue)) {
+ long newConstant = yConstant - xConstant;
+ return IntegerLessThanNode.create(addNode.getX(), ConstantNode.forIntegerStamp(xStamp, newConstant), view);
+ }
+ }
+ }
+
+ }
}
if (forX.stamp(view) instanceof IntegerStamp) {
assert forY.stamp(view) instanceof IntegerStamp;
int bits = ((IntegerStamp) forX.stamp(view)).getBits();
assert ((IntegerStamp) forY.stamp(view)).getBits() == bits;
- long min = OP.minValue(bits);
- long xResidue = 0;
- ValueNode left = null;
- JavaConstant leftCst = null;
- if (forX instanceof AddNode) {
- AddNode xAdd = (AddNode) forX;
- if (xAdd.getY().isJavaConstant()) {
- long xCst = xAdd.getY().asJavaConstant().asLong();
- xResidue = xCst - min;
- left = xAdd.getX();
- }
- } else if (forX.isJavaConstant()) {
- leftCst = forX.asJavaConstant();
- }
- if (left != null || leftCst != null) {
- long yResidue = 0;
- ValueNode right = null;
- JavaConstant rightCst = null;
- if (forY instanceof AddNode) {
- AddNode yAdd = (AddNode) forY;
- if (yAdd.getY().isJavaConstant()) {
- long yCst = yAdd.getY().asJavaConstant().asLong();
- yResidue = yCst - min;
- right = yAdd.getX();
- }
- } else if (forY.isJavaConstant()) {
- rightCst = forY.asJavaConstant();
- }
- if (right != null || rightCst != null) {
- if ((xResidue == 0 && left != null) || (yResidue == 0 && right != null)) {
- if (left == null) {
- left = ConstantNode.forIntegerBits(bits, leftCst.asLong() - min);
- } else if (xResidue != 0) {
- left = AddNode.create(left, ConstantNode.forIntegerBits(bits, xResidue), view);
- }
- if (right == null) {
- right = ConstantNode.forIntegerBits(bits, rightCst.asLong() - min);
- } else if (yResidue != 0) {
- right = AddNode.create(right, ConstantNode.forIntegerBits(bits, yResidue), view);
- }
- return new IntegerBelowNode(left, right);
- }
- }
+ LogicNode logic = canonicalizeRangeFlip(forX, forY, bits, true, view);
+ if (logic != null) {
+ return logic;
}
}
return null;
}
< prev index next >