32 import org.graalvm.compiler.nodes.StructuredGraph;
33 import org.graalvm.compiler.nodes.ValueNode;
34 import org.graalvm.compiler.nodes.calc.BinaryArithmeticNode;
35 import org.graalvm.compiler.nodes.calc.IntegerDivRemNode;
36 import org.graalvm.compiler.nodes.calc.IntegerMulHighNode;
37 import org.graalvm.compiler.nodes.calc.MulNode;
38 import org.graalvm.compiler.nodes.calc.NarrowNode;
39 import org.graalvm.compiler.nodes.calc.RightShiftNode;
40 import org.graalvm.compiler.nodes.calc.SignExtendNode;
41 import org.graalvm.compiler.nodes.calc.SignedDivNode;
42 import org.graalvm.compiler.nodes.calc.SignedRemNode;
43 import org.graalvm.compiler.nodes.calc.UnsignedRightShiftNode;
44 import org.graalvm.compiler.phases.Phase;
45
46 import jdk.vm.ci.code.CodeUtil;
47
48 public class OptimizeDivPhase extends Phase {
49
50 @Override
51 protected void run(StructuredGraph graph) {
52 for (IntegerDivRemNode rem : graph.getNodes().filter(IntegerDivRemNode.class)) {
53 if (rem instanceof SignedRemNode && divByNonZeroConstant(rem)) {
54 optimizeRem(rem);
55 }
56 }
57 for (IntegerDivRemNode div : graph.getNodes().filter(IntegerDivRemNode.class)) {
58 if (div instanceof SignedDivNode && divByNonZeroConstant(div)) {
59 optimizeSignedDiv((SignedDivNode) div);
60 }
61 }
62 }
63
64 @Override
65 public float codeSizeIncrease() {
66 return 5.0f;
67 }
68
69 protected static boolean divByNonZeroConstant(IntegerDivRemNode divRemNode) {
70 return divRemNode.getY().isConstant() && divRemNode.getY().asJavaConstant().asLong() != 0;
71 }
72
73 protected final void optimizeRem(IntegerDivRemNode rem) {
74 assert rem.getOp() == IntegerDivRemNode.Op.REM;
75 // Java spec 15.17.3.: (a/b)*b+(a%b) == a
76 // so a%b == a-(a/b)*b
77 StructuredGraph graph = rem.graph();
|
32 import org.graalvm.compiler.nodes.StructuredGraph;
33 import org.graalvm.compiler.nodes.ValueNode;
34 import org.graalvm.compiler.nodes.calc.BinaryArithmeticNode;
35 import org.graalvm.compiler.nodes.calc.IntegerDivRemNode;
36 import org.graalvm.compiler.nodes.calc.IntegerMulHighNode;
37 import org.graalvm.compiler.nodes.calc.MulNode;
38 import org.graalvm.compiler.nodes.calc.NarrowNode;
39 import org.graalvm.compiler.nodes.calc.RightShiftNode;
40 import org.graalvm.compiler.nodes.calc.SignExtendNode;
41 import org.graalvm.compiler.nodes.calc.SignedDivNode;
42 import org.graalvm.compiler.nodes.calc.SignedRemNode;
43 import org.graalvm.compiler.nodes.calc.UnsignedRightShiftNode;
44 import org.graalvm.compiler.phases.Phase;
45
46 import jdk.vm.ci.code.CodeUtil;
47
48 public class OptimizeDivPhase extends Phase {
49
50 @Override
51 protected void run(StructuredGraph graph) {
52 for (IntegerDivRemNode rem : graph.getNodes(IntegerDivRemNode.TYPE)) {
53 if (rem instanceof SignedRemNode && divByNonZeroConstant(rem)) {
54 optimizeRem(rem);
55 }
56 }
57 for (IntegerDivRemNode div : graph.getNodes(IntegerDivRemNode.TYPE)) {
58 if (div instanceof SignedDivNode && divByNonZeroConstant(div)) {
59 optimizeSignedDiv((SignedDivNode) div);
60 }
61 }
62 }
63
64 @Override
65 public float codeSizeIncrease() {
66 return 5.0f;
67 }
68
69 protected static boolean divByNonZeroConstant(IntegerDivRemNode divRemNode) {
70 return divRemNode.getY().isConstant() && divRemNode.getY().asJavaConstant().asLong() != 0;
71 }
72
73 protected final void optimizeRem(IntegerDivRemNode rem) {
74 assert rem.getOp() == IntegerDivRemNode.Op.REM;
75 // Java spec 15.17.3.: (a/b)*b+(a%b) == a
76 // so a%b == a-(a/b)*b
77 StructuredGraph graph = rem.graph();
|