changeset 5095:57ae0b1cc74a

Fix possible endless recursion in ConvertDeoptimizeToGuardPhase.
author Andreas Woess <andreas.woess@jku.at>
date Fri, 16 Mar 2012 19:23:43 +0100
parents d3f547b08304
children 56a53c80ad2b
files graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/ConvertDeoptimizeToGuardPhase.java
diffstat 1 files changed, 11 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/ConvertDeoptimizeToGuardPhase.java	Fri Mar 16 20:23:29 2012 +0100
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/ConvertDeoptimizeToGuardPhase.java	Fri Mar 16 19:23:43 2012 +0100
@@ -49,25 +49,30 @@
         }
 
         for (DeoptimizeNode d : graph.getNodes(DeoptimizeNode.class)) {
-            visitDeoptBranch(findBeginNode(d), d, graph);
+            visitDeoptBegin(findBeginNode(d), d, graph);
         }
 
         new DeadCodeEliminationPhase().apply(graph);
     }
 
-    private void visitDeoptBranch(BeginNode deoptBegin, DeoptimizeNode deopt, StructuredGraph graph) {
+    private void visitDeoptBegin(BeginNode deoptBegin, DeoptimizeNode deopt, StructuredGraph graph) {
         if (deoptBegin instanceof MergeNode) {
             MergeNode mergeNode = (MergeNode) deoptBegin;
-            Debug.log("Eliminating %s followed by %s", mergeNode, deopt);
+            Debug.log("Visiting %s followed by %s", mergeNode, deopt);
             List<EndNode> ends = mergeNode.forwardEnds().snapshot();
             for (EndNode end : ends) {
                 if (!end.isDeleted()) {
                     BeginNode beginNode = findBeginNode(end);
-                    visitDeoptBranch(beginNode, deopt, graph);
+                    if (!(beginNode instanceof MergeNode)) {
+                        visitDeoptBegin(beginNode, deopt, graph);
+                    }
                 }
             }
-            if (!deopt.isDeleted()) {
-                visitDeoptBranch(findBeginNode(deopt), deopt, graph);
+            if (mergeNode.isDeleted()) {
+                if (!deopt.isDeleted()) {
+                    Debug.log("Merge deleted, deopt moved to %s", findBeginNode(deopt));
+                    visitDeoptBegin(findBeginNode(deopt), deopt, graph);
+                }
             }
         } else if (deoptBegin.predecessor() instanceof IfNode) {
             IfNode ifNode = (IfNode) deoptBegin.predecessor();