comparison graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java @ 18993:480bd3b1adcd

Rename BeginNode => AbstractBeginNode.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Wed, 28 Jan 2015 00:50:31 +0100
parents f57d86eb036f
children a2cb19764970
comparison
equal deleted inserted replaced
18992:b1c03c2bfa40 18993:480bd3b1adcd
49 * 49 *
50 */ 50 */
51 public class ConvertDeoptimizeToGuardPhase extends Phase { 51 public class ConvertDeoptimizeToGuardPhase extends Phase {
52 private SimplifierTool simplifierTool = GraphUtil.getDefaultSimplifier(null, null, null, false); 52 private SimplifierTool simplifierTool = GraphUtil.getDefaultSimplifier(null, null, null, false);
53 53
54 private static BeginNode findBeginNode(FixedNode startNode) { 54 private static AbstractBeginNode findBeginNode(FixedNode startNode) {
55 return GraphUtil.predecessorIterable(startNode).filter(BeginNode.class).first(); 55 return GraphUtil.predecessorIterable(startNode).filter(AbstractBeginNode.class).first();
56 } 56 }
57 57
58 @Override 58 @Override
59 protected void run(final StructuredGraph graph) { 59 protected void run(final StructuredGraph graph) {
60 assert graph.hasValueProxies() : "ConvertDeoptimizeToGuardPhase always creates proxies"; 60 assert graph.hasValueProxies() : "ConvertDeoptimizeToGuardPhase always creates proxies";
61 if (graph.getNodes(DeoptimizeNode.class).isEmpty()) { 61 if (graph.getNodes(DeoptimizeNode.class).isEmpty()) {
62 return; 62 return;
63 } 63 }
64 for (DeoptimizeNode d : graph.getNodes(DeoptimizeNode.class)) { 64 for (DeoptimizeNode d : graph.getNodes(DeoptimizeNode.class)) {
65 assert d.isAlive(); 65 assert d.isAlive();
66 visitDeoptBegin(BeginNode.prevBegin(d), d.action(), d.reason(), graph); 66 visitDeoptBegin(AbstractBeginNode.prevBegin(d), d.action(), d.reason(), graph);
67 } 67 }
68 68
69 for (FixedGuardNode fixedGuard : graph.getNodes(FixedGuardNode.class)) { 69 for (FixedGuardNode fixedGuard : graph.getNodes(FixedGuardNode.class)) {
70 70
71 BeginNode pred = BeginNode.prevBegin(fixedGuard); 71 AbstractBeginNode pred = AbstractBeginNode.prevBegin(fixedGuard);
72 if (pred instanceof MergeNode) { 72 if (pred instanceof MergeNode) {
73 MergeNode merge = (MergeNode) pred; 73 MergeNode merge = (MergeNode) pred;
74 if (fixedGuard.condition() instanceof CompareNode) { 74 if (fixedGuard.condition() instanceof CompareNode) {
75 CompareNode compare = (CompareNode) fixedGuard.condition(); 75 CompareNode compare = (CompareNode) fixedGuard.condition();
76 List<AbstractEndNode> mergePredecessors = merge.cfgPredecessors().snapshot(); 76 List<AbstractEndNode> mergePredecessors = merge.cfgPredecessors().snapshot();
94 if (ys[i] == null) { 94 if (ys[i] == null) {
95 continue; 95 continue;
96 } 96 }
97 if (xs[i] instanceof PrimitiveConstant && ys[i] instanceof PrimitiveConstant && 97 if (xs[i] instanceof PrimitiveConstant && ys[i] instanceof PrimitiveConstant &&
98 compare.condition().foldCondition(xs[i], ys[i], null, compare.unorderedIsTrue()) == fixedGuard.isNegated()) { 98 compare.condition().foldCondition(xs[i], ys[i], null, compare.unorderedIsTrue()) == fixedGuard.isNegated()) {
99 visitDeoptBegin(BeginNode.prevBegin(mergePredecessor), fixedGuard.getAction(), fixedGuard.getReason(), graph); 99 visitDeoptBegin(AbstractBeginNode.prevBegin(mergePredecessor), fixedGuard.getAction(), fixedGuard.getReason(), graph);
100 } 100 }
101 } 101 }
102 } 102 }
103 } 103 }
104 } 104 }
105 105
106 new DeadCodeEliminationPhase(Optional).apply(graph); 106 new DeadCodeEliminationPhase(Optional).apply(graph);
107 } 107 }
108 108
109 private void visitDeoptBegin(BeginNode deoptBegin, DeoptimizationAction deoptAction, DeoptimizationReason deoptReason, StructuredGraph graph) { 109 private void visitDeoptBegin(AbstractBeginNode deoptBegin, DeoptimizationAction deoptAction, DeoptimizationReason deoptReason, StructuredGraph graph) {
110 if (deoptBegin instanceof MergeNode) { 110 if (deoptBegin instanceof MergeNode) {
111 MergeNode mergeNode = (MergeNode) deoptBegin; 111 MergeNode mergeNode = (MergeNode) deoptBegin;
112 Debug.log("Visiting %s", mergeNode); 112 Debug.log("Visiting %s", mergeNode);
113 FixedNode next = mergeNode.next(); 113 FixedNode next = mergeNode.next();
114 while (mergeNode.isAlive()) { 114 while (mergeNode.isAlive()) {
115 AbstractEndNode end = mergeNode.forwardEnds().first(); 115 AbstractEndNode end = mergeNode.forwardEnds().first();
116 BeginNode newBeginNode = findBeginNode(end); 116 AbstractBeginNode newBeginNode = findBeginNode(end);
117 visitDeoptBegin(newBeginNode, deoptAction, deoptReason, graph); 117 visitDeoptBegin(newBeginNode, deoptAction, deoptReason, graph);
118 } 118 }
119 assert next.isAlive(); 119 assert next.isAlive();
120 BeginNode newBeginNode = findBeginNode(next); 120 AbstractBeginNode newBeginNode = findBeginNode(next);
121 visitDeoptBegin(newBeginNode, deoptAction, deoptReason, graph); 121 visitDeoptBegin(newBeginNode, deoptAction, deoptReason, graph);
122 return; 122 return;
123 } else if (deoptBegin.predecessor() instanceof IfNode) { 123 } else if (deoptBegin.predecessor() instanceof IfNode) {
124 IfNode ifNode = (IfNode) deoptBegin.predecessor(); 124 IfNode ifNode = (IfNode) deoptBegin.predecessor();
125 BeginNode otherBegin = ifNode.trueSuccessor(); 125 AbstractBeginNode otherBegin = ifNode.trueSuccessor();
126 LogicNode conditionNode = ifNode.condition(); 126 LogicNode conditionNode = ifNode.condition();
127 FixedGuardNode guard = graph.add(new FixedGuardNode(conditionNode, deoptReason, deoptAction, deoptBegin == ifNode.trueSuccessor())); 127 FixedGuardNode guard = graph.add(new FixedGuardNode(conditionNode, deoptReason, deoptAction, deoptBegin == ifNode.trueSuccessor()));
128 FixedWithNextNode pred = (FixedWithNextNode) ifNode.predecessor(); 128 FixedWithNextNode pred = (FixedWithNextNode) ifNode.predecessor();
129 BeginNode survivingSuccessor; 129 AbstractBeginNode survivingSuccessor;
130 if (deoptBegin == ifNode.trueSuccessor()) { 130 if (deoptBegin == ifNode.trueSuccessor()) {
131 survivingSuccessor = ifNode.falseSuccessor(); 131 survivingSuccessor = ifNode.falseSuccessor();
132 } else { 132 } else {
133 survivingSuccessor = ifNode.trueSuccessor(); 133 survivingSuccessor = ifNode.trueSuccessor();
134 } 134 }