Mercurial > hg > truffle
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 |
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 } |