changeset 5277:1767613f8a4a

fixed regression: loop safepoints cannot be placed inside snippets
author Doug Simon <doug.simon@oracle.com>
date Mon, 23 Apr 2012 21:27:48 +0200
parents d0877209410d
children 74dfa6f86879
files graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LoopSafepointInsertionPhase.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopEndNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/SafepointNode.java graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/Snippets.java
diffstat 4 files changed, 19 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LoopSafepointInsertionPhase.java	Mon Apr 23 15:49:32 2012 +0200
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LoopSafepointInsertionPhase.java	Mon Apr 23 21:27:48 2012 +0200
@@ -36,6 +36,9 @@
     protected void run(StructuredGraph graph) {
         nextLoop:
         for (LoopEndNode loopEnd : graph.getNodes(LoopEndNode.class)) {
+            if (!loopEnd.canSafepoint()) {
+                continue;
+            }
             if (GraalOptions.OptSafepointElimination) {
                 // We 'eliminate' safepoints by simply never placing them into loops that have at least one call
                 NodeIterable<FixedNode> it = NodeIterators.dominators(loopEnd).until(loopEnd.loopBegin());
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopEndNode.java	Mon Apr 23 15:49:32 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopEndNode.java	Mon Apr 23 21:27:48 2012 +0200
@@ -31,6 +31,7 @@
 public final class LoopEndNode extends EndNode {
 
     @Input(notDataflow = true) private LoopBeginNode loopBegin;
+    @Data private boolean canSafepoint;
     @Data private int endIndex;
 
     public LoopEndNode(LoopBeginNode begin) {
@@ -38,6 +39,7 @@
         assert idx >= 0;
         this.endIndex = idx;
         this.loopBegin = begin;
+        this.canSafepoint = true;
     }
 
     @Override
@@ -54,6 +56,18 @@
         this.loopBegin = x;
     }
 
+
+    public void disableSafepoint() {
+        this.canSafepoint = false;
+    }
+
+    public boolean canSafepoint() {
+        if (!canSafepoint) {
+            return canSafepoint;
+        }
+        return canSafepoint;
+    }
+
     @Override
     public void generate(LIRGeneratorTool gen) {
         gen.visitLoopEnd(this);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/SafepointNode.java	Mon Apr 23 15:49:32 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/SafepointNode.java	Mon Apr 23 21:27:48 2012 +0200
@@ -40,14 +40,4 @@
     public void generate(LIRGeneratorTool gen) {
         gen.visitSafepointNode(this);
     }
-
-    /**
-     * Gets the loop end (if any) associated with this safepoint.
-     */
-    public LoopEndNode loopEnd() {
-        if (next() instanceof LoopEndNode) {
-            return (LoopEndNode) next();
-        }
-        return null;
-    }
 }
--- a/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/Snippets.java	Mon Apr 23 15:49:32 2012 +0200
+++ b/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/Snippets.java	Mon Apr 23 21:27:48 2012 +0200
@@ -126,9 +126,8 @@
                     new CanonicalizerPhase(target, runtime, null).apply(graph);
                 }
 
-                // Snippets must have no safepoints
-                for (SafepointNode s : graph.getNodes(SafepointNode.class)) {
-                    graph.removeFixed(s);
+                for (LoopEndNode end : graph.getNodes(LoopEndNode.class)) {
+                    end.disableSafepoint();
                 }
 
                 new InsertStateAfterPlaceholderPhase().apply(graph);