changeset 22822:209d958f3b9d

Allow subclasses of BytecodeParser to disable loop safepoint checks; store flag in LoopBeginNode to avoid problems when control flow optimizations introduce a new LoopEndNode
author Christian Wimmer <christian.wimmer@oracle.com>
date Wed, 14 Oct 2015 13:53:46 -0700
parents 2f752d0432d2
children ea1f44a4c0c9
files graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/deopt/MonitorDeoptTest.java graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeParser.java graal/com.oracle.graal.loop/src/com/oracle/graal/loop/phases/LoopSafepointEliminationPhase.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopEndNode.java
diffstat 5 files changed, 23 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/deopt/MonitorDeoptTest.java	Wed Oct 14 13:52:03 2015 -0700
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/deopt/MonitorDeoptTest.java	Wed Oct 14 13:53:46 2015 -0700
@@ -36,7 +36,6 @@
 import com.oracle.graal.nodes.FixedNode;
 import com.oracle.graal.nodes.FixedWithNextNode;
 import com.oracle.graal.nodes.LoopBeginNode;
-import com.oracle.graal.nodes.LoopEndNode;
 import com.oracle.graal.nodes.StructuredGraph;
 import com.oracle.graal.nodes.StructuredGraph.AllowAssumptions;
 
@@ -134,9 +133,7 @@
      */
     private static void removeLoopSafepoint(StructuredGraph graph) {
         LoopBeginNode loopBegin = findFirstLoop(graph);
-        for (LoopEndNode end : loopBegin.loopEnds()) {
-            end.disableSafepoint();
-        }
+        loopBegin.disableSafepoint();
     }
 
     @Test
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeParser.java	Wed Oct 14 13:52:03 2015 -0700
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeParser.java	Wed Oct 14 13:53:46 2015 -0700
@@ -928,9 +928,6 @@
                         }
                         LoopBeginNode loopBegin = (LoopBeginNode) ((EndNode) merge.next()).merge();
                         LoopEndNode loopEnd = graph.add(new LoopEndNode(loopBegin));
-                        if (parsingIntrinsic()) {
-                            loopEnd.disableSafepoint();
-                        }
                         endNode.replaceAndDelete(loopEnd);
                     } else if (visited.contains(n)) {
                         // Normal merge into a branch we are already exploring.
@@ -2309,9 +2306,6 @@
              */
             LoopBeginNode loopBegin = (LoopBeginNode) getFirstInstruction(block, operatingDimension);
             LoopEndNode loopEnd = graph.add(new LoopEndNode(loopBegin));
-            if (parsingIntrinsic()) {
-                loopEnd.disableSafepoint();
-            }
             Target target = checkLoopExit(loopEnd, block, state);
             FixedNode result = target.fixed;
             getEntryState(block, operatingDimension).merge(loopBegin, target.state);
@@ -2700,9 +2694,17 @@
         return true;
     }
 
+    /* Also a hook for subclasses. */
+    protected boolean disableLoopSafepoint() {
+        return parsingIntrinsic();
+    }
+
     private LoopBeginNode appendLoopBegin(FixedWithNextNode fixedWithNext) {
         EndNode preLoopEnd = graph.add(new EndNode());
         LoopBeginNode loopBegin = graph.add(new LoopBeginNode());
+        if (disableLoopSafepoint()) {
+            loopBegin.disableSafepoint();
+        }
         fixedWithNext.setNext(preLoopEnd);
         // Add the single non-loop predecessor of the loop header.
         loopBegin.addForwardEnd(preLoopEnd);
--- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/phases/LoopSafepointEliminationPhase.java	Wed Oct 14 13:52:03 2015 -0700
+++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/phases/LoopSafepointEliminationPhase.java	Wed Oct 14 13:53:46 2015 -0700
@@ -48,9 +48,7 @@
                     }
                     if (hasSafepoint) {
                         loop.counted().createOverFlowGuard();
-                        for (LoopEndNode loopEnd : loop.loopBegin().loopEnds()) {
-                            loopEnd.disableSafepoint();
-                        }
+                        loop.loopBegin().disableSafepoint();
                     }
                 }
             }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java	Wed Oct 14 13:52:03 2015 -0700
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java	Wed Oct 14 13:53:46 2015 -0700
@@ -49,12 +49,19 @@
     protected int nextEndIndex;
     protected int unswitches;
     protected int inversionCount;
+    boolean canSafepoint;
 
     @OptionalInput(InputType.Guard) GuardingNode overflowGuard;
 
     public LoopBeginNode() {
         super(TYPE);
         loopFrequency = 1;
+        this.canSafepoint = true;
+    }
+
+    /** Disables safepoint for the whole loop, i.e., for all {@link LoopEndNode loop ends}. */
+    public void disableSafepoint() {
+        this.canSafepoint = false;
     }
 
     public double loopFrequency() {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopEndNode.java	Wed Oct 14 13:52:03 2015 -0700
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopEndNode.java	Wed Oct 14 13:53:46 2015 -0700
@@ -39,7 +39,7 @@
 
     public static final NodeClass<LoopEndNode> TYPE = NodeClass.create(LoopEndNode.class);
     @Input(InputType.Association) LoopBeginNode loopBegin;
-    protected boolean canSafepoint;
+    private boolean canSafepoint;
     protected int endIndex;
 
     public LoopEndNode(LoopBeginNode begin) {
@@ -65,12 +65,16 @@
         this.loopBegin = x;
     }
 
+    /**
+     * Disables safepoints for only this loop end (in contrast to disabling it for
+     * {@link LoopBeginNode#disableSafepoint() the whole loop}.
+     */
     public void disableSafepoint() {
         this.canSafepoint = false;
     }
 
     public boolean canSafepoint() {
-        return canSafepoint;
+        return canSafepoint && loopBegin.canSafepoint;
     }
 
     @Override