Mercurial > hg > graal-compiler
annotate graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/IntrinsicGraphBuilder.java @ 20835:a2cd0e7072e2
added MethodSubstitutionPlugin as (eventual) replacement for @MethodSubstitution mechanism
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Tue, 07 Apr 2015 17:32:26 +0200 |
parents | e807c6f675de |
children | 2228b4368946 |
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.api.replacements.*; |
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.*; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
29 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
|
30 import com.oracle.graal.graphbuilderconf.*; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
31 import com.oracle.graal.graphbuilderconf.InvocationPlugins.Receiver; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
32 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
|
33 import com.oracle.graal.nodes.*; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
34 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
|
35 import com.oracle.graal.nodes.calc.*; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
36 import com.oracle.graal.nodes.spi.*; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
37 import com.oracle.graal.phases.util.*; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
38 |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
39 /** |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
40 * 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
|
41 * {@link InvocationPlugin} for the method. |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
42 */ |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
43 public class IntrinsicGraphBuilder implements GraphBuilderContext, Receiver { |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
44 |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
45 private final Providers providers; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
46 private final SnippetReflectionProvider snippetReflection; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
47 private final StructuredGraph graph; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
48 private final ResolvedJavaMethod method; |
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 |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
53 public IntrinsicGraphBuilder(Providers providers, SnippetReflectionProvider snippetReflection, ResolvedJavaMethod method) { |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
54 this.providers = providers; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
55 this.snippetReflection = snippetReflection; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
56 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
|
57 this.method = method; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
58 this.lastInstr = graph.start(); |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
59 |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
60 Signature sig = method.getSignature(); |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
61 int max = sig.getParameterCount(false); |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
62 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
|
63 |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
64 int javaIndex = 0; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
65 int index = 0; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
66 if (!method.isStatic()) { |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
67 // add the receiver |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
68 Stamp receiverStamp = StampFactory.declaredNonNull(method.getDeclaringClass()); |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
69 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
|
70 arguments[index] = receiver; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
71 javaIndex = 1; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
72 index = 1; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
73 } |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
74 ResolvedJavaType accessingClass = method.getDeclaringClass(); |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
75 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
|
76 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
|
77 Kind kind = type.getKind(); |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
78 Stamp stamp; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
79 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
|
80 stamp = StampFactory.declared((ResolvedJavaType) type); |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
81 } else { |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
82 stamp = StampFactory.forKind(kind); |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
83 } |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
84 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
|
85 arguments[index] = param; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
86 javaIndex += kind.getSlotCount(); |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
87 index++; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
88 } |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
89 } |
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 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
|
92 if (v instanceof FixedNode) { |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
93 FixedNode fixedNode = (FixedNode) v; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
94 lastInstr.setNext(fixedNode); |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
95 if (fixedNode instanceof FixedWithNextNode) { |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
96 FixedWithNextNode fixedWithNextNode = (FixedWithNextNode) fixedNode; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
97 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
|
98 lastInstr = fixedWithNextNode; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
99 } else { |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
100 lastInstr = null; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
101 } |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
102 } |
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 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
|
106 if (v.graph() != null) { |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
107 return v; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
108 } |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
109 T added = graph.addOrUnique(v); |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
110 if (added == v) { |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
111 updateLastInstruction(v); |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
112 } |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
113 return added; |
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 |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
116 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
|
117 if (v.graph() != null) { |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
118 return v; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
119 } |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
120 T added = graph.addOrUniqueWithInputs(v); |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
121 if (added == v) { |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
122 updateLastInstruction(v); |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
123 } |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
124 return added; |
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 |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
127 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
|
128 assert kind != Kind.Void; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
129 assert returnValue == null; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
130 returnValue = value; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
131 } |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
132 |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
133 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
|
134 throw GraalInternalError.shouldNotReachHere(); |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
135 } |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
136 |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
137 public StampProvider getStampProvider() { |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
138 return providers.getStampProvider(); |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
139 } |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
140 |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
141 public MetaAccessProvider getMetaAccess() { |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
142 return providers.getMetaAccess(); |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
143 } |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
144 |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
145 public ConstantReflectionProvider getConstantReflection() { |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
146 return providers.getConstantReflection(); |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
147 } |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
148 |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
149 public SnippetReflectionProvider getSnippetReflection() { |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
150 return snippetReflection; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
151 } |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
152 |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
153 public StructuredGraph getGraph() { |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
154 return graph; |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
155 } |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
156 |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
157 public FrameState createStateAfter() { |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
158 return getGraph().add(new FrameState(BytecodeFrame.BEFORE_BCI)); |
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() { |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
170 return -1; |
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 |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
185 public boolean parsingReplacement() { |
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 |
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
189 public Replacement getReplacement() { |
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; |
20834
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 } |
20835
a2cd0e7072e2
added MethodSubstitutionPlugin as (eventual) replacement for @MethodSubstitution mechanism
Doug Simon <doug.simon@oracle.com>
parents:
20834
diff
changeset
|
210 |
a2cd0e7072e2
added MethodSubstitutionPlugin as (eventual) replacement for @MethodSubstitution mechanism
Doug Simon <doug.simon@oracle.com>
parents:
20834
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:
20834
diff
changeset
|
212 throw GraalInternalError.shouldNotReachHere(); |
a2cd0e7072e2
added MethodSubstitutionPlugin as (eventual) replacement for @MethodSubstitution mechanism
Doug Simon <doug.simon@oracle.com>
parents:
20834
diff
changeset
|
213 } |
20162
ba0f264a71cf
added support for inlining graphs derived from InvocationPlugins
Doug Simon <doug.simon@oracle.com>
parents:
diff
changeset
|
214 } |