< prev index next >
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/RightShiftNode.java
Print this page
*** 81,98 ****
--- 81,117 ----
RightShiftNode self = rightShiftNode;
if (forX.stamp(view) instanceof IntegerStamp && ((IntegerStamp) forX.stamp(view)).isPositive()) {
return new UnsignedRightShiftNode(forX, forY);
}
+ Stamp xStampGeneric = forX.stamp(view);
+ if (xStampGeneric instanceof IntegerStamp) {
+ IntegerStamp xStamp = (IntegerStamp) xStampGeneric;
+ if (xStamp.lowerBound() >= -1 && xStamp.upperBound() <= 0) {
+ // Right shift by any amount does not change any bit.
+ return forX;
+ }
+ }
+
if (forY.isConstant()) {
int amount = forY.asJavaConstant().asInt();
int originalAmout = amount;
int mask = op.getShiftAmountMask(stamp);
amount &= mask;
if (amount == 0) {
return forX;
}
+
+ if (xStampGeneric instanceof IntegerStamp) {
+ IntegerStamp xStamp = (IntegerStamp) xStampGeneric;
+
+ if (xStamp.lowerBound() >> amount == xStamp.upperBound() >> amount) {
+ // Right shift turns the result of the expression into a constant.
+ return ConstantNode.forIntegerKind(stamp.getStackKind(), xStamp.lowerBound() >> amount);
+ }
+ }
+
if (forX instanceof ShiftNode) {
ShiftNode<?> other = (ShiftNode<?>) forX;
if (other.getY().isConstant()) {
int otherAmount = other.getY().asJavaConstant().asInt() & mask;
if (other instanceof RightShiftNode) {
< prev index next >