src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopEx.java
equal
deleted
inserted
replaced
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 } |