# HG changeset patch # User Thomas Wuerthinger # Date 1379356664 -7200 # Node ID 1c5bc8307c763301d4bdd2e1283746d56907a047 # Parent 25de2c04c956ba0f0d4c14d83bf08c194c4a4709# Parent 2b2de196d8f9a061e99b01def7582f6333ee4319 Merge. diff -r 25de2c04c956 -r 1c5bc8307c76 graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java --- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java Mon Sep 16 20:37:25 2013 +0200 +++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java Mon Sep 16 20:37:44 2013 +0200 @@ -147,6 +147,7 @@ private int[] iterableIds; private static final DebugMetric ITERABLE_NODE_TYPES = Debug.metric("IterableNodeTypes"); + private final DebugMetric nodeIterableCount; private NodeClass(Class clazz) { super(clazz); @@ -215,6 +216,7 @@ } isLeafNode = (this.inputOffsets.length == 0 && this.successorOffsets.length == 0); + nodeIterableCount = Debug.metric("NodeIterable_" + shortName); } @Override @@ -242,6 +244,7 @@ } public int[] iterableIds() { + nodeIterableCount.increment(); return iterableIds; } diff -r 25de2c04c956 -r 1c5bc8307c76 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 Sep 16 20:37:25 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/SafepointNode.java Mon Sep 16 20:37:44 2013 +0200 @@ -23,14 +23,13 @@ package com.oracle.graal.nodes; import com.oracle.graal.api.meta.*; -import com.oracle.graal.graph.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; /** * Marks a position in the graph where a safepoint should be emitted. */ -public class SafepointNode extends DeoptimizingFixedWithNextNode implements LIRLowerable, IterableNodeType { +public class SafepointNode extends DeoptimizingFixedWithNextNode implements LIRLowerable { public SafepointNode() { this(StampFactory.forVoid()); diff -r 25de2c04c956 -r 1c5bc8307c76 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 20:37:25 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/SafepointInsertionPhase.java Mon Sep 16 20:37:44 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); + } + } }