changeset 11665:2b2de196d8f9

fixed SafepointInsertionPhase to add safepoints for return nodes (if necessary)
author Doug Simon <doug.simon@oracle.com>
date Mon, 16 Sep 2013 19:16:32 +0200
parents 775e139362d8
children 1c5bc8307c76
files graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/SafepointInsertionPhase.java
diffstat 1 files changed, 29 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/SafepointInsertionPhase.java	Mon Sep 16 19:15:52 2013 +0200
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/SafepointInsertionPhase.java	Mon Sep 16 19:16:32 2013 +0200
@@ -24,8 +24,10 @@
 
 import static com.oracle.graal.phases.GraalOptions.*;
 
+import java.util.*;
+
+import com.oracle.graal.graph.*;
 import com.oracle.graal.nodes.*;
-import com.oracle.graal.nodes.java.*;
 import com.oracle.graal.phases.*;
 
 /**
@@ -35,23 +37,41 @@
 
     @Override
     protected void run(StructuredGraph graph) {
-        if (GenLoopSafepoints.getValue()) {
+        final boolean addLoopSafepoints = GenLoopSafepoints.getValue();
+        if (addLoopSafepoints && !GenSafepoints.getValue()) {
+            // Use (faster) typed node iteration if we are not adding return safepoints
             for (LoopEndNode loopEndNode : graph.getNodes(LoopEndNode.class)) {
-                if (!loopEndNode.canSafepoint()) {
-                    continue;
-                }
-                SafepointNode safepointNode = graph.add(new SafepointNode());
-                graph.addBeforeFixed(loopEndNode, safepointNode);
+                addLoopSafepoint(graph, loopEndNode);
             }
         }
 
         if (GenSafepoints.getValue()) {
-            if (!OptEliminateSafepoints.getValue() || graph.getNodes(MethodCallTargetNode.class).isNotEmpty()) {
-                for (ReturnNode returnNode : graph.getNodes().filter(ReturnNode.class)) {
+            List<ReturnNode> returnNodes = new ArrayList<>();
+            boolean addReturnSafepoints = !OptEliminateSafepoints.getValue();
+            for (Node n : graph.getNodes()) {
+                if (addLoopSafepoints && n instanceof LoopEndNode) {
+                    addLoopSafepoint(graph, (LoopEndNode) n);
+                } else if (n instanceof ReturnNode) {
+                    returnNodes.add((ReturnNode) n);
+                } else {
+                    if (!addReturnSafepoints && n instanceof LoweredCallTargetNode) {
+                        addReturnSafepoints = true;
+                    }
+                }
+            }
+            if (addReturnSafepoints) {
+                for (ReturnNode returnNode : returnNodes) {
                     SafepointNode safepoint = graph.add(new SafepointNode());
                     graph.addBeforeFixed(returnNode, safepoint);
                 }
             }
         }
     }
+
+    private static void addLoopSafepoint(StructuredGraph graph, LoopEndNode loopEndNode) {
+        if (loopEndNode.canSafepoint()) {
+            SafepointNode safepointNode = graph.add(new SafepointNode());
+            graph.addBeforeFixed(loopEndNode, safepointNode);
+        }
+    }
 }