comparison graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DeoptimizationGroupingPhase.java @ 13641:5a9afbf72714

Add a speculation oop for uncommon trap deoptimization. Save it in the SpeculationLog during deoptimization.
author Gilles Duboscq <duboscq@ssw.jku.at>
date Thu, 12 Dec 2013 15:13:02 +0100
parents 23ccaa863eda
children fabf5447603e
comparison
equal deleted inserted replaced
13640:bfe7a8c8c3c6 13641:5a9afbf72714
39 @Override 39 @Override
40 protected void run(StructuredGraph graph, MidTierContext context) { 40 protected void run(StructuredGraph graph, MidTierContext context) {
41 ControlFlowGraph cfg = null; 41 ControlFlowGraph cfg = null;
42 for (FrameState fs : graph.getNodes(FrameState.class)) { 42 for (FrameState fs : graph.getNodes(FrameState.class)) {
43 FixedNode target = null; 43 FixedNode target = null;
44 PhiNode phi = null; 44 PhiNode reasonActionPhi = null;
45 PhiNode speculationPhi = null;
45 List<AbstractDeoptimizeNode> obsoletes = null; 46 List<AbstractDeoptimizeNode> obsoletes = null;
46 for (AbstractDeoptimizeNode deopt : fs.usages().filter(AbstractDeoptimizeNode.class)) { 47 for (AbstractDeoptimizeNode deopt : fs.usages().filter(AbstractDeoptimizeNode.class)) {
47 if (target == null) { 48 if (target == null) {
48 target = deopt; 49 target = deopt;
49 } else { 50 } else {
52 } 53 }
53 MergeNode merge; 54 MergeNode merge;
54 if (target instanceof AbstractDeoptimizeNode) { 55 if (target instanceof AbstractDeoptimizeNode) {
55 merge = graph.add(new MergeNode()); 56 merge = graph.add(new MergeNode());
56 EndNode firstEnd = graph.add(new EndNode()); 57 EndNode firstEnd = graph.add(new EndNode());
57 phi = graph.addWithoutUnique(new PhiNode(Kind.Int, merge)); 58 reasonActionPhi = graph.addWithoutUnique(new PhiNode(Kind.Int, merge));
59 speculationPhi = graph.addWithoutUnique(new PhiNode(Kind.Object, merge));
58 merge.addForwardEnd(firstEnd); 60 merge.addForwardEnd(firstEnd);
59 phi.addInput(((AbstractDeoptimizeNode) target).getActionAndReason(context.getMetaAccess())); 61 reasonActionPhi.addInput(((AbstractDeoptimizeNode) target).getActionAndReason(context.getMetaAccess()));
62 speculationPhi.addInput(((AbstractDeoptimizeNode) target).getSpeculation(context.getMetaAccess()));
60 target.predecessor().replaceFirstSuccessor(target, firstEnd); 63 target.predecessor().replaceFirstSuccessor(target, firstEnd);
61 64
62 exitLoops((AbstractDeoptimizeNode) target, firstEnd, cfg); 65 exitLoops((AbstractDeoptimizeNode) target, firstEnd, cfg);
63 66
64 merge.setNext(graph.add(new DynamicDeoptimizeNode(phi))); 67 merge.setNext(graph.add(new DynamicDeoptimizeNode(reasonActionPhi, speculationPhi)));
65 obsoletes = new LinkedList<>(); 68 obsoletes = new LinkedList<>();
66 obsoletes.add((AbstractDeoptimizeNode) target); 69 obsoletes.add((AbstractDeoptimizeNode) target);
67 target = merge; 70 target = merge;
68 } else { 71 } else {
69 merge = (MergeNode) target; 72 merge = (MergeNode) target;
70 } 73 }
71 EndNode newEnd = graph.add(new EndNode()); 74 EndNode newEnd = graph.add(new EndNode());
72 merge.addForwardEnd(newEnd); 75 merge.addForwardEnd(newEnd);
73 phi.addInput(deopt.getActionAndReason(context.getMetaAccess())); 76 reasonActionPhi.addInput(deopt.getActionAndReason(context.getMetaAccess()));
77 speculationPhi.addInput(deopt.getSpeculation(context.getMetaAccess()));
74 deopt.predecessor().replaceFirstSuccessor(deopt, newEnd); 78 deopt.predecessor().replaceFirstSuccessor(deopt, newEnd);
75 exitLoops(deopt, newEnd, cfg); 79 exitLoops(deopt, newEnd, cfg);
76 obsoletes.add(deopt); 80 obsoletes.add(deopt);
77 } 81 }
78 } 82 }