Skip to content

Commit 114ce81

Browse files
committed
Make the snippet template cache global instead of per snippet.
1 parent f32605d commit 114ce81

File tree

5 files changed

+38
-19
lines changed

5 files changed

+38
-19
lines changed

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/spi/DelegatingReplacements.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
package jdk.graal.compiler.nodes.spi;
2626

2727
import java.util.BitSet;
28+
import java.util.Map;
2829

2930
import jdk.graal.compiler.api.replacements.SnippetTemplateCache;
3031
import jdk.graal.compiler.bytecode.BytecodeProvider;
@@ -38,6 +39,7 @@
3839
import jdk.graal.compiler.nodes.graphbuilderconf.GraphBuilderPlugin;
3940
import jdk.graal.compiler.nodes.graphbuilderconf.InvocationPlugin;
4041
import jdk.graal.compiler.options.OptionValues;
42+
import jdk.graal.compiler.replacements.SnippetTemplate;
4143
import jdk.vm.ci.meta.JavaKind;
4244
import jdk.vm.ci.meta.ResolvedJavaMethod;
4345

@@ -137,4 +139,9 @@ public <T extends SnippetTemplateCache> T getSnippetTemplateCache(Class<T> templ
137139
public JavaKind getWordKind() {
138140
return delegate.getWordKind();
139141
}
142+
143+
@Override
144+
public Map<SnippetTemplate.CacheKey, SnippetTemplate> getTemplatesCache() {
145+
return delegate.getTemplatesCache();
146+
}
140147
}

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/spi/Replacements.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
package jdk.graal.compiler.nodes.spi;
2626

2727
import java.util.BitSet;
28+
import java.util.Map;
2829

2930
import jdk.graal.compiler.api.replacements.Snippet;
3031
import jdk.graal.compiler.api.replacements.SnippetTemplateCache;
@@ -39,6 +40,7 @@
3940
import jdk.graal.compiler.nodes.graphbuilderconf.GraphBuilderPlugin;
4041
import jdk.graal.compiler.nodes.graphbuilderconf.InvocationPlugin;
4142
import jdk.graal.compiler.options.OptionValues;
43+
import jdk.graal.compiler.replacements.SnippetTemplate;
4244
import jdk.vm.ci.meta.JavaKind;
4345
import jdk.vm.ci.meta.ResolvedJavaMethod;
4446

