comparison graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DeoptimizationGroupingPhase.java @ 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 d72c314260dc
children 23ccaa863eda
comparison
equal deleted inserted replaced
11839:0e2cceed1caf 11840:51d5a22e0ea9
22 */ 22 */
23 package com.oracle.graal.phases.common; 23 package com.oracle.graal.phases.common;
24 24
25 import java.util.*; 25 import java.util.*;
26 26
27 import com.oracle.graal.api.meta.*;
27 import com.oracle.graal.nodes.*; 28 import com.oracle.graal.nodes.*;
28 import com.oracle.graal.nodes.cfg.*; 29 import com.oracle.graal.nodes.cfg.*;
29 import com.oracle.graal.phases.*; 30 import com.oracle.graal.phases.*;
31 import com.oracle.graal.phases.tiers.*;
30 32
31 /** 33 /**
32 * This phase tries to find {@link AbstractDeoptimizeNode DeoptimizeNodes} which use the same 34 * This phase tries to find {@link AbstractDeoptimizeNode DeoptimizeNodes} which use the same
33 * {@link FrameState} and merges them together. 35 * {@link FrameState} and merges them together.
34 */ 36 */
35 public class DeoptimizationGroupingPhase extends Phase { 37 public class DeoptimizationGroupingPhase extends BasePhase<MidTierContext> {
36 38
37 @Override 39 @Override
38 protected void run(StructuredGraph graph) { 40 protected void run(StructuredGraph graph, MidTierContext context) {
39 ControlFlowGraph cfg = null; 41 ControlFlowGraph cfg = null;
40 for (FrameState fs : graph.getNodes(FrameState.class)) { 42 for (FrameState fs : graph.getNodes(FrameState.class)) {
41 FixedNode target = null; 43 FixedNode target = null;
44 PhiNode phi = null;
42 List<AbstractDeoptimizeNode> obsoletes = null; 45 List<AbstractDeoptimizeNode> obsoletes = null;
43 for (AbstractDeoptimizeNode deopt : fs.usages().filter(AbstractDeoptimizeNode.class)) { 46 for (AbstractDeoptimizeNode deopt : fs.usages().filter(AbstractDeoptimizeNode.class)) {
44 if (target == null) { 47 if (target == null) {
45 target = deopt; 48 target = deopt;
46 } else { 49 } else {
49 } 52 }
50 MergeNode merge; 53 MergeNode merge;
51 if (target instanceof AbstractDeoptimizeNode) { 54 if (target instanceof AbstractDeoptimizeNode) {
52 merge = graph.add(new MergeNode()); 55 merge = graph.add(new MergeNode());
53 EndNode firstEnd = graph.add(new EndNode()); 56 EndNode firstEnd = graph.add(new EndNode());
57 phi = graph.addWithoutUnique(new PhiNode(Kind.Int, merge));
54 merge.addForwardEnd(firstEnd); 58 merge.addForwardEnd(firstEnd);
59 phi.addInput(((AbstractDeoptimizeNode) target).getActionAndReason(context.getRuntime()));
55 target.predecessor().replaceFirstSuccessor(target, firstEnd); 60 target.predecessor().replaceFirstSuccessor(target, firstEnd);
61
56 exitLoops((AbstractDeoptimizeNode) target, firstEnd, cfg); 62 exitLoops((AbstractDeoptimizeNode) target, firstEnd, cfg);
57 merge.setNext(target); 63
64 merge.setNext(graph.add(new DynamicDeoptimizeNode(phi)));
58 obsoletes = new LinkedList<>(); 65 obsoletes = new LinkedList<>();
66 obsoletes.add((AbstractDeoptimizeNode) target);
59 target = merge; 67 target = merge;
60 } else { 68 } else {
61 merge = (MergeNode) target; 69 merge = (MergeNode) target;
62 } 70 }
63 EndNode newEnd = graph.add(new EndNode()); 71 EndNode newEnd = graph.add(new EndNode());
64 merge.addForwardEnd(newEnd); 72 merge.addForwardEnd(newEnd);
73 phi.addInput(deopt.getActionAndReason(context.getRuntime()));
65 deopt.predecessor().replaceFirstSuccessor(deopt, newEnd); 74 deopt.predecessor().replaceFirstSuccessor(deopt, newEnd);
66 exitLoops(deopt, newEnd, cfg); 75 exitLoops(deopt, newEnd, cfg);
67 obsoletes.add(deopt); 76 obsoletes.add(deopt);
68 } 77 }
69 } 78 }
70 if (obsoletes != null) { 79 if (obsoletes != null) {
80 ((DynamicDeoptimizeNode) ((MergeNode) target).next()).setDeoptimizationState(fs);
71 for (AbstractDeoptimizeNode obsolete : obsoletes) { 81 for (AbstractDeoptimizeNode obsolete : obsoletes) {
72 obsolete.safeDelete(); 82 obsolete.safeDelete();
73 } 83 }
74 } 84 }
75 } 85 }