# HG changeset patch # User Doug Simon # Date 1379351792 -7200 # Node ID 2b2de196d8f9a061e99b01def7582f6333ee4319 # Parent 775e139362d8eaa7458cf169f8be453ee4fc329e fixed SafepointInsertionPhase to add safepoints for return nodes (if necessary) diff -r 775e139362d8 -r 2b2de196d8f9 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/SafepointInsertionPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/SafepointInsertionPhase.java Mon Sep 16 19:15:52 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/SafepointInsertionPhase.java Mon Sep 16 19:16:32 2013 +0200 @@ -24,8 +24,10 @@ import static com.oracle.graal.phases.GraalOptions.*; +import java.util.*; + +import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; -import com.oracle.graal.nodes.java.*; import com.oracle.graal.phases.*; /** @@ -35,23 +37,41 @@ @Override protected void run(StructuredGraph graph) { - if (GenLoopSafepoints.getValue()) { + final boolean addLoopSafepoints = GenLoopSafepoints.getValue(); + if (addLoopSafepoints && !GenSafepoints.getValue()) { + // Use (faster) typed node iteration if we are not adding return safepoints for (LoopEndNode loopEndNode : graph.getNodes(LoopEndNode.class)) { - if (!loopEndNode.canSafepoint()) { - continue; - } - SafepointNode safepointNode = graph.add(new SafepointNode()); - graph.addBeforeFixed(loopEndNode, safepointNode); + addLoopSafepoint(graph, loopEndNode); } } if (GenSafepoints.getValue()) { - if (!OptEliminateSafepoints.getValue() || graph.getNodes(MethodCallTargetNode.class).isNotEmpty()) { - for (ReturnNode returnNode : graph.getNodes().filter(ReturnNode.class)) { + List returnNodes = new ArrayList<>(); + boolean addReturnSafepoints = !OptEliminateSafepoints.getValue(); + for (Node n : graph.getNodes()) { + if (addLoopSafepoints && n instanceof LoopEndNode) { + addLoopSafepoint(graph, (LoopEndNode) n); + } else if (n instanceof ReturnNode) { + returnNodes.add((ReturnNode) n); + } else { + if (!addReturnSafepoints && n instanceof LoweredCallTargetNode) { + addReturnSafepoints = true; + } + } + } + if (addReturnSafepoints) { + for (ReturnNode returnNode : returnNodes) { SafepointNode safepoint = graph.add(new SafepointNode()); graph.addBeforeFixed(returnNode, safepoint); } } } } + + private static void addLoopSafepoint(StructuredGraph graph, LoopEndNode loopEndNode) { + if (loopEndNode.canSafepoint()) { + SafepointNode safepointNode = graph.add(new SafepointNode()); + graph.addBeforeFixed(loopEndNode, safepointNode); + } + } }