13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24
25 package org.graalvm.compiler.replacements;
26
27 import static org.graalvm.compiler.core.common.GraalOptions.UseSnippetGraphCache;
28 import static org.graalvm.compiler.debug.DebugContext.DEFAULT_LOG_STREAM;
29 import static org.graalvm.compiler.java.BytecodeParserOptions.InlineDuringParsing;
30 import static org.graalvm.compiler.java.BytecodeParserOptions.InlineIntrinsicsDuringParsing;
31 import static org.graalvm.compiler.nodes.graphbuilderconf.InlineInvokePlugin.InlineInfo.createIntrinsicInlineInfo;
32 import static org.graalvm.compiler.nodes.graphbuilderconf.IntrinsicContext.CompilationContext.INLINE_AFTER_PARSING;
33 import static org.graalvm.compiler.phases.common.DeadCodeEliminationPhase.Optionality.Required;
34
35 import java.util.Collections;
36 import java.util.List;
37 import java.util.concurrent.ConcurrentHashMap;
38 import java.util.concurrent.ConcurrentMap;
39 import java.util.concurrent.atomic.AtomicInteger;
40
41 import jdk.internal.vm.compiler.collections.EconomicMap;
42 import jdk.internal.vm.compiler.collections.Equivalence;
43 import org.graalvm.compiler.api.replacements.Fold;
44 import org.graalvm.compiler.api.replacements.MethodSubstitution;
45 import org.graalvm.compiler.api.replacements.Snippet;
46 import org.graalvm.compiler.api.replacements.SnippetReflectionProvider;
47 import org.graalvm.compiler.api.replacements.SnippetTemplateCache;
48 import org.graalvm.compiler.bytecode.Bytecode;
49 import org.graalvm.compiler.bytecode.BytecodeProvider;
50 import org.graalvm.compiler.bytecode.ResolvedJavaMethodBytecode;
51 import org.graalvm.compiler.core.common.GraalOptions;
52 import org.graalvm.compiler.core.common.spi.ConstantFieldProvider;
53 import org.graalvm.compiler.debug.DebugCloseable;
54 import org.graalvm.compiler.debug.DebugContext;
55 import org.graalvm.compiler.debug.DebugContext.Description;
56 import org.graalvm.compiler.debug.DebugHandlersFactory;
57 import org.graalvm.compiler.debug.GraalError;
58 import org.graalvm.compiler.debug.TimerKey;
59 import org.graalvm.compiler.graph.Node;
60 import org.graalvm.compiler.graph.NodeSourcePosition;
61 import org.graalvm.compiler.graph.Node.NodeIntrinsic;
62 import org.graalvm.compiler.java.GraphBuilderPhase;
63 import org.graalvm.compiler.java.GraphBuilderPhase.Instance;
64 import org.graalvm.compiler.nodes.CallTargetNode;
65 import org.graalvm.compiler.nodes.Invoke;
66 import org.graalvm.compiler.nodes.StateSplit;
67 import org.graalvm.compiler.nodes.StructuredGraph;
68 import org.graalvm.compiler.nodes.ValueNode;
69 import org.graalvm.compiler.nodes.graphbuilderconf.GeneratedInvocationPlugin;
70 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration;
71 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins;
72 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext;
73 import org.graalvm.compiler.nodes.graphbuilderconf.InlineInvokePlugin;
74 import org.graalvm.compiler.nodes.graphbuilderconf.IntrinsicContext;
75 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin;
76 import org.graalvm.compiler.nodes.graphbuilderconf.MethodSubstitutionPlugin;
77 import org.graalvm.compiler.nodes.java.MethodCallTargetNode;
78 import org.graalvm.compiler.nodes.spi.Replacements;
79 import org.graalvm.compiler.nodes.spi.StampProvider;
80 import org.graalvm.compiler.options.OptionValues;
81 import org.graalvm.compiler.phases.OptimisticOptimizations;
292 graph.freeze();
293 graphs.putIfAbsent(substitute, graph);
294 graph = graphs.get(substitute);
295 }
296 }
297 assert graph.isFrozen();
298 result = graph;
299 } else {
300 Bytecode code = new ResolvedJavaMethodBytecode(method);
301 ConstantReflectionProvider constantReflection = providers.getConstantReflection();
302 ConstantFieldProvider constantFieldProvider = providers.getConstantFieldProvider();
303 StampProvider stampProvider = providers.getStampProvider();
304 try (DebugContext debug = openDebugContext("Substitution_", method)) {
305 result = new IntrinsicGraphBuilder(options, debug, metaAccess, constantReflection, constantFieldProvider, stampProvider, code, invokeBci).buildGraph(plugin);
306 }
307 }
308 } else {
309 result = null;
310 }
311 return result;
312 }
313
314 /**
315 * Creates a preprocessed graph for a snippet or method substitution.
316 *
317 * @param bytecodeProvider how to access the bytecode of {@code method}
318 * @param method the snippet or method substitution for which a graph will be created
319 * @param args
320 * @param original the original method if {@code method} is a {@linkplain MethodSubstitution
321 * substitution} otherwise null
322 * @param trackNodeSourcePosition
323 */
324 public StructuredGraph makeGraph(DebugContext debug, BytecodeProvider bytecodeProvider, ResolvedJavaMethod method, Object[] args, ResolvedJavaMethod original, boolean trackNodeSourcePosition,
325 NodeSourcePosition replaceePosition) {
326 return createGraphMaker(method, original).makeGraph(debug, bytecodeProvider, args, trackNodeSourcePosition, replaceePosition);
327 }
328
329 /**
330 * Can be overridden to return an object that specializes various parts of graph preprocessing.
331 */
|
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24
25 package org.graalvm.compiler.replacements;
26
27 import static org.graalvm.compiler.core.common.GraalOptions.UseSnippetGraphCache;
28 import static org.graalvm.compiler.debug.DebugContext.DEFAULT_LOG_STREAM;
29 import static org.graalvm.compiler.java.BytecodeParserOptions.InlineDuringParsing;
30 import static org.graalvm.compiler.java.BytecodeParserOptions.InlineIntrinsicsDuringParsing;
31 import static org.graalvm.compiler.nodes.graphbuilderconf.InlineInvokePlugin.InlineInfo.createIntrinsicInlineInfo;
32 import static org.graalvm.compiler.nodes.graphbuilderconf.IntrinsicContext.CompilationContext.INLINE_AFTER_PARSING;
33 import static org.graalvm.compiler.nodes.graphbuilderconf.IntrinsicContext.CompilationContext.ROOT_COMPILATION;
34 import static org.graalvm.compiler.phases.common.DeadCodeEliminationPhase.Optionality.Required;
35
36 import java.util.Collections;
37 import java.util.List;
38 import java.util.concurrent.ConcurrentHashMap;
39 import java.util.concurrent.ConcurrentMap;
40 import java.util.concurrent.atomic.AtomicInteger;
41
42 import jdk.internal.vm.compiler.collections.EconomicMap;
43 import jdk.internal.vm.compiler.collections.Equivalence;
44 import org.graalvm.compiler.api.replacements.Fold;
45 import org.graalvm.compiler.api.replacements.MethodSubstitution;
46 import org.graalvm.compiler.api.replacements.Snippet;
47 import org.graalvm.compiler.api.replacements.SnippetReflectionProvider;
48 import org.graalvm.compiler.api.replacements.SnippetTemplateCache;
49 import org.graalvm.compiler.bytecode.Bytecode;
50 import org.graalvm.compiler.bytecode.BytecodeProvider;
51 import org.graalvm.compiler.bytecode.ResolvedJavaMethodBytecode;
52 import org.graalvm.compiler.core.common.CompilationIdentifier;
53 import org.graalvm.compiler.core.common.GraalOptions;
54 import org.graalvm.compiler.core.common.spi.ConstantFieldProvider;
55 import org.graalvm.compiler.debug.DebugCloseable;
56 import org.graalvm.compiler.debug.DebugContext;
57 import org.graalvm.compiler.debug.DebugContext.Description;
58 import org.graalvm.compiler.debug.DebugHandlersFactory;
59 import org.graalvm.compiler.debug.GraalError;
60 import org.graalvm.compiler.debug.TimerKey;
61 import org.graalvm.compiler.graph.Node;
62 import org.graalvm.compiler.graph.Node.NodeIntrinsic;
63 import org.graalvm.compiler.graph.NodeSourcePosition;
64 import org.graalvm.compiler.java.GraphBuilderPhase;
65 import org.graalvm.compiler.java.GraphBuilderPhase.Instance;
66 import org.graalvm.compiler.nodes.CallTargetNode;
67 import org.graalvm.compiler.nodes.Invoke;
68 import org.graalvm.compiler.nodes.StateSplit;
69 import org.graalvm.compiler.nodes.StructuredGraph;
70 import org.graalvm.compiler.nodes.ValueNode;
71 import org.graalvm.compiler.nodes.graphbuilderconf.GeneratedInvocationPlugin;
72 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration;
73 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins;
74 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext;
75 import org.graalvm.compiler.nodes.graphbuilderconf.InlineInvokePlugin;
76 import org.graalvm.compiler.nodes.graphbuilderconf.IntrinsicContext;
77 import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin;
78 import org.graalvm.compiler.nodes.graphbuilderconf.MethodSubstitutionPlugin;
79 import org.graalvm.compiler.nodes.java.MethodCallTargetNode;
80 import org.graalvm.compiler.nodes.spi.Replacements;
81 import org.graalvm.compiler.nodes.spi.StampProvider;
82 import org.graalvm.compiler.options.OptionValues;
83 import org.graalvm.compiler.phases.OptimisticOptimizations;
294 graph.freeze();
295 graphs.putIfAbsent(substitute, graph);
296 graph = graphs.get(substitute);
297 }
298 }
299 assert graph.isFrozen();
300 result = graph;
301 } else {
302 Bytecode code = new ResolvedJavaMethodBytecode(method);
303 ConstantReflectionProvider constantReflection = providers.getConstantReflection();
304 ConstantFieldProvider constantFieldProvider = providers.getConstantFieldProvider();
305 StampProvider stampProvider = providers.getStampProvider();
306 try (DebugContext debug = openDebugContext("Substitution_", method)) {
307 result = new IntrinsicGraphBuilder(options, debug, metaAccess, constantReflection, constantFieldProvider, stampProvider, code, invokeBci).buildGraph(plugin);
308 }
309 }
310 } else {
311 result = null;
312 }
313 return result;
314 }
315
316 @SuppressWarnings("try")
317 @Override
318 public StructuredGraph getIntrinsicGraph(ResolvedJavaMethod method, CompilationIdentifier compilationId, DebugContext debug) {
319 Bytecode subst = getSubstitutionBytecode(method);
320 if (subst != null) {
321 ResolvedJavaMethod substMethod = subst.getMethod();
322 assert !substMethod.equals(method);
323 BytecodeProvider bytecodeProvider = subst.getOrigin();
324 // @formatter:off
325 StructuredGraph graph = new StructuredGraph.Builder(options, debug, StructuredGraph.AllowAssumptions.YES).
326 method(substMethod).
327 compilationId(compilationId).
328 recordInlinedMethods(bytecodeProvider.shouldRecordMethodDependencies()).
329 setIsSubstitution(true).
330 build();
331 // @formatter:on
332 try (DebugContext.Scope scope = debug.scope("GetIntrinsicGraph", graph)) {
333 Plugins plugins = new Plugins(getGraphBuilderPlugins());
334 GraphBuilderConfiguration config = GraphBuilderConfiguration.getSnippetDefault(plugins);
335 IntrinsicContext initialReplacementContext = new IntrinsicContext(method, substMethod, bytecodeProvider, ROOT_COMPILATION);
336 new GraphBuilderPhase.Instance(providers.getMetaAccess(), providers.getStampProvider(), providers.getConstantReflection(), providers.getConstantFieldProvider(), config,
337 OptimisticOptimizations.NONE, initialReplacementContext).apply(graph);
338 assert !graph.isFrozen();
339 return graph;
340 } catch (Throwable e) {
341 debug.handle(e);
342 }
343 }
344 return null;
345 }
346
347 /**
348 * Creates a preprocessed graph for a snippet or method substitution.
349 *
350 * @param bytecodeProvider how to access the bytecode of {@code method}
351 * @param method the snippet or method substitution for which a graph will be created
352 * @param args
353 * @param original the original method if {@code method} is a {@linkplain MethodSubstitution
354 * substitution} otherwise null
355 * @param trackNodeSourcePosition
356 */
357 public StructuredGraph makeGraph(DebugContext debug, BytecodeProvider bytecodeProvider, ResolvedJavaMethod method, Object[] args, ResolvedJavaMethod original, boolean trackNodeSourcePosition,
358 NodeSourcePosition replaceePosition) {
359 return createGraphMaker(method, original).makeGraph(debug, bytecodeProvider, args, trackNodeSourcePosition, replaceePosition);
360 }
361
362 /**
363 * Can be overridden to return an object that specializes various parts of graph preprocessing.
364 */
|