annotate graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/IntrinsicGraphBuilder.java @ 21311:710fc7216c56

consolidated ReplacementContext and IntrinsicContext
author Doug Simon <doug.simon@oracle.com>
date Tue, 12 May 2015 13:56:11 +0200
parents 3b5ec1a2b3b5
children ce95a5e36927
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
20162
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
1 /*
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
2 * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
4 *
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
7 * published by the Free Software Foundation.
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
8 *
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
13 * accompanied this code).
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
14 *
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
18 *
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
21 * questions.
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
22 */
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
23 package com.oracle.graal.replacements;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
24
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
25 import com.oracle.graal.api.code.*;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
26 import com.oracle.graal.api.meta.*;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
27 import com.oracle.graal.compiler.common.*;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
28 import com.oracle.graal.compiler.common.type.*;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
29 import com.oracle.graal.graphbuilderconf.*;
20903
dc58f4ca21c9 generalized map in InvocationPlugins to MethodIdMap
Doug Simon <doug.simon@oracle.com>
parents: 20870
diff changeset
30 import com.oracle.graal.graphbuilderconf.MethodIdMap.Receiver;
20162
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
31 import com.oracle.graal.nodes.CallTargetNode.InvokeKind;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
32 import com.oracle.graal.nodes.*;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
33 import com.oracle.graal.nodes.StructuredGraph.AllowAssumptions;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
34 import com.oracle.graal.nodes.calc.*;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
35 import com.oracle.graal.nodes.spi.*;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
36
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
37 /**
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
38 * Implementation of {@link GraphBuilderContext} used to produce a graph for a method based on an
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
39 * {@link InvocationPlugin} for the method.
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
40 */
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
41 public class IntrinsicGraphBuilder implements GraphBuilderContext, Receiver {
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
42
20862
2228b4368946 decouple IntrinsicGraphBuilder from Providers
Doug Simon <doug.simon@oracle.com>
parents: 20845
diff changeset
43 private final MetaAccessProvider metaAccess;
2228b4368946 decouple IntrinsicGraphBuilder from Providers
Doug Simon <doug.simon@oracle.com>
parents: 20845
diff changeset
44 private final ConstantReflectionProvider constantReflection;
2228b4368946 decouple IntrinsicGraphBuilder from Providers
Doug Simon <doug.simon@oracle.com>
parents: 20845
diff changeset
45 private final StampProvider stampProvider;
20162
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
46 private final StructuredGraph graph;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
47 private final ResolvedJavaMethod method;
20935
30cbb666e512 expand API for retrieving method substitution graphs to indicate the BCI of the invoke being inlined or -1 if the request is not in the context of inlining
Doug Simon <doug.simon@oracle.com>
parents: 20903
diff changeset
48 private final int invokeBci;
20162
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
49 private FixedWithNextNode lastInstr;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
50 private ValueNode[] arguments;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
51 private ValueNode returnValue;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
52
20935
30cbb666e512 expand API for retrieving method substitution graphs to indicate the BCI of the invoke being inlined or -1 if the request is not in the context of inlining
Doug Simon <doug.simon@oracle.com>
parents: 20903
diff changeset
53 public IntrinsicGraphBuilder(MetaAccessProvider metaAccess, ConstantReflectionProvider constantReflection, StampProvider stampProvider, ResolvedJavaMethod method, int invokeBci) {
20862
2228b4368946 decouple IntrinsicGraphBuilder from Providers
Doug Simon <doug.simon@oracle.com>
parents: 20845
diff changeset
54 this.metaAccess = metaAccess;
2228b4368946 decouple IntrinsicGraphBuilder from Providers
Doug Simon <doug.simon@oracle.com>
parents: 20845
diff changeset
55 this.constantReflection = constantReflection;
2228b4368946 decouple IntrinsicGraphBuilder from Providers
Doug Simon <doug.simon@oracle.com>
parents: 20845
diff changeset
56 this.stampProvider = stampProvider;
20162
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
57 this.graph = new StructuredGraph(method, AllowAssumptions.YES);
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
58 this.method = method;
20935
30cbb666e512 expand API for retrieving method substitution graphs to indicate the BCI of the invoke being inlined or -1 if the request is not in the context of inlining
Doug Simon <doug.simon@oracle.com>
parents: 20903
diff changeset
59 this.invokeBci = invokeBci;
20162
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
60 this.lastInstr = graph.start();
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
61
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
62 Signature sig = method.getSignature();
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
63 int max = sig.getParameterCount(false);
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
64 this.arguments = new ValueNode[max + (method.isStatic() ? 0 : 1)];
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
65
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
66 int javaIndex = 0;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
67 int index = 0;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
68 if (!method.isStatic()) {
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
69 // add the receiver
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
70 Stamp receiverStamp = StampFactory.declaredNonNull(method.getDeclaringClass());
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
71 FloatingNode receiver = graph.addWithoutUnique(new ParameterNode(javaIndex, receiverStamp));
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
72 arguments[index] = receiver;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
73 javaIndex = 1;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
74 index = 1;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
75 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
76 ResolvedJavaType accessingClass = method.getDeclaringClass();
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
77 for (int i = 0; i < max; i++) {
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
78 JavaType type = sig.getParameterType(i, accessingClass).resolve(accessingClass);
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
79 Kind kind = type.getKind();
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
80 Stamp stamp;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
81 if (kind == Kind.Object && type instanceof ResolvedJavaType) {
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
82 stamp = StampFactory.declared((ResolvedJavaType) type);
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
83 } else {
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
84 stamp = StampFactory.forKind(kind);
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
85 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
86 FloatingNode param = graph.addWithoutUnique(new ParameterNode(index, stamp));
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
87 arguments[index] = param;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
88 javaIndex += kind.getSlotCount();
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
89 index++;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
90 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
91 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
92
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
93 private <T extends ValueNode> void updateLastInstruction(T v) {
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
94 if (v instanceof FixedNode) {
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
95 FixedNode fixedNode = (FixedNode) v;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
96 lastInstr.setNext(fixedNode);
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
97 if (fixedNode instanceof FixedWithNextNode) {
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
98 FixedWithNextNode fixedWithNextNode = (FixedWithNextNode) fixedNode;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
99 assert fixedWithNextNode.next() == null : "cannot append instruction to instruction which isn't end";
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
100 lastInstr = fixedWithNextNode;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
101 } else {
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
102 lastInstr = null;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
103 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
104 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
105 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
106
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
107 public <T extends ValueNode> T append(T v) {
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
108 if (v.graph() != null) {
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
109 return v;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
110 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
111 T added = graph.addOrUnique(v);
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
112 if (added == v) {
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
113 updateLastInstruction(v);
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
114 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
115 return added;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
116 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
117
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
118 public <T extends ValueNode> T recursiveAppend(T v) {
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
119 if (v.graph() != null) {
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
120 return v;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
121 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
122 T added = graph.addOrUniqueWithInputs(v);
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
123 if (added == v) {
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
124 updateLastInstruction(v);
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
125 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
126 return added;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
127 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
128
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
129 public void push(Kind kind, ValueNode value) {
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
130 assert kind != Kind.Void;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
131 assert returnValue == null;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
132 returnValue = value;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
133 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
134
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
135 public void handleReplacedInvoke(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] args) {
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
136 throw GraalInternalError.shouldNotReachHere();
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
137 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
138
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
139 public StampProvider getStampProvider() {
20862
2228b4368946 decouple IntrinsicGraphBuilder from Providers
Doug Simon <doug.simon@oracle.com>
parents: 20845
diff changeset
140 return stampProvider;
20162
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
141 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
142
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
143 public MetaAccessProvider getMetaAccess() {
20862
2228b4368946 decouple IntrinsicGraphBuilder from Providers
Doug Simon <doug.simon@oracle.com>
parents: 20845
diff changeset
144 return metaAccess;
20162
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
145 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
146
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
147 public ConstantReflectionProvider getConstantReflection() {
20862
2228b4368946 decouple IntrinsicGraphBuilder from Providers
Doug Simon <doug.simon@oracle.com>
parents: 20845
diff changeset
148 return constantReflection;
20162
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
149 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
150
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
151 public StructuredGraph getGraph() {
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
152 return graph;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
153 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
154
21289
3b5ec1a2b3b5 consolidate frame state creation and processing for intrinsics into graph parsing, removing need for CollapseFrameForSingleSideEffectPhase
Doug Simon <doug.simon@oracle.com>
parents: 21280
diff changeset
155 public void setStateAfter(StateSplit sideEffect) {
3b5ec1a2b3b5 consolidate frame state creation and processing for intrinsics into graph parsing, removing need for CollapseFrameForSingleSideEffectPhase
Doug Simon <doug.simon@oracle.com>
parents: 21280
diff changeset
156 assert sideEffect.hasSideEffect();
21280
b97ec8aec2c7 changed GraphBuilderContext.createStateAfter() to .setStateAfter(StateSplit)
Doug Simon <doug.simon@oracle.com>
parents: 20935
diff changeset
157 FrameState stateAfter = getGraph().add(new FrameState(BytecodeFrame.BEFORE_BCI));
21289
3b5ec1a2b3b5 consolidate frame state creation and processing for intrinsics into graph parsing, removing need for CollapseFrameForSingleSideEffectPhase
Doug Simon <doug.simon@oracle.com>
parents: 21280
diff changeset
158 sideEffect.setStateAfter(stateAfter);
20162
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
159 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
160
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
161 public GraphBuilderContext getParent() {
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
162 return null;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
163 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
164
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
165 public ResolvedJavaMethod getMethod() {
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
166 return method;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
167 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
168
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
169 public int bci() {
20935
30cbb666e512 expand API for retrieving method substitution graphs to indicate the BCI of the invoke being inlined or -1 if the request is not in the context of inlining
Doug Simon <doug.simon@oracle.com>
parents: 20903
diff changeset
170 return invokeBci;
20162
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
171 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
172
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
173 public InvokeKind getInvokeKind() {
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
174 return method.isStatic() ? InvokeKind.Static : InvokeKind.Virtual;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
175 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
176
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
177 public JavaType getInvokeReturnType() {
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
178 return method.getSignature().getReturnType(method.getDeclaringClass());
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
179 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
180
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
181 public int getDepth() {
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
182 return 0;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
183 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
184
21311
710fc7216c56 consolidated ReplacementContext and IntrinsicContext
Doug Simon <doug.simon@oracle.com>
parents: 21289
diff changeset
185 public boolean parsingIntrinsic() {
20162
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
186 return true;
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
187 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
188
21311
710fc7216c56 consolidated ReplacementContext and IntrinsicContext
Doug Simon <doug.simon@oracle.com>
parents: 21289
diff changeset
189 public Intrinsic getIntrinsic() {
20162
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
190 throw GraalInternalError.shouldNotReachHere();
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
191 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
192
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
193 public BailoutException bailout(String string) {
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
194 throw GraalInternalError.shouldNotReachHere();
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
195 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
196
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
197 public ValueNode get() {
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
198 return arguments[0];
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
199 }
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
200
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
201 public StructuredGraph buildGraph(InvocationPlugin plugin) {
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
202 Receiver receiver = method.isStatic() ? null : this;
20844
e807c6f675de changed InvocationPlugin.execute to be a default method instead of a static method
Doug Simon <doug.simon@oracle.com>
parents: 20168
diff changeset
203 if (plugin.execute(this, method, receiver, arguments)) {
20168
f0f725496f2a account for InvocationPlugins that don't return true when using them for late inlining
Doug Simon <doug.simon@oracle.com>
parents: 20165
diff changeset
204 assert (returnValue != null) == (method.getSignature().getReturnKind() != Kind.Void) : method;
f0f725496f2a account for InvocationPlugins that don't return true when using them for late inlining
Doug Simon <doug.simon@oracle.com>
parents: 20165
diff changeset
205 append(new ReturnNode(returnValue));
f0f725496f2a account for InvocationPlugins that don't return true when using them for late inlining
Doug Simon <doug.simon@oracle.com>
parents: 20165
diff changeset
206 return graph;
f0f725496f2a account for InvocationPlugins that don't return true when using them for late inlining
Doug Simon <doug.simon@oracle.com>
parents: 20165
diff changeset
207 }
f0f725496f2a account for InvocationPlugins that don't return true when using them for late inlining
Doug Simon <doug.simon@oracle.com>
parents: 20165
diff changeset
208 return null;
20162
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
209 }
20845
a2cd0e7072e2 added MethodSubstitutionPlugin as (eventual) replacement for @MethodSubstitution mechanism
Doug Simon <doug.simon@oracle.com>
parents: 20844
diff changeset
210
a2cd0e7072e2 added MethodSubstitutionPlugin as (eventual) replacement for @MethodSubstitution mechanism
Doug Simon <doug.simon@oracle.com>
parents: 20844
diff changeset
211 public void intrinsify(ResolvedJavaMethod targetMethod, ResolvedJavaMethod substitute, ValueNode[] args) {
a2cd0e7072e2 added MethodSubstitutionPlugin as (eventual) replacement for @MethodSubstitution mechanism
Doug Simon <doug.simon@oracle.com>
parents: 20844
diff changeset
212 throw GraalInternalError.shouldNotReachHere();
a2cd0e7072e2 added MethodSubstitutionPlugin as (eventual) replacement for @MethodSubstitution mechanism
Doug Simon <doug.simon@oracle.com>
parents: 20844
diff changeset
213 }
20870
971b890cf5cb implement IntrinsicGraphBuilder.toString
Doug Simon <doug.simon@oracle.com>
parents: 20864
diff changeset
214
971b890cf5cb implement IntrinsicGraphBuilder.toString
Doug Simon <doug.simon@oracle.com>
parents: 20864
diff changeset
215 @Override
971b890cf5cb implement IntrinsicGraphBuilder.toString
Doug Simon <doug.simon@oracle.com>
parents: 20864
diff changeset
216 public String toString() {
971b890cf5cb implement IntrinsicGraphBuilder.toString
Doug Simon <doug.simon@oracle.com>
parents: 20864
diff changeset
217 return String.format("%s:intrinsic", method.format("%H.%n(%p)"));
971b890cf5cb implement IntrinsicGraphBuilder.toString
Doug Simon <doug.simon@oracle.com>
parents: 20864
diff changeset
218 }
20162
ba0f264a71cf added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
219 }