# HG changeset patch # User Doug Simon # Date 1335209268 -7200 # Node ID 1767613f8a4a332edb45bc8ce34e5211dcb3d0a4 # Parent d0877209410da7e7b0cf92b06d011be91c95a708 fixed regression: loop safepoints cannot be placed inside snippets diff -r d0877209410d -r 1767613f8a4a graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LoopSafepointInsertionPhase.java --- 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 it = NodeIterators.dominators(loopEnd).until(loopEnd.loopBegin()); diff -r d0877209410d -r 1767613f8a4a 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 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); diff -r d0877209410d -r 1767613f8a4a graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/SafepointNode.java --- 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; - } } diff -r d0877209410d -r 1767613f8a4a graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/Snippets.java --- 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);