Mercurial > hg > truffle
changeset 11840:51d5a22e0ea9
Keep the correct Deoptimization reason and action while grouping Deoptimizations
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Mon, 30 Sep 2013 16:10:32 +0200 |
parents | 0e2cceed1caf |
children | 6157a71e0a36 |
files | graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/DeoptimizationAction.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DeoptimizationGroupingPhase.java |
diffstat | 1 files changed, 13 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DeoptimizationGroupingPhase.java Mon Sep 30 16:09:40 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DeoptimizationGroupingPhase.java Mon Sep 30 16:10:32 2013 +0200 @@ -24,21 +24,24 @@ import java.util.*; +import com.oracle.graal.api.meta.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.cfg.*; import com.oracle.graal.phases.*; +import com.oracle.graal.phases.tiers.*; /** * This phase tries to find {@link AbstractDeoptimizeNode DeoptimizeNodes} which use the same * {@link FrameState} and merges them together. */ -public class DeoptimizationGroupingPhase extends Phase { +public class DeoptimizationGroupingPhase extends BasePhase<MidTierContext> { @Override - protected void run(StructuredGraph graph) { + protected void run(StructuredGraph graph, MidTierContext context) { ControlFlowGraph cfg = null; for (FrameState fs : graph.getNodes(FrameState.class)) { FixedNode target = null; + PhiNode phi = null; List<AbstractDeoptimizeNode> obsoletes = null; for (AbstractDeoptimizeNode deopt : fs.usages().filter(AbstractDeoptimizeNode.class)) { if (target == null) { @@ -51,23 +54,30 @@ if (target instanceof AbstractDeoptimizeNode) { merge = graph.add(new MergeNode()); EndNode firstEnd = graph.add(new EndNode()); + phi = graph.addWithoutUnique(new PhiNode(Kind.Int, merge)); merge.addForwardEnd(firstEnd); + phi.addInput(((AbstractDeoptimizeNode) target).getActionAndReason(context.getRuntime())); target.predecessor().replaceFirstSuccessor(target, firstEnd); + exitLoops((AbstractDeoptimizeNode) target, firstEnd, cfg); - merge.setNext(target); + + merge.setNext(graph.add(new DynamicDeoptimizeNode(phi))); obsoletes = new LinkedList<>(); + obsoletes.add((AbstractDeoptimizeNode) target); target = merge; } else { merge = (MergeNode) target; } EndNode newEnd = graph.add(new EndNode()); merge.addForwardEnd(newEnd); + phi.addInput(deopt.getActionAndReason(context.getRuntime())); deopt.predecessor().replaceFirstSuccessor(deopt, newEnd); exitLoops(deopt, newEnd, cfg); obsoletes.add(deopt); } } if (obsoletes != null) { + ((DynamicDeoptimizeNode) ((MergeNode) target).next()).setDeoptimizationState(fs); for (AbstractDeoptimizeNode obsolete : obsoletes) { obsolete.safeDelete(); }