# HG changeset patch # User Gilles Duboscq # Date 1379590207 -7200 # Node ID 3e4482a06170b150736d7dda623de37c187dbc8c # Parent 45570e4fe8a9353638c7e57d26d3ae4e258502cb Exit loops for deopts that miss loop exits in DeoptimizationGroupingPhase diff -r 45570e4fe8a9 -r 3e4482a06170 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DeoptimizationGroupingPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DeoptimizationGroupingPhase.java Thu Sep 19 12:14:56 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DeoptimizationGroupingPhase.java Thu Sep 19 13:30:07 2013 +0200 @@ -25,6 +25,7 @@ import java.util.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.cfg.*; import com.oracle.graal.phases.*; /** @@ -35,6 +36,7 @@ @Override protected void run(StructuredGraph graph) { + ControlFlowGraph cfg = null; for (FrameState fs : graph.getNodes(FrameState.class)) { FixedNode target = null; List obsoletes = null; @@ -42,12 +44,16 @@ if (target == null) { target = deopt; } else { + if (cfg == null) { + cfg = ControlFlowGraph.compute(graph, true, true, false, false); + } MergeNode merge; if (target instanceof DeoptimizeNode) { merge = graph.add(new MergeNode()); EndNode firstEnd = graph.add(new EndNode()); merge.addForwardEnd(firstEnd); target.predecessor().replaceFirstSuccessor(target, firstEnd); + exitLoops((DeoptimizeNode) target, firstEnd, cfg); merge.setNext(target); obsoletes = new LinkedList<>(); target = merge; @@ -57,6 +63,7 @@ EndNode newEnd = graph.add(new EndNode()); merge.addForwardEnd(newEnd); deopt.predecessor().replaceFirstSuccessor(deopt, newEnd); + exitLoops(deopt, newEnd, cfg); obsoletes.add(deopt); } } @@ -67,4 +74,13 @@ } } } + + private static void exitLoops(DeoptimizeNode deopt, EndNode end, ControlFlowGraph cfg) { + Block block = cfg.blockFor(deopt); + Loop loop = block.getLoop(); + while (loop != null) { + end.graph().addBeforeFixed(end, end.graph().add(new LoopExitNode(loop.loopBegin()))); + loop = loop.parent; + } + } }