# HG changeset patch # User Christian Wimmer # Date 1444861124 25200 # Node ID 7efb735091c52c96297e1f221f31dbbb5e3c0908 # Parent ea1f44a4c0c9cc77c42031f48cc860964685bfa3 Store complete canSafepoint status in LoopEndNode, propagate value from LoopBeginNode eagerly diff -r ea1f44a4c0c9 -r 7efb735091c5 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java --- 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() { diff -r ea1f44a4c0c9 -r 7efb735091c5 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopEndNode.java --- 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