@@ -55,6 +57,10 @@ public interface Replacements extends GeneratedPluginInjectionProvider {
5557
*/
5658
GraphBuilderConfiguration.Plugins getGraphBuilderPlugins();
5759

60+
61+
62+
Map<SnippetTemplate.CacheKey, SnippetTemplate> getTemplatesCache();
63+
5864
/**
5965
* Gets the plugin type that intrinsifies calls to {@code method}.
6066
*/

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/ReplacementsImpl.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import static jdk.graal.compiler.phases.common.DeadCodeEliminationPhase.Optionality.Required;
3434

3535
import java.util.BitSet;
36+
import java.util.Collections;
37+
import java.util.Map;
3638
import java.util.concurrent.ConcurrentHashMap;
3739
import java.util.concurrent.ConcurrentMap;
3840
import java.util.concurrent.atomic.AtomicInteger;
@@ -111,6 +113,12 @@ public void setProviders(Providers providers) {
111113
public final TargetDescription target;
112114
protected GraphBuilderConfiguration.Plugins graphBuilderPlugins;
113115
private final DebugHandlersFactory debugHandlersFactory;
116+
private final Map<SnippetTemplate.CacheKey, SnippetTemplate> templatesCache;
117+
118+
@Override
119+
public Map<SnippetTemplate.CacheKey, SnippetTemplate> getTemplatesCache() {
120+
return templatesCache;
121+
}
114122

115123
/**
116124
* The preprocessed replacement graphs. This is keyed by a pair of a method and options because
@@ -242,6 +250,7 @@ public ReplacementsImpl(DebugHandlersFactory debugHandlersFactory, Providers pro
242250
this.snippetTemplateCache = EconomicMap.create(Equivalence.DEFAULT);
243251
this.defaultBytecodeProvider = bytecodeProvider;
244252
this.debugHandlersFactory = debugHandlersFactory;
253+
this.templatesCache = Collections.synchronizedMap(new SnippetTemplate.LRUCache<>());
245254
}
246255

247256
private static final TimerKey SnippetPreparationTime = DebugContext.timer("SnippetPreparationTime");

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/SnippetTemplate.java

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545
import java.util.Iterator;
4646
import java.util.LinkedHashMap;
4747
import java.util.List;
48-
import java.util.Map;
4948
import java.util.concurrent.atomic.AtomicReference;
5049
import java.util.function.Predicate;
5150

@@ -799,7 +798,7 @@ public ValueNode findLength(FindLengthMode mode, ConstantReflectionProvider cons
799798
}
800799
}
801800

802-
static class CacheKey {
801+
public static class CacheKey {
803802

804803
private final ResolvedJavaMethod method;
805804
private final Object[] values;
@@ -857,9 +856,6 @@ public int hashCode() {
857856
public static class Options {
858857
@Option(help = "Use a LRU cache for snippet templates.")//
859858
public static final OptionKey<Boolean> UseSnippetTemplateCache = new OptionKey<>(true);
860-
861-
@Option(help = "")//
862-
public static final OptionKey<Integer> MaxTemplatesPerSnippet = new OptionKey<>(50);
863859
}
864860

865861
/**
@@ -869,20 +865,13 @@ public abstract static class AbstractTemplates implements SnippetTemplateCache {
869865

870866
protected final OptionValues options;
871867
protected final SnippetReflectionProvider snippetReflection;
872-
private final Map<CacheKey, SnippetTemplate> templates;
873868

874869
private final boolean shouldTrackNodeSourcePosition;
875870

876871
protected AbstractTemplates(OptionValues options, Providers providers) {
877872
this.options = options;
878873
this.snippetReflection = providers.getSnippetReflection();
879874
this.shouldTrackNodeSourcePosition = providers.getCodeCache() != null && providers.getCodeCache().shouldDebugNonSafepoints();
880-
if (Options.UseSnippetTemplateCache.getValue(options)) {
881-
int size = Options.MaxTemplatesPerSnippet.getValue(options);
882-
this.templates = Collections.synchronizedMap(new LRUCache<>(size, size));
883-
} else {
884-
this.templates = null;
885-
}
886875
}
887876

888877
public static ResolvedJavaMethod findMethod(MetaAccessProvider metaAccess, Class<?> declaringClass, String methodName) {
@@ -981,7 +970,7 @@ protected SnippetInfo snippet(Providers providers,
981970
public SnippetTemplate template(CoreProviders context, ValueNode replacee, final Arguments args) {
982971
StructuredGraph graph = replacee.graph();
983972
DebugContext outer = graph.getDebug();
984-
SnippetTemplate template = Options.UseSnippetTemplateCache.getValue(options) && args.cacheable ? templates.get(args.cacheKey) : null;
973+
SnippetTemplate template = Options.UseSnippetTemplateCache.getValue(options) && args.cacheable ? context.getReplacements().getTemplatesCache().get(args.cacheKey) : null;
985974
if (template == null || (graph.trackNodeSourcePosition() && !template.snippet.trackNodeSourcePosition())) {
986975
try (DebugContext debug = context.getReplacements().openSnippetDebugContext("SnippetTemplate_", args.cacheKey.method, outer, options)) {
987976
try (DebugCloseable a = SnippetTemplateCreationTime.start(outer);
@@ -1002,7 +991,7 @@ public SnippetTemplate template(CoreProviders context, ValueNode replacee, final
1002991
createMidTierPreLoweringPhases(),
1003992
createMidTierPostLoweringPhases());
1004993
if (Options.UseSnippetTemplateCache.getValue(snippetOptions) && args.cacheable) {
1005-
templates.put(args.cacheKey, template);
994+
context.getReplacements().getTemplatesCache().put(args.cacheKey, template);
1006995
}
1007996
if (outer.areMetricsEnabled()) {
1008997
DebugContext.counter("SnippetTemplateNodeCount[%#s]", args).add(outer, template.nodes.size());
@@ -1037,11 +1026,20 @@ protected PhaseSuite<CoreProviders> createMidTierPostLoweringPhases() {
10371026

10381027
public static final class LRUCache<K, V> extends LinkedHashMap<K, V> {
10391028
private static final long serialVersionUID = 1L;
1029+
1030+
/**
1031+
* Maximum capacity of the least-recently used snippet template cache. A higher number increases the total amount
1032+
* of memory used for snippet templates and a lower number increases the cache misses and thus decreases compilation
1033+
* speed. At a value of 64, the estimated misses are at 2% of lookups, at 80, they are at 1% of lookups, and
1034+
* at 100, they are at 0.5% of lookups.
1035+
*/
1036+
public static final int SNIPPET_CACHE_CAPACITY = 64;
1037+
10401038
private final int maxCacheSize;
10411039

1042-
public LRUCache(int initialCapacity, int maxCacheSize) {
1043-
super(initialCapacity, 0.75F, true);
1044-
this.maxCacheSize = maxCacheSize;
1040+
public LRUCache() {
1041+
super(SNIPPET_CACHE_CAPACITY, 0.75F, true);
1042+
this.maxCacheSize = SNIPPET_CACHE_CAPACITY;
10451043
}
10461044

10471045
@Override

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/util/ObjectCopier.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -285,12 +285,11 @@ static final class HashMapBuiltin extends Builtin {
285285

286286
HashMapBuiltin() {
287287
super(HashMap.class, IdentityHashMap.class, LinkedHashMap.class, SnippetTemplate.LRUCache.class);
288-
int size = SnippetTemplate.Options.MaxTemplatesPerSnippet.getDefaultValue();
289288
factories = Map.of(
290289
HashMap.class, HashMap::new,
291290
IdentityHashMap.class, IdentityHashMap::new,
292291
LinkedHashMap.class, LinkedHashMap::new,
293-
SnippetTemplate.LRUCache.class, () -> new SnippetTemplate.LRUCache<>(size, size));
292+
SnippetTemplate.LRUCache.class, SnippetTemplate.LRUCache::new);
294293
}
295294

296295
@Override

0 commit comments

Comments
 (0)