src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/BranchProbabilityNode.java
changeset 57537 ecc6e394475f
parent 52910 583fd71c47d6
child 58299 6df94ce3ab2f
equal deleted inserted replaced
57536:67cce1b84a9a 57537:ecc6e394475f
    30 import jdk.vm.ci.meta.JavaKind;
    30 import jdk.vm.ci.meta.JavaKind;
    31 import org.graalvm.compiler.core.common.calc.CanonicalCondition;
    31 import org.graalvm.compiler.core.common.calc.CanonicalCondition;
    32 import org.graalvm.compiler.core.common.type.IntegerStamp;
    32 import org.graalvm.compiler.core.common.type.IntegerStamp;
    33 import org.graalvm.compiler.core.common.type.StampFactory;
    33 import org.graalvm.compiler.core.common.type.StampFactory;
    34 import org.graalvm.compiler.debug.GraalError;
    34 import org.graalvm.compiler.debug.GraalError;
       
    35 import org.graalvm.compiler.graph.Node;
    35 import org.graalvm.compiler.graph.NodeClass;
    36 import org.graalvm.compiler.graph.NodeClass;
    36 import org.graalvm.compiler.graph.iterators.NodePredicates;
    37 import org.graalvm.compiler.graph.iterators.NodePredicates;
       
    38 import org.graalvm.compiler.graph.spi.Canonicalizable;
       
    39 import org.graalvm.compiler.graph.spi.CanonicalizerTool;
    37 import org.graalvm.compiler.graph.spi.Simplifiable;
    40 import org.graalvm.compiler.graph.spi.Simplifiable;
    38 import org.graalvm.compiler.graph.spi.SimplifierTool;
    41 import org.graalvm.compiler.graph.spi.SimplifierTool;
    39 import org.graalvm.compiler.nodeinfo.NodeInfo;
    42 import org.graalvm.compiler.nodeinfo.NodeInfo;
    40 import org.graalvm.compiler.nodes.FixedGuardNode;
    43 import org.graalvm.compiler.nodes.FixedGuardNode;
    41 import org.graalvm.compiler.nodes.IfNode;
    44 import org.graalvm.compiler.nodes.IfNode;
    54  * Instances of this node class will look for a preceding if node and put the given probability into
    57  * Instances of this node class will look for a preceding if node and put the given probability into
    55  * the if node's taken probability. Then the branch probability node will be removed. This node is
    58  * the if node's taken probability. Then the branch probability node will be removed. This node is
    56  * intended primarily for snippets, so that they can define their fast and slow paths.
    59  * intended primarily for snippets, so that they can define their fast and slow paths.
    57  */
    60  */
    58 @NodeInfo(cycles = CYCLES_0, cyclesRationale = "Artificial Node", size = SIZE_0)
    61 @NodeInfo(cycles = CYCLES_0, cyclesRationale = "Artificial Node", size = SIZE_0)
    59 public final class BranchProbabilityNode extends FloatingNode implements Simplifiable, Lowerable {
    62 public final class BranchProbabilityNode extends FloatingNode implements Simplifiable, Lowerable, Canonicalizable {
    60 
    63 
    61     public static final NodeClass<BranchProbabilityNode> TYPE = NodeClass.create(BranchProbabilityNode.class);
    64     public static final NodeClass<BranchProbabilityNode> TYPE = NodeClass.create(BranchProbabilityNode.class);
    62     public static final double LIKELY_PROBABILITY = 0.6;
    65     public static final double LIKELY_PROBABILITY = 0.6;
    63     public static final double NOT_LIKELY_PROBABILITY = 1 - LIKELY_PROBABILITY;
    66     public static final double NOT_LIKELY_PROBABILITY = 1 - LIKELY_PROBABILITY;
    64 
    67 
    93         return probability;
    96         return probability;
    94     }
    97     }
    95 
    98 
    96     public ValueNode getCondition() {
    99     public ValueNode getCondition() {
    97         return condition;
   100         return condition;
       
   101     }
       
   102 
       
   103     @Override
       
   104     public Node canonical(CanonicalizerTool tool) {
       
   105         if (condition.isConstant()) {
       
   106             // fold constant conditions early during PE
       
   107             return condition;
       
   108         }
       
   109         return this;
    98     }
   110     }
    99 
   111 
   100     @Override
   112     @Override
   101     public void simplify(SimplifierTool tool) {
   113     public void simplify(SimplifierTool tool) {
   102         if (!hasUsages()) {
   114         if (!hasUsages()) {