Mercurial > hg > truffle
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 } |