1 /* |
1 /* |
2 * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
27 import static org.graalvm.compiler.nodeinfo.InputType.Association; |
27 import static org.graalvm.compiler.nodeinfo.InputType.Association; |
28 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_0; |
28 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_0; |
29 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_0; |
29 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_0; |
30 |
30 |
31 import org.graalvm.compiler.core.common.type.Stamp; |
31 import org.graalvm.compiler.core.common.type.Stamp; |
|
32 import org.graalvm.compiler.graph.Node; |
32 import org.graalvm.compiler.graph.Node.ValueNumberable; |
33 import org.graalvm.compiler.graph.Node.ValueNumberable; |
|
34 import org.graalvm.compiler.graph.spi.Canonicalizable; |
|
35 import org.graalvm.compiler.graph.spi.CanonicalizerTool; |
33 import org.graalvm.compiler.graph.NodeClass; |
36 import org.graalvm.compiler.graph.NodeClass; |
34 import org.graalvm.compiler.nodeinfo.NodeInfo; |
37 import org.graalvm.compiler.nodeinfo.NodeInfo; |
35 import org.graalvm.compiler.nodes.calc.FloatingNode; |
38 import org.graalvm.compiler.nodes.calc.FloatingNode; |
36 import org.graalvm.compiler.nodes.extended.GuardingNode; |
39 import org.graalvm.compiler.nodes.extended.GuardingNode; |
|
40 import org.graalvm.compiler.nodes.memory.MemoryNode; |
|
41 import org.graalvm.compiler.nodes.spi.Proxy; |
|
42 import jdk.internal.vm.compiler.word.LocationIdentity; |
37 |
43 |
38 /** |
44 /** |
39 * A proxy is inserted at loop exits for any value that is created inside the loop (i.e. was not |
45 * A proxy is inserted at loop exits for any value that is created inside the loop (i.e. was not |
40 * live on entry to the loop) and is (potentially) used after the loop. |
46 * live on entry to the loop) and is (potentially) used after the loop. |
41 */ |
47 */ |
42 @NodeInfo(cycles = CYCLES_0, size = SIZE_0) |
48 @NodeInfo(cycles = CYCLES_0, size = SIZE_0) |
43 public abstract class ProxyNode extends FloatingNode implements ValueNumberable { |
49 public abstract class ProxyNode extends FloatingNode implements Proxy, ValueNumberable, Canonicalizable { |
44 |
50 |
45 public static final NodeClass<ProxyNode> TYPE = NodeClass.create(ProxyNode.class); |
51 public static final NodeClass<ProxyNode> TYPE = NodeClass.create(ProxyNode.class); |
46 @Input(Association) LoopExitNode loopExit; |
52 @Input(Association) LoopExitNode loopExit; |
47 |
53 |
48 protected ProxyNode(NodeClass<? extends ProxyNode> c, Stamp stamp, LoopExitNode proxyPoint) { |
54 protected ProxyNode(NodeClass<? extends ProxyNode> c, Stamp stamp, LoopExitNode proxyPoint) { |
61 public LoopExitNode proxyPoint() { |
67 public LoopExitNode proxyPoint() { |
62 return loopExit; |
68 return loopExit; |
63 } |
69 } |
64 |
70 |
65 @Override |
71 @Override |
|
72 public ValueNode getOriginalNode() { |
|
73 return value(); |
|
74 } |
|
75 |
|
76 @Override |
66 public boolean verify() { |
77 public boolean verify() { |
67 assert !(value() instanceof ProxyNode) || ((ProxyNode) value()).loopExit != loopExit; |
78 assert !(value() instanceof ProxyNode) || ((ProxyNode) value()).loopExit != loopExit; |
68 return super.verify(); |
79 return super.verify(); |
69 } |
80 } |
70 |
81 |
71 public static ValueProxyNode forValue(ValueNode value, LoopExitNode exit, StructuredGraph graph) { |
82 public static ValueProxyNode forValue(ValueNode value, LoopExitNode exit) { |
72 return graph.unique(new ValueProxyNode(value, exit)); |
83 return exit.graph().unique(new ValueProxyNode(value, exit)); |
73 } |
84 } |
74 |
85 |
75 public static GuardProxyNode forGuard(GuardingNode value, LoopExitNode exit, StructuredGraph graph) { |
86 public static GuardProxyNode forGuard(GuardingNode value, LoopExitNode exit) { |
76 return graph.unique(new GuardProxyNode(value, exit)); |
87 return exit.graph().unique(new GuardProxyNode(value, exit)); |
|
88 } |
|
89 |
|
90 public static MemoryProxyNode forMemory(MemoryNode value, LoopExitNode exit, LocationIdentity locationIdentity) { |
|
91 return exit.graph().unique(new MemoryProxyNode(value, exit, locationIdentity)); |
|
92 } |
|
93 |
|
94 @Override |
|
95 public Node canonical(CanonicalizerTool tool) { |
|
96 if (value() == null) { |
|
97 return null; |
|
98 } |
|
99 return this; |
77 } |
100 } |
78 |
101 |
79 public abstract PhiNode createPhi(AbstractMergeNode merge); |
102 public abstract PhiNode createPhi(AbstractMergeNode merge); |
80 } |
103 } |