< 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 >