< prev index next >
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/IntegerStamp.java
Print this page
*** 595,604 ****
--- 595,608 ----
@Override
public Stamp foldStamp(Stamp s) {
IntegerStamp stamp = (IntegerStamp) s;
int bits = stamp.getBits();
+ if (stamp.lowerBound == stamp.upperBound) {
+ long value = CodeUtil.convert(-stamp.lowerBound(), stamp.getBits(), false);
+ return StampFactory.forInteger(stamp.getBits(), value, value);
+ }
if (stamp.lowerBound() != CodeUtil.minValue(bits)) {
// TODO(ls) check if the mask calculation is correct...
return StampFactory.forInteger(bits, -stamp.upperBound(), -stamp.lowerBound());
} else {
return stamp.unrestricted();
*** 622,631 ****
--- 626,640 ----
IntegerStamp b = (IntegerStamp) stamp2;
int bits = a.getBits();
assert bits == b.getBits();
+ if (a.lowerBound == a.upperBound && b.lowerBound == b.upperBound) {
+ long value = CodeUtil.convert(a.lowerBound() + b.lowerBound(), a.getBits(), false);
+ return StampFactory.forInteger(a.getBits(), value, value);
+ }
+
if (a.isUnrestricted()) {
return a;
} else if (b.isUnrestricted()) {
return b;
}
*** 709,718 ****
--- 718,733 ----
IntegerStamp a = (IntegerStamp) stamp1;
IntegerStamp b = (IntegerStamp) stamp2;
int bits = a.getBits();
assert bits == b.getBits();
+
+ if (a.lowerBound == a.upperBound && b.lowerBound == b.upperBound) {
+ long value = CodeUtil.convert(a.lowerBound() * b.lowerBound(), a.getBits(), false);
+ return StampFactory.forInteger(a.getBits(), value, value);
+ }
+
// if a==0 or b==0 result of a*b is always 0
if (a.upMask() == 0) {
return a;
} else if (b.upMask() == 0) {
return b;
*** 789,799 ****
long maxNegB = Math.min(0, b.upperBound());
long minPosB = Math.max(0, b.lowerBound());
long maxPosB = b.upperBound();
// multiplication has shift semantics
! long newUpMask = ~CodeUtil.mask(Long.numberOfTrailingZeros(a.upMask) + Long.numberOfTrailingZeros(b.upMask)) & CodeUtil.mask(bits);
if (a.canBePositive()) {
if (b.canBePositive()) {
if (multiplicationOverflows(maxPosA, maxPosB, bits)) {
return a.unrestricted();
--- 804,814 ----
long maxNegB = Math.min(0, b.upperBound());
long minPosB = Math.max(0, b.lowerBound());
long maxPosB = b.upperBound();
// multiplication has shift semantics
! long newUpMask = ~CodeUtil.mask(Math.min(64, Long.numberOfTrailingZeros(a.upMask) + Long.numberOfTrailingZeros(b.upMask))) & CodeUtil.mask(bits);
if (a.canBePositive()) {
if (b.canBePositive()) {
if (multiplicationOverflows(maxPosA, maxPosB, bits)) {
return a.unrestricted();
*** 1021,1041 ****
@Override
public Constant foldConstant(Constant const1, Constant const2) {
PrimitiveConstant a = (PrimitiveConstant) const1;
PrimitiveConstant b = (PrimitiveConstant) const2;
assert a.getJavaKind() == b.getJavaKind();
return JavaConstant.forIntegerKind(a.getJavaKind(), a.asLong() / b.asLong());
}
@Override
public Stamp foldStamp(Stamp stamp1, Stamp stamp2) {
IntegerStamp a = (IntegerStamp) stamp1;
IntegerStamp b = (IntegerStamp) stamp2;
assert a.getBits() == b.getBits();
! if (b.isStrictlyPositive()) {
! long newLowerBound = a.lowerBound() / b.upperBound();
! long newUpperBound = a.upperBound() / b.lowerBound();
return StampFactory.forInteger(a.getBits(), newLowerBound, newUpperBound);
} else {
return a.unrestricted();
}
}
--- 1036,1062 ----
@Override
public Constant foldConstant(Constant const1, Constant const2) {
PrimitiveConstant a = (PrimitiveConstant) const1;
PrimitiveConstant b = (PrimitiveConstant) const2;
assert a.getJavaKind() == b.getJavaKind();
+ if (b.asLong() == 0) {
+ return null;
+ }
return JavaConstant.forIntegerKind(a.getJavaKind(), a.asLong() / b.asLong());
}
@Override
public Stamp foldStamp(Stamp stamp1, Stamp stamp2) {
IntegerStamp a = (IntegerStamp) stamp1;
IntegerStamp b = (IntegerStamp) stamp2;
assert a.getBits() == b.getBits();
! if (a.lowerBound == a.upperBound && b.lowerBound == b.upperBound && b.lowerBound != 0) {
! long value = CodeUtil.convert(a.lowerBound() / b.lowerBound(), a.getBits(), false);
! return StampFactory.forInteger(a.getBits(), value, value);
! } else if (b.isStrictlyPositive()) {
! long newLowerBound = a.lowerBound() < 0 ? a.lowerBound() / b.lowerBound() : a.lowerBound() / b.upperBound();
! long newUpperBound = a.upperBound() < 0 ? a.upperBound() / b.upperBound() : a.upperBound() / b.lowerBound();
return StampFactory.forInteger(a.getBits(), newLowerBound, newUpperBound);
} else {
return a.unrestricted();
}
}
*** 1052,1069 ****
--- 1073,1099 ----
@Override
public Constant foldConstant(Constant const1, Constant const2) {
PrimitiveConstant a = (PrimitiveConstant) const1;
PrimitiveConstant b = (PrimitiveConstant) const2;
assert a.getJavaKind() == b.getJavaKind();
+ if (b.asLong() == 0) {
+ return null;
+ }
return JavaConstant.forIntegerKind(a.getJavaKind(), a.asLong() % b.asLong());
}
@Override
public Stamp foldStamp(Stamp stamp1, Stamp stamp2) {
IntegerStamp a = (IntegerStamp) stamp1;
IntegerStamp b = (IntegerStamp) stamp2;
assert a.getBits() == b.getBits();
+
+ if (a.lowerBound == a.upperBound && b.lowerBound == b.upperBound && b.lowerBound != 0) {
+ long value = CodeUtil.convert(a.lowerBound() % b.lowerBound(), a.getBits(), false);
+ return StampFactory.forInteger(a.getBits(), value, value);
+ }
+
// zero is always possible
long newLowerBound = Math.min(a.lowerBound(), 0);
long newUpperBound = Math.max(a.upperBound(), 0);
/* the maximum absolute value of the result, derived from b */
*** 1362,1371 ****
--- 1392,1405 ----
@Override
public Stamp foldStamp(Stamp input) {
IntegerStamp stamp = (IntegerStamp) input;
int bits = stamp.getBits();
+ if (stamp.lowerBound == stamp.upperBound) {
+ long value = CodeUtil.convert(Math.abs(stamp.lowerBound()), stamp.getBits(), false);
+ return StampFactory.forInteger(stamp.getBits(), value, value);
+ }
if (stamp.lowerBound() == CodeUtil.minValue(bits)) {
return input.unrestricted();
} else {
long limit = Math.max(-stamp.lowerBound(), stamp.upperBound());
return StampFactory.forInteger(bits, 0, limit);
< prev index next >