< prev index next >
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/calc/SignedRemNode.java
Print this page
*** 58,73 ****
long y = forY.asJavaConstant().asLong();
if (y == 0) {
return this; // this will trap, can not canonicalize
}
return ConstantNode.forIntegerStamp(stamp(), forX.asJavaConstant().asLong() % y);
! } else if (forY.isConstant()) {
! long c = forY.asJavaConstant().asLong();
! if (c == 1 || c == -1) {
return ConstantNode.forIntegerStamp(stamp(), 0);
! } else if (c > 0 && CodeUtil.isPowerOf2(c) && forX.stamp() instanceof IntegerStamp && ((IntegerStamp) forX.stamp()).isPositive()) {
! return new AndNode(forX, ConstantNode.forIntegerStamp(stamp(), c - 1));
}
}
return this;
}
--- 58,87 ----
long y = forY.asJavaConstant().asLong();
if (y == 0) {
return this; // this will trap, can not canonicalize
}
return ConstantNode.forIntegerStamp(stamp(), forX.asJavaConstant().asLong() % y);
! } else if (forY.isConstant() && forX.stamp() instanceof IntegerStamp && forY.stamp() instanceof IntegerStamp) {
! long constY = forY.asJavaConstant().asLong();
! IntegerStamp xStamp = (IntegerStamp) forX.stamp();
! IntegerStamp yStamp = (IntegerStamp) forY.stamp();
! if (constY < 0 && constY != CodeUtil.minValue(yStamp.getBits())) {
! return new SignedRemNode(forX, ConstantNode.forIntegerStamp(yStamp, -constY)).canonical(tool);
! }
!
! if (constY == 1) {
return ConstantNode.forIntegerStamp(stamp(), 0);
! } else if (CodeUtil.isPowerOf2(constY)) {
! if (xStamp.isPositive()) {
! return new AndNode(forX, ConstantNode.forIntegerStamp(stamp(), constY - 1));
! } else if (xStamp.isNegative()) {
! return new NegateNode(new AndNode(new NegateNode(forX), ConstantNode.forIntegerStamp(stamp(), constY - 1)));
! } else {
! return new ConditionalNode(IntegerLessThanNode.create(forX, ConstantNode.forIntegerStamp(forX.stamp(), 0)),
! new NegateNode(new AndNode(new NegateNode(forX), ConstantNode.forIntegerStamp(stamp(), constY - 1))),
! new AndNode(forX, ConstantNode.forIntegerStamp(stamp(), constY - 1)));
! }
}
}
return this;
}
< prev index next >