7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
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 jdk.vm.ci.meta.JavaKind;
28
29 import org.graalvm.compiler.core.common.type.Stamp;
30 import org.graalvm.compiler.graph.Node;
31 import org.graalvm.compiler.graph.NodeClass;
32 import org.graalvm.compiler.nodeinfo.InputType;
33 import org.graalvm.compiler.nodeinfo.NodeCycles;
34 import org.graalvm.compiler.nodeinfo.NodeInfo;
35 import org.graalvm.compiler.nodeinfo.NodeSize;
36 import org.graalvm.compiler.nodeinfo.Verbosity;
37 import org.graalvm.compiler.nodes.extended.ForeignCallNode;
38 import org.graalvm.compiler.nodes.java.MethodCallTargetNode;
39 import org.graalvm.compiler.nodes.memory.AbstractMemoryCheckpoint;
40 import org.graalvm.compiler.nodes.memory.MemoryCheckpoint;
41 import org.graalvm.compiler.nodes.spi.LIRLowerable;
42 import org.graalvm.compiler.nodes.spi.LoweringTool;
43 import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool;
44 import org.graalvm.compiler.nodes.spi.UncheckedInterfaceProvider;
45 import org.graalvm.compiler.nodes.util.GraphUtil;
46 import jdk.internal.vm.compiler.word.LocationIdentity;
47
48 import java.util.Map;
49
50 import static org.graalvm.compiler.nodeinfo.InputType.Extension;
51 import static org.graalvm.compiler.nodeinfo.InputType.Memory;
52 import static org.graalvm.compiler.nodeinfo.InputType.State;
53 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_2;
54 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_64;
55 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_8;
56 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_UNKNOWN;
57 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_2;
58 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_64;
59 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_8;
60 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_UNKNOWN;
61
62 /**
63 * The {@code InvokeNode} represents all kinds of method calls.
64 */
65 // @formatter:off
66 @NodeInfo(nameTemplate = "Invoke#{p#targetMethod/s}",
67 allowedUsageTypes = {Memory},
68 cycles = CYCLES_UNKNOWN,
69 cyclesRationale = "We cannot estimate the runtime cost of a call, it is a blackhole." +
70 "However, we can estimate, dyanmically, the cost of the call operation itself based on the type of the call.",
71 size = SIZE_UNKNOWN,
72 sizeRationale = "We can only dyanmically, based on the type of the call (special, static, virtual, interface) decide" +
73 "how much code is generated for the call.")
74 // @formatter:on
75 public final class InvokeNode extends AbstractMemoryCheckpoint implements Invoke, LIRLowerable, MemoryCheckpoint.Single, UncheckedInterfaceProvider {
76 public static final NodeClass<InvokeNode> TYPE = NodeClass.create(InvokeNode.class);
77
78 @OptionalInput ValueNode classInit;
79 @Input(Extension) CallTargetNode callTarget;
80 @OptionalInput(State) FrameState stateDuring;
233 }
234
235 @Override
236 public Stamp uncheckedStamp() {
237 return this.callTarget.returnStamp().getUncheckedStamp();
238 }
239
240 @Override
241 public void setClassInit(ValueNode classInit) {
242 this.classInit = classInit;
243 updateUsages(null, classInit);
244 }
245
246 @Override
247 public ValueNode classInit() {
248 return classInit;
249 }
250
251 @Override
252 public NodeCycles estimatedNodeCycles() {
253 switch (callTarget().invokeKind()) {
254 case Interface:
255 return CYCLES_64;
256 case Special:
257 case Static:
258 return CYCLES_2;
259 case Virtual:
260 return CYCLES_8;
261 default:
262 return CYCLES_UNKNOWN;
263 }
264 }
265
266 @Override
267 public NodeSize estimatedNodeSize() {
268 switch (callTarget().invokeKind()) {
269 case Interface:
270 return SIZE_64;
271 case Special:
272 case Static:
273 return SIZE_2;
274 case Virtual:
275 return SIZE_8;
276 default:
277 return SIZE_UNKNOWN;
278 }
279 }
280 }
|
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
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.Extension;
28 import static org.graalvm.compiler.nodeinfo.InputType.Memory;
29 import static org.graalvm.compiler.nodeinfo.InputType.State;
30 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_2;
31 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_64;
32 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_8;
33 import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_UNKNOWN;
34 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_2;
35 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_64;
36 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_8;
37 import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_UNKNOWN;
38
39 import java.util.Map;
40
41 import org.graalvm.compiler.core.common.type.Stamp;
42 import org.graalvm.compiler.graph.Node;
43 import org.graalvm.compiler.graph.NodeClass;
44 import org.graalvm.compiler.nodeinfo.InputType;
45 import org.graalvm.compiler.nodeinfo.NodeCycles;
46 import org.graalvm.compiler.nodeinfo.NodeInfo;
47 import org.graalvm.compiler.nodeinfo.NodeSize;
48 import org.graalvm.compiler.nodeinfo.Verbosity;
49 import org.graalvm.compiler.nodes.extended.ForeignCallNode;
50 import org.graalvm.compiler.nodes.java.MethodCallTargetNode;
51 import org.graalvm.compiler.nodes.memory.AbstractMemoryCheckpoint;
52 import org.graalvm.compiler.nodes.memory.MemoryCheckpoint;
53 import org.graalvm.compiler.nodes.spi.LIRLowerable;
54 import org.graalvm.compiler.nodes.spi.LoweringTool;
55 import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool;
56 import org.graalvm.compiler.nodes.spi.UncheckedInterfaceProvider;
57 import org.graalvm.compiler.nodes.util.GraphUtil;
58 import jdk.internal.vm.compiler.word.LocationIdentity;
59
60 import jdk.vm.ci.meta.JavaKind;
61
62 /**
63 * The {@code InvokeNode} represents all kinds of method calls.
64 */
65 // @formatter:off
66 @NodeInfo(nameTemplate = "Invoke#{p#targetMethod/s}",
67 allowedUsageTypes = {Memory},
68 cycles = CYCLES_UNKNOWN,
69 cyclesRationale = "We cannot estimate the runtime cost of a call, it is a blackhole." +
70 "However, we can estimate, dyanmically, the cost of the call operation itself based on the type of the call.",
71 size = SIZE_UNKNOWN,
72 sizeRationale = "We can only dyanmically, based on the type of the call (special, static, virtual, interface) decide" +
73 "how much code is generated for the call.")
74 // @formatter:on
75 public final class InvokeNode extends AbstractMemoryCheckpoint implements Invoke, LIRLowerable, MemoryCheckpoint.Single, UncheckedInterfaceProvider {
76 public static final NodeClass<InvokeNode> TYPE = NodeClass.create(InvokeNode.class);
77
78 @OptionalInput ValueNode classInit;
79 @Input(Extension) CallTargetNode callTarget;
80 @OptionalInput(State) FrameState stateDuring;
233 }
234
235 @Override
236 public Stamp uncheckedStamp() {
237 return this.callTarget.returnStamp().getUncheckedStamp();
238 }
239
240 @Override
241 public void setClassInit(ValueNode classInit) {
242 this.classInit = classInit;
243 updateUsages(null, classInit);
244 }
245
246 @Override
247 public ValueNode classInit() {
248 return classInit;
249 }
250
251 @Override
252 public NodeCycles estimatedNodeCycles() {
253 if (callTarget == null) {
254 return CYCLES_UNKNOWN;
255 }
256 switch (callTarget.invokeKind()) {
257 case Interface:
258 return CYCLES_64;
259 case Special:
260 case Static:
261 return CYCLES_2;
262 case Virtual:
263 return CYCLES_8;
264 default:
265 return CYCLES_UNKNOWN;
266 }
267 }
268
269 @Override
270 public NodeSize estimatedNodeSize() {
271 if (callTarget == null) {
272 return SIZE_UNKNOWN;
273 }
274 switch (callTarget.invokeKind()) {
275 case Interface:
276 return SIZE_64;
277 case Special:
278 case Static:
279 return SIZE_2;
280 case Virtual:
281 return SIZE_8;
282 default:
283 return SIZE_UNKNOWN;
284 }
285 }
286 }
|