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();
                 }