Mercurial > hg > graal-jvmci-8
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);