Mercurial > hg > truffle
comparison graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotSuitesProvider.java @ 19500:b828f1f74625
add graph builder plugins for Unsafe and Word
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Thu, 19 Feb 2015 11:22:44 +0100 |
parents | e66b3cc0c27a |
children | 16ad9711b44f |
comparison
equal
deleted
inserted
replaced
19499:787a3c7235ef | 19500:b828f1f74625 |
---|---|
20 * or visit www.oracle.com if you need additional information or have any | 20 * or visit www.oracle.com if you need additional information or have any |
21 * questions. | 21 * questions. |
22 */ | 22 */ |
23 package com.oracle.graal.hotspot.meta; | 23 package com.oracle.graal.hotspot.meta; |
24 | 24 |
25 import static com.oracle.graal.api.meta.MetaUtil.*; | |
25 import static com.oracle.graal.compiler.common.GraalOptions.*; | 26 import static com.oracle.graal.compiler.common.GraalOptions.*; |
27 import static com.oracle.graal.replacements.NodeIntrinsificationPhase.*; | |
28 | |
29 import java.util.*; | |
26 | 30 |
27 import com.oracle.graal.api.meta.*; | 31 import com.oracle.graal.api.meta.*; |
32 import com.oracle.graal.compiler.common.type.*; | |
33 import com.oracle.graal.graph.Node.NodeIntrinsic; | |
28 import com.oracle.graal.hotspot.*; | 34 import com.oracle.graal.hotspot.*; |
29 import com.oracle.graal.hotspot.bridge.*; | 35 import com.oracle.graal.hotspot.bridge.*; |
30 import com.oracle.graal.hotspot.phases.*; | 36 import com.oracle.graal.hotspot.phases.*; |
31 import com.oracle.graal.java.*; | 37 import com.oracle.graal.java.*; |
32 import com.oracle.graal.java.GraphBuilderConfiguration.DebugInfoMode; | 38 import com.oracle.graal.java.GraphBuilderConfiguration.DebugInfoMode; |
39 import com.oracle.graal.java.GraphBuilderPlugin.AnnotatedInvocationPlugin; | |
33 import com.oracle.graal.java.GraphBuilderPlugin.InlineInvokePlugin; | 40 import com.oracle.graal.java.GraphBuilderPlugin.InlineInvokePlugin; |
34 import com.oracle.graal.java.GraphBuilderPlugin.LoadFieldPlugin; | 41 import com.oracle.graal.java.GraphBuilderPlugin.LoadFieldPlugin; |
35 import com.oracle.graal.lir.phases.*; | 42 import com.oracle.graal.lir.phases.*; |
36 import com.oracle.graal.nodes.*; | 43 import com.oracle.graal.nodes.*; |
37 import com.oracle.graal.nodes.spi.*; | 44 import com.oracle.graal.nodes.spi.*; |
38 import com.oracle.graal.options.*; | 45 import com.oracle.graal.options.*; |
39 import com.oracle.graal.options.DerivedOptionValue.OptionSupplier; | 46 import com.oracle.graal.options.DerivedOptionValue.OptionSupplier; |
40 import com.oracle.graal.phases.*; | 47 import com.oracle.graal.phases.*; |
41 import com.oracle.graal.phases.tiers.*; | 48 import com.oracle.graal.phases.tiers.*; |
49 import com.oracle.graal.replacements.*; | |
42 | 50 |
43 /** | 51 /** |
44 * HotSpot implementation of {@link SuitesProvider}. | 52 * HotSpot implementation of {@link SuitesProvider}. |
45 */ | 53 */ |
46 public class HotSpotSuitesProvider implements SuitesProvider { | 54 public class HotSpotSuitesProvider implements SuitesProvider { |
100 if (VerifyPhases.getValue()) { | 108 if (VerifyPhases.getValue()) { |
101 ret.getMidTier().appendPhase(new WriteBarrierVerificationPhase()); | 109 ret.getMidTier().appendPhase(new WriteBarrierVerificationPhase()); |
102 } | 110 } |
103 | 111 |
104 return ret; | 112 return ret; |
113 } | |
114 | |
115 NodeIntrinsificationPhase intrinsifier; | |
116 | |
117 NodeIntrinsificationPhase getIntrinsifier() { | |
118 if (intrinsifier == null) { | |
119 HotSpotProviders providers = runtime.getHostProviders(); | |
120 intrinsifier = new NodeIntrinsificationPhase(providers, providers.getSnippetReflection()); | |
121 } | |
122 return intrinsifier; | |
123 } | |
124 | |
125 MetaAccessProvider getMetaAccess() { | |
126 return runtime.getHostProviders().getMetaAccess(); | |
105 } | 127 } |
106 | 128 |
107 protected PhaseSuite<HighTierContext> createGraphBuilderSuite(MetaAccessProvider metaAccess, ConstantReflectionProvider constantReflection, Replacements replacements) { | 129 protected PhaseSuite<HighTierContext> createGraphBuilderSuite(MetaAccessProvider metaAccess, ConstantReflectionProvider constantReflection, Replacements replacements) { |
108 PhaseSuite<HighTierContext> suite = new PhaseSuite<>(); | 130 PhaseSuite<HighTierContext> suite = new PhaseSuite<>(); |
109 GraphBuilderConfiguration config = GraphBuilderConfiguration.getDefault(); | 131 GraphBuilderConfiguration config = GraphBuilderConfiguration.getDefault(); |
125 public ResolvedJavaMethod getInlinedMethod(GraphBuilderContext builder, ResolvedJavaMethod method, ValueNode[] args, JavaType returnType, int depth) { | 147 public ResolvedJavaMethod getInlinedMethod(GraphBuilderContext builder, ResolvedJavaMethod method, ValueNode[] args, JavaType returnType, int depth) { |
126 ResolvedJavaMethod subst = replacements.getMethodSubstitutionMethod(method); | 148 ResolvedJavaMethod subst = replacements.getMethodSubstitutionMethod(method); |
127 if (subst != null) { | 149 if (subst != null) { |
128 return subst; | 150 return subst; |
129 } | 151 } |
152 if (builder.parsingReplacement() && method.getAnnotation(NodeIntrinsic.class) == null) { | |
153 return method; | |
154 } | |
130 if (method.hasBytecodes() && method.getCode().length <= TrivialInliningSize.getValue() && depth < InlineDuringParsingMaxDepth.getValue()) { | 155 if (method.hasBytecodes() && method.getCode().length <= TrivialInliningSize.getValue() && depth < InlineDuringParsingMaxDepth.getValue()) { |
131 return method; | 156 return method; |
132 } | 157 } |
133 return null; | 158 return null; |
159 } | |
160 }); | |
161 config.setAnnotatedInvocationPlugin(new AnnotatedInvocationPlugin() { | |
162 public boolean apply(GraphBuilderContext builder, ResolvedJavaMethod method, ValueNode[] args) { | |
163 if (builder.parsingReplacement()) { | |
164 @SuppressWarnings("hiding") | |
165 NodeIntrinsificationPhase intrinsifier = getIntrinsifier(); | |
166 NodeIntrinsic intrinsic = intrinsifier.getIntrinsic(method); | |
167 if (intrinsic != null) { | |
168 Signature sig = method.getSignature(); | |
169 Kind returnKind = sig.getReturnKind(); | |
170 Stamp stamp = StampFactory.forKind(returnKind); | |
171 if (returnKind == Kind.Object) { | |
172 JavaType returnType = sig.getReturnType(method.getDeclaringClass()); | |
173 if (returnType instanceof ResolvedJavaType) { | |
174 stamp = StampFactory.declared((ResolvedJavaType) returnType); | |
175 } | |
176 } | |
177 | |
178 ValueNode res = intrinsifier.createIntrinsicNode(Arrays.asList(args), stamp, method, builder.getGraph(), intrinsic); | |
179 res = builder.append(res); | |
180 if (res.getKind().getStackKind() != Kind.Void) { | |
181 builder.push(returnKind.getStackKind(), res); | |
182 } | |
183 return true; | |
184 } else if (intrinsifier.isFoldable(method)) { | |
185 ResolvedJavaType[] parameterTypes = resolveJavaTypes(method.toParameterTypes(), method.getDeclaringClass()); | |
186 JavaConstant constant = intrinsifier.tryFold(Arrays.asList(args), parameterTypes, method); | |
187 if (!COULD_NOT_FOLD.equals(constant)) { | |
188 if (constant != null) { | |
189 // Replace the invoke with the result of the call | |
190 ConstantNode res = builder.append(ConstantNode.forConstant(constant, getMetaAccess())); | |
191 builder.push(res.getKind().getStackKind(), builder.append(res)); | |
192 } else { | |
193 // This must be a void invoke | |
194 assert method.getSignature().getReturnKind() == Kind.Void; | |
195 } | |
196 return true; | |
197 } | |
198 } | |
199 } | |
200 return false; | |
134 } | 201 } |
135 }); | 202 }); |
136 } | 203 } |
137 suite.appendPhase(new GraphBuilderPhase(config)); | 204 suite.appendPhase(new GraphBuilderPhase(config)); |
138 return suite; | 205 return suite; |