Mercurial > hg > truffle
changeset 11665:2b2de196d8f9
fixed SafepointInsertionPhase to add safepoints for return nodes (if necessary)
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Mon, 16 Sep 2013 19:16:32 +0200 |
parents | 775e139362d8 |
children | 1c5bc8307c76 |
files | graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/SafepointInsertionPhase.java |
diffstat | 1 files changed, 29 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- 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<ReturnNode> 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); + } + } }