changeset 11726:3e4482a06170

Exit loops for deopts that miss loop exits in DeoptimizationGroupingPhase
author Gilles Duboscq <duboscq@ssw.jku.at>
date Thu, 19 Sep 2013 13:30:07 +0200
parents 45570e4fe8a9
children fdd2cdeb933c
files graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DeoptimizationGroupingPhase.java
diffstat 1 files changed, 16 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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<DeoptimizeNode> 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;
+        }
+    }
 }