--- old/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopEx.java 2019-03-12 08:09:39.703599920 +0100 +++ new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/LoopEx.java 2019-03-12 08:09:39.339597558 +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 loop; private LoopFragmentInside inside; @@ -85,6 +83,7 @@ private CountedLoopInfo counted; private LoopsData data; private EconomicMap ivs; + private boolean countedLoopChecked; LoopEx(Loop 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; } }