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;