src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopEx.java
changeset 48861 47f19ff9903c
parent 48190 25cfedf27edc
child 49873 26ebfe8ce852
equal deleted inserted replaced
48860:5bce1b7e7800 48861:47f19ff9903c
    20  * or visit www.oracle.com if you need additional information or have any
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    21  * questions.
    22  */
    22  */
    23 package org.graalvm.compiler.loop;
    23 package org.graalvm.compiler.loop;
    24 
    24 
    25 import jdk.vm.ci.code.BytecodeFrame;
    25 import java.util.Collection;
       
    26 import java.util.LinkedList;
       
    27 import java.util.Queue;
       
    28 
       
    29 import org.graalvm.collections.EconomicMap;
       
    30 import org.graalvm.collections.EconomicSet;
       
    31 import org.graalvm.collections.Equivalence;
    26 import org.graalvm.compiler.core.common.calc.Condition;
    32 import org.graalvm.compiler.core.common.calc.Condition;
    27 import org.graalvm.compiler.core.common.cfg.Loop;
    33 import org.graalvm.compiler.core.common.cfg.Loop;
    28 import org.graalvm.compiler.core.common.type.IntegerStamp;
    34 import org.graalvm.compiler.core.common.type.IntegerStamp;
    29 import org.graalvm.compiler.debug.DebugContext;
    35 import org.graalvm.compiler.debug.DebugContext;
    30 import org.graalvm.compiler.debug.GraalError;
    36 import org.graalvm.compiler.debug.GraalError;
    65 import org.graalvm.compiler.nodes.cfg.Block;
    71 import org.graalvm.compiler.nodes.cfg.Block;
    66 import org.graalvm.compiler.nodes.cfg.ControlFlowGraph;
    72 import org.graalvm.compiler.nodes.cfg.ControlFlowGraph;
    67 import org.graalvm.compiler.nodes.debug.ControlFlowAnchored;
    73 import org.graalvm.compiler.nodes.debug.ControlFlowAnchored;
    68 import org.graalvm.compiler.nodes.extended.ValueAnchorNode;
    74 import org.graalvm.compiler.nodes.extended.ValueAnchorNode;
    69 import org.graalvm.compiler.nodes.util.GraphUtil;
    75 import org.graalvm.compiler.nodes.util.GraphUtil;
    70 import org.graalvm.util.EconomicMap;
    76 
    71 import org.graalvm.util.EconomicSet;
    77 import jdk.vm.ci.code.BytecodeFrame;
    72 import org.graalvm.util.Equivalence;
       
    73 
       
    74 import java.util.Collection;
       
    75 import java.util.LinkedList;
       
    76 import java.util.Queue;
       
    77 
    78 
    78 public class LoopEx {
    79 public class LoopEx {
    79     private final Loop<Block> loop;
    80     private final Loop<Block> loop;
    80     private LoopFragmentInside inside;
    81     private LoopFragmentInside inside;
    81     private LoopFragmentWhole whole;
    82     private LoopFragmentWhole whole;
   234             InductionVariable iv = null;
   235             InductionVariable iv = null;
   235             ValueNode limit = null;
   236             ValueNode limit = null;
   236             if (isOutsideLoop(lessThan.getX())) {
   237             if (isOutsideLoop(lessThan.getX())) {
   237                 iv = getInductionVariables().get(lessThan.getY());
   238                 iv = getInductionVariables().get(lessThan.getY());
   238                 if (iv != null) {
   239                 if (iv != null) {
   239                     condition = lessThan.condition().mirror();
   240                     condition = lessThan.condition().asCondition().mirror();
   240                     limit = lessThan.getX();
   241                     limit = lessThan.getX();
   241                 }
   242                 }
   242             } else if (isOutsideLoop(lessThan.getY())) {
   243             } else if (isOutsideLoop(lessThan.getY())) {
   243                 iv = getInductionVariables().get(lessThan.getX());
   244                 iv = getInductionVariables().get(lessThan.getX());
   244                 if (iv != null) {
   245                 if (iv != null) {
   245                     condition = lessThan.condition();
   246                     condition = lessThan.condition().asCondition();
   246                     limit = lessThan.getY();
   247                     limit = lessThan.getY();
   247                 }
   248                 }
   248             }
   249             }
   249             if (condition == null) {
   250             if (condition == null) {
   250                 return false;
   251                 return false;
   391                 } else if ((scale = mul(loop, op, baseIvNode)) != null) {
   392                 } else if ((scale = mul(loop, op, baseIvNode)) != null) {
   392                     iv = new DerivedScaledInductionVariable(loop, baseIv, scale, op);
   393                     iv = new DerivedScaledInductionVariable(loop, baseIv, scale, op);
   393                 } else {
   394                 } else {
   394                     boolean isValidConvert = op instanceof PiNode || op instanceof SignExtendNode;
   395                     boolean isValidConvert = op instanceof PiNode || op instanceof SignExtendNode;
   395                     if (!isValidConvert && op instanceof ZeroExtendNode) {
   396                     if (!isValidConvert && op instanceof ZeroExtendNode) {
   396                         IntegerStamp inputStamp = (IntegerStamp) ((ZeroExtendNode) op).getValue().stamp(NodeView.DEFAULT);
   397                         ZeroExtendNode zeroExtendNode = (ZeroExtendNode) op;
   397                         isValidConvert = inputStamp.isPositive();
   398                         isValidConvert = zeroExtendNode.isInputAlwaysPositive() || ((IntegerStamp) zeroExtendNode.stamp(NodeView.DEFAULT)).isPositive();
   398                     }
   399                     }
   399 
   400 
   400                     if (isValidConvert) {
   401                     if (isValidConvert) {
   401                         iv = new DerivedConvertedInductionVariable(loop, baseIv, op.stamp(NodeView.DEFAULT), op);
   402                         iv = new DerivedConvertedInductionVariable(loop, baseIv, op.stamp(NodeView.DEFAULT), op);
   402                     }
   403                     }