changeset 11673:1c5bc8307c76

Merge.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Mon, 16 Sep 2013 20:37:44 +0200
parents 25de2c04c956 (current diff) 2b2de196d8f9 (diff)
children 8505bcff4bdc
files graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java
diffstat 3 files changed, 33 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java	Mon Sep 16 20:37:25 2013 +0200
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java	Mon Sep 16 20:37:44 2013 +0200
@@ -147,6 +147,7 @@
     private int[] iterableIds;
 
     private static final DebugMetric ITERABLE_NODE_TYPES = Debug.metric("IterableNodeTypes");
+    private final DebugMetric nodeIterableCount;
 
     private NodeClass(Class<?> clazz) {
         super(clazz);
@@ -215,6 +216,7 @@
         }
 
         isLeafNode = (this.inputOffsets.length == 0 && this.successorOffsets.length == 0);
+        nodeIterableCount = Debug.metric("NodeIterable_" + shortName);
     }
 
     @Override
@@ -242,6 +244,7 @@
     }
 
     public int[] iterableIds() {
+        nodeIterableCount.increment();
         return iterableIds;
     }
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/SafepointNode.java	Mon Sep 16 20:37:25 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/SafepointNode.java	Mon Sep 16 20:37:44 2013 +0200
@@ -23,14 +23,13 @@
 package com.oracle.graal.nodes;
 
 import com.oracle.graal.api.meta.*;
-import com.oracle.graal.graph.*;
 import com.oracle.graal.nodes.spi.*;
 import com.oracle.graal.nodes.type.*;
 
 /**
  * Marks a position in the graph where a safepoint should be emitted.
  */
-public class SafepointNode extends DeoptimizingFixedWithNextNode implements LIRLowerable, IterableNodeType {
+public class SafepointNode extends DeoptimizingFixedWithNextNode implements LIRLowerable {
 
     public SafepointNode() {
         this(StampFactory.forVoid());
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/SafepointInsertionPhase.java	Mon Sep 16 20:37:25 2013 +0200
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/SafepointInsertionPhase.java	Mon Sep 16 20:37:44 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);
+        }
+    }
 }