src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopEx.java
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopEx.java Tue Mar 12 12:12:01 2019 -0700
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopEx.java Tue Mar 12 19:17:42 2019 +0100
@@ -76,8 +76,6 @@
import org.graalvm.compiler.nodes.extended.ValueAnchorNode;
import org.graalvm.compiler.nodes.util.GraphUtil;
-import jdk.vm.ci.code.BytecodeFrame;
-
public class LoopEx {
private final Loop<Block> loop;
private LoopFragmentInside inside;
@@ -85,6 +83,7 @@
private CountedLoopInfo counted;
private LoopsData data;
private EconomicMap<Node, InductionVariable> ivs;
+ private boolean countedLoopChecked;
LoopEx(Loop<Block> loop, LoopsData data) {
this.loop = loop;
@@ -143,10 +142,12 @@
}
public boolean isCounted() {
+ assert countedLoopChecked;
return counted != null;
}
public CountedLoopInfo counted() {
+ assert countedLoopChecked;
return counted;
}
@@ -211,6 +212,10 @@
}
public boolean detectCounted() {
+ if (countedLoopChecked) {
+ return isCounted();
+ }
+ countedLoopChecked = true;
LoopBeginNode loopBegin = loopBegin();
FixedNode next = loopBegin.next();
while (next instanceof FixedGuardNode || next instanceof ValueAnchorNode || next instanceof FullInfopointNode) {
@@ -219,8 +224,8 @@
if (next instanceof IfNode) {
IfNode ifNode = (IfNode) next;
boolean negated = false;
- if (!loopBegin.isLoopExit(ifNode.falseSuccessor())) {
- if (!loopBegin.isLoopExit(ifNode.trueSuccessor())) {
+ if (!isCfgLoopExit(ifNode.falseSuccessor())) {
+ if (!isCfgLoopExit(ifNode.trueSuccessor())) {
return false;
}
negated = true;
@@ -301,7 +306,7 @@
}
break;
default:
- throw GraalError.shouldNotReachHere();
+ throw GraalError.shouldNotReachHere(condition.toString());
}
counted = new CountedLoopInfo(this, iv, ifNode, limit, oneOff, negated ? ifNode.falseSuccessor() : ifNode.trueSuccessor());
return true;
@@ -309,6 +314,11 @@
return false;
}
+ private boolean isCfgLoopExit(AbstractBeginNode begin) {
+ Block block = data.getCFG().blockFor(begin);
+ return loop.getDepth() > block.getLoopDepth() || loop.isNaturalExit(block);
+ }
+
public LoopsData loopsData() {
return data;
}
@@ -321,7 +331,7 @@
work.add(cfg.blockFor(branch));
while (!work.isEmpty()) {
Block b = work.remove();
- if (loop().getExits().contains(b)) {
+ if (loop().isLoopExit(b)) {
assert !exits.contains(b.getBeginNode());
exits.add(b.getBeginNode());
} else if (blocks.add(b.getBeginNode())) {
@@ -465,7 +475,7 @@
}
if (node instanceof FrameState) {
FrameState frameState = (FrameState) node;
- if (frameState.bci == BytecodeFrame.AFTER_EXCEPTION_BCI || frameState.bci == BytecodeFrame.UNWIND_BCI) {
+ if (frameState.isExceptionHandlingBCI()) {
return false;
}
}