# HG changeset patch # User Gilles Duboscq # Date 1380550232 -7200 # Node ID 51d5a22e0ea9a5b2feb7eb8074e87298d302ab30 # Parent 0e2cceed1caf160bdbf415b0bf14a8d7473b73e7 Keep the correct Deoptimization reason and action while grouping Deoptimizations diff -r 0e2cceed1caf -r 51d5a22e0ea9 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DeoptimizationGroupingPhase.java --- 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 { @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 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(); }