< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/OptimizeDivPhase.java

Print this page
rev 56282 : [mq]: graal


  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();


< prev index next >