changeset 22824:7efb735091c5

Store complete canSafepoint status in LoopEndNode, propagate value from LoopBeginNode eagerly
author Christian Wimmer <christian.wimmer@oracle.com>
date Wed, 14 Oct 2015 15:18:44 -0700
parents ea1f44a4c0c9
children c7753ef3467e
files 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 2 files changed, 8 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java	Wed Oct 14 14:25:43 2015 -0700
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java	Wed Oct 14 15:18:44 2015 -0700
@@ -61,7 +61,12 @@
 
     /** Disables safepoint for the whole loop, i.e., for all {@link LoopEndNode loop ends}. */
     public void disableSafepoint() {
+        /* Store flag locally in case new loop ends are created later on. */
         this.canSafepoint = false;
+        /* Propagate flag to all existing loop ends. */
+        for (LoopEndNode loopEnd : loopEnds()) {
+            loopEnd.disableSafepoint();
+        }
     }
 
     public double loopFrequency() {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopEndNode.java	Wed Oct 14 14:25:43 2015 -0700
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopEndNode.java	Wed Oct 14 15:18:44 2015 -0700
@@ -48,7 +48,7 @@
         assert idx >= 0;
         this.endIndex = idx;
         this.loopBegin = begin;
-        this.canSafepoint = true;
+        this.canSafepoint = begin.canSafepoint;
     }
 
     @Override
@@ -74,7 +74,8 @@
     }
 
     public boolean canSafepoint() {
-        return canSafepoint && loopBegin.canSafepoint;
+        assert !canSafepoint || loopBegin.canSafepoint : "When safepoints are disabled for loop begin, safepoints must be disabled for all loop ends";
+        return canSafepoint;
     }
 
     @Override