34 import java.util.List; |
34 import java.util.List; |
35 import java.util.concurrent.ConcurrentHashMap; |
35 import java.util.concurrent.ConcurrentHashMap; |
36 import java.util.concurrent.ConcurrentMap; |
36 import java.util.concurrent.ConcurrentMap; |
37 import java.util.concurrent.atomic.AtomicInteger; |
37 import java.util.concurrent.atomic.AtomicInteger; |
38 |
38 |
|
39 import org.graalvm.collections.EconomicMap; |
|
40 import org.graalvm.collections.Equivalence; |
39 import org.graalvm.compiler.api.replacements.Fold; |
41 import org.graalvm.compiler.api.replacements.Fold; |
40 import org.graalvm.compiler.api.replacements.MethodSubstitution; |
42 import org.graalvm.compiler.api.replacements.MethodSubstitution; |
41 import org.graalvm.compiler.api.replacements.Snippet; |
43 import org.graalvm.compiler.api.replacements.Snippet; |
42 import org.graalvm.compiler.api.replacements.SnippetReflectionProvider; |
44 import org.graalvm.compiler.api.replacements.SnippetReflectionProvider; |
43 import org.graalvm.compiler.api.replacements.SnippetTemplateCache; |
45 import org.graalvm.compiler.api.replacements.SnippetTemplateCache; |
45 import org.graalvm.compiler.bytecode.BytecodeProvider; |
47 import org.graalvm.compiler.bytecode.BytecodeProvider; |
46 import org.graalvm.compiler.bytecode.ResolvedJavaMethodBytecode; |
48 import org.graalvm.compiler.bytecode.ResolvedJavaMethodBytecode; |
47 import org.graalvm.compiler.core.common.GraalOptions; |
49 import org.graalvm.compiler.core.common.GraalOptions; |
48 import org.graalvm.compiler.core.common.spi.ConstantFieldProvider; |
50 import org.graalvm.compiler.core.common.spi.ConstantFieldProvider; |
49 import org.graalvm.compiler.debug.DebugCloseable; |
51 import org.graalvm.compiler.debug.DebugCloseable; |
50 import org.graalvm.compiler.debug.DebugHandlersFactory; |
|
51 import org.graalvm.compiler.debug.DebugContext; |
52 import org.graalvm.compiler.debug.DebugContext; |
52 import org.graalvm.compiler.debug.DebugContext.Description; |
53 import org.graalvm.compiler.debug.DebugContext.Description; |
|
54 import org.graalvm.compiler.debug.DebugHandlersFactory; |
53 import org.graalvm.compiler.debug.GraalError; |
55 import org.graalvm.compiler.debug.GraalError; |
54 import org.graalvm.compiler.debug.TimerKey; |
56 import org.graalvm.compiler.debug.TimerKey; |
55 import org.graalvm.compiler.graph.Node; |
57 import org.graalvm.compiler.graph.Node; |
56 import org.graalvm.compiler.graph.Node.NodeIntrinsic; |
58 import org.graalvm.compiler.graph.Node.NodeIntrinsic; |
57 import org.graalvm.compiler.java.GraphBuilderPhase; |
59 import org.graalvm.compiler.java.GraphBuilderPhase; |
79 import org.graalvm.compiler.phases.common.DeadCodeEliminationPhase; |
81 import org.graalvm.compiler.phases.common.DeadCodeEliminationPhase; |
80 import org.graalvm.compiler.phases.tiers.PhaseContext; |
82 import org.graalvm.compiler.phases.tiers.PhaseContext; |
81 import org.graalvm.compiler.phases.util.Providers; |
83 import org.graalvm.compiler.phases.util.Providers; |
82 import org.graalvm.compiler.word.Word; |
84 import org.graalvm.compiler.word.Word; |
83 import org.graalvm.compiler.word.WordOperationPlugin; |
85 import org.graalvm.compiler.word.WordOperationPlugin; |
84 import org.graalvm.util.EconomicMap; |
|
85 import org.graalvm.util.Equivalence; |
|
86 |
86 |
87 import jdk.vm.ci.code.TargetDescription; |
87 import jdk.vm.ci.code.TargetDescription; |
88 import jdk.vm.ci.meta.ConstantReflectionProvider; |
88 import jdk.vm.ci.meta.ConstantReflectionProvider; |
89 import jdk.vm.ci.meta.MetaAccessProvider; |
89 import jdk.vm.ci.meta.MetaAccessProvider; |
90 import jdk.vm.ci.meta.ResolvedJavaMethod; |
90 import jdk.vm.ci.meta.ResolvedJavaMethod; |
272 if (plugin != null && (!plugin.inlineOnly() || invokeBci >= 0)) { |
272 if (plugin != null && (!plugin.inlineOnly() || invokeBci >= 0)) { |
273 MetaAccessProvider metaAccess = providers.getMetaAccess(); |
273 MetaAccessProvider metaAccess = providers.getMetaAccess(); |
274 if (plugin instanceof MethodSubstitutionPlugin) { |
274 if (plugin instanceof MethodSubstitutionPlugin) { |
275 MethodSubstitutionPlugin msPlugin = (MethodSubstitutionPlugin) plugin; |
275 MethodSubstitutionPlugin msPlugin = (MethodSubstitutionPlugin) plugin; |
276 ResolvedJavaMethod substitute = msPlugin.getSubstitute(metaAccess); |
276 ResolvedJavaMethod substitute = msPlugin.getSubstitute(metaAccess); |
277 StructuredGraph graph = graphs.get(substitute); |
277 StructuredGraph graph = UseSnippetGraphCache.getValue(options) ? graphs.get(substitute) : null; |
278 if (graph == null) { |
278 if (graph == null) { |
279 try (DebugContext debug = openDebugContext("Substitution_", method)) { |
279 try (DebugContext debug = openDebugContext("Substitution_", method)) { |
280 graph = makeGraph(debug, msPlugin.getBytecodeProvider(), substitute, null, method); |
280 graph = makeGraph(debug, msPlugin.getBytecodeProvider(), substitute, null, method); |
|
281 if (!UseSnippetGraphCache.getValue(options)) { |
|
282 return graph; |
|
283 } |
281 graph.freeze(); |
284 graph.freeze(); |
282 graphs.putIfAbsent(substitute, graph); |
285 graphs.putIfAbsent(substitute, graph); |
283 graph = graphs.get(substitute); |
286 graph = graphs.get(substitute); |
284 } |
287 } |
285 } |
288 } |