18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24
25 package org.graalvm.compiler.nodes;
26
27 import static org.graalvm.compiler.nodeinfo.InputType.Association;
28 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_0;
29 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_0;
30
31 import org.graalvm.compiler.graph.IterableNodeType;
32 import org.graalvm.compiler.graph.Node;
33 import org.graalvm.compiler.graph.NodeClass;
34 import org.graalvm.compiler.graph.iterators.NodeIterable;
35 import org.graalvm.compiler.graph.spi.Simplifiable;
36 import org.graalvm.compiler.graph.spi.SimplifierTool;
37 import org.graalvm.compiler.nodeinfo.NodeInfo;
38
39 @NodeInfo(allowedUsageTypes = {Association}, cycles = CYCLES_0, size = SIZE_0)
40 public final class LoopExitNode extends BeginStateSplitNode implements IterableNodeType, Simplifiable {
41
42 public static final NodeClass<LoopExitNode> TYPE = NodeClass.create(LoopExitNode.class);
43
44 /*
45 * The declared type of the field cannot be LoopBeginNode, because loop explosion during partial
46 * evaluation can temporarily assign a non-loop begin. This node will then be deleted shortly
47 * after - but we still must not have type system violations for that short amount of time.
48 */
49 @Input(Association) AbstractBeginNode loopBegin;
50
51 public LoopExitNode(LoopBeginNode loop) {
52 super(TYPE);
53 assert loop != null;
54 loopBegin = loop;
55 }
56
57 public LoopBeginNode loopBegin() {
83 vpn.replaceAtUsagesAndDelete(value);
84 if (value == this) {
85 // Guard proxy could have this input as value.
86 continue outer;
87 }
88 }
89 break;
90 }
91 }
92 }
93
94 @SuppressWarnings({"unchecked", "rawtypes"})
95 public NodeIterable<ProxyNode> proxies() {
96 return (NodeIterable) usages().filter(n -> {
97 if (n instanceof ProxyNode) {
98 ProxyNode proxyNode = (ProxyNode) n;
99 return proxyNode.proxyPoint() == this;
100 }
101 return false;
102 });
103 }
104
105 @Override
106 public void simplify(SimplifierTool tool) {
107 Node prev = this.predecessor();
108 while (tool.allUsagesAvailable() && prev instanceof BeginNode && prev.hasNoUsages()) {
109 AbstractBeginNode begin = (AbstractBeginNode) prev;
110 this.setNodeSourcePosition(begin.getNodeSourcePosition());
111 prev = prev.predecessor();
112 graph().removeFixed(begin);
113 }
114 }
115 }
|
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24
25 package org.graalvm.compiler.nodes;
26
27 import static org.graalvm.compiler.nodeinfo.InputType.Association;
28 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_0;
29 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_0;
30
31 import org.graalvm.compiler.graph.IterableNodeType;
32 import org.graalvm.compiler.graph.Node;
33 import org.graalvm.compiler.graph.NodeClass;
34 import org.graalvm.compiler.graph.iterators.NodeIterable;
35 import org.graalvm.compiler.graph.spi.Simplifiable;
36 import org.graalvm.compiler.graph.spi.SimplifierTool;
37 import org.graalvm.compiler.nodeinfo.NodeInfo;
38 import org.graalvm.compiler.nodes.util.GraphUtil;
39
40 @NodeInfo(allowedUsageTypes = {Association}, cycles = CYCLES_0, size = SIZE_0)
41 public final class LoopExitNode extends BeginStateSplitNode implements IterableNodeType, Simplifiable {
42
43 public static final NodeClass<LoopExitNode> TYPE = NodeClass.create(LoopExitNode.class);
44
45 /*
46 * The declared type of the field cannot be LoopBeginNode, because loop explosion during partial
47 * evaluation can temporarily assign a non-loop begin. This node will then be deleted shortly
48 * after - but we still must not have type system violations for that short amount of time.
49 */
50 @Input(Association) AbstractBeginNode loopBegin;
51
52 public LoopExitNode(LoopBeginNode loop) {
53 super(TYPE);
54 assert loop != null;
55 loopBegin = loop;
56 }
57
58 public LoopBeginNode loopBegin() {
84 vpn.replaceAtUsagesAndDelete(value);
85 if (value == this) {
86 // Guard proxy could have this input as value.
87 continue outer;
88 }
89 }
90 break;
91 }
92 }
93 }
94
95 @SuppressWarnings({"unchecked", "rawtypes"})
96 public NodeIterable<ProxyNode> proxies() {
97 return (NodeIterable) usages().filter(n -> {
98 if (n instanceof ProxyNode) {
99 ProxyNode proxyNode = (ProxyNode) n;
100 return proxyNode.proxyPoint() == this;
101 }
102 return false;
103 });
104 }
105
106 public void removeExit() {
107 this.removeProxies();
108 FrameState loopStateAfter = this.stateAfter();
109 graph().replaceFixedWithFixed(this, graph().add(new BeginNode()));
110 if (loopStateAfter != null) {
111 GraphUtil.tryKillUnused(loopStateAfter);
112 }
113 }
114
115 @Override
116 public void simplify(SimplifierTool tool) {
117 Node prev = this.predecessor();
118 while (tool.allUsagesAvailable() && prev instanceof BeginNode && prev.hasNoUsages()) {
119 AbstractBeginNode begin = (AbstractBeginNode) prev;
120 this.setNodeSourcePosition(begin.getNodeSourcePosition());
121 prev = prev.predecessor();
122 graph().removeFixed(begin);
123 }
124 }
125 }
|