Skip to content

Commit 450475d

Browse files
committed
[GR-50240] Wrap HotSpotObjectConstant directly in ImageHeapConstant.
PullRequest: graal/16870
2 parents d5f9e5e + 6c47c24 commit 450475d

File tree

43 files changed

+520
-348
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+520
-348
lines changed

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/HotSpotBackendFactory.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import static jdk.vm.ci.services.Services.IS_BUILDING_NATIVE_IMAGE;
2929
import static jdk.vm.ci.services.Services.IS_IN_NATIVE_IMAGE;
3030

31+
import jdk.graal.compiler.api.replacements.SnippetReflectionProvider;
3132
import jdk.graal.compiler.bytecode.BytecodeProvider;
3233
import jdk.graal.compiler.core.common.spi.ConstantFieldProvider;
3334
import jdk.graal.compiler.debug.Assertions;
@@ -56,6 +57,7 @@
5657
import jdk.graal.compiler.nodes.java.AbstractNewObjectNode;
5758
import jdk.graal.compiler.nodes.loop.LoopsDataProviderImpl;
5859
import jdk.graal.compiler.nodes.memory.FixedAccessNode;
60+
import jdk.graal.compiler.nodes.spi.IdentityHashCodeProvider;
5961
import jdk.graal.compiler.nodes.spi.LoopsDataProvider;
6062
import jdk.graal.compiler.nodes.spi.Replacements;
6163
import jdk.graal.compiler.options.OptionValues;
@@ -188,9 +190,12 @@ public final HotSpotBackend createBackend(HotSpotGraalRuntimeProvider graalRunti
188190
try (InitTimer rt = timer("create Bytecode provider")) {
189191
bytecodeProvider = createBytecodeProvider(metaAccess, snippetReflection);
190192
}
191-
193+
IdentityHashCodeProvider identityHashCodeProvider;
194+
try (InitTimer rt = timer("create IdentityHashCode provider")) {
195+
identityHashCodeProvider = createIdentityHashCodeProvider(snippetReflection);
196+
}
192197
providers = new HotSpotProviders(metaAccess, codeCache, constantReflection, constantFieldProvider, foreignCalls, lowerer, null, null, registers,
193-
snippetReflection, wordTypes, stampProvider, platformConfigurationProvider, metaAccessExtensionProvider, loopsDataProvider, config);
198+
snippetReflection, wordTypes, stampProvider, platformConfigurationProvider, metaAccessExtensionProvider, loopsDataProvider, config, identityHashCodeProvider);
194199
HotSpotReplacementsImpl replacements;
195200
try (InitTimer rt = timer("create Replacements provider")) {
196201
replacements = createReplacements(target, providers, bytecodeProvider);
@@ -217,6 +222,10 @@ public final HotSpotBackend createBackend(HotSpotGraalRuntimeProvider graalRunti
217222
}
218223
}
219224

225+
protected IdentityHashCodeProvider createIdentityHashCodeProvider(SnippetReflectionProvider snippetReflection) {
226+
return new IdentityHashCodeProvider(snippetReflection);
227+
}
228+
220229
protected abstract HotSpotBackend createBackend(GraalHotSpotVMConfig config, HotSpotGraalRuntimeProvider graalRuntime, HotSpotProviders providers);
221230

222231
protected abstract Value[] createNativeABICallerSaveRegisters(GraalHotSpotVMConfig config, RegisterConfig registerConfig);

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/SymbolicSnippetEncoder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,8 @@ private boolean verifySnippetEncodeDecode(DebugContext debug, ResolvedJavaMethod
365365
HotSpotProviders newProviders = new HotSpotProviders(originalProvider.getMetaAccess(), originalProvider.getCodeCache(), constantReflection,
366366
originalProvider.getConstantFieldProvider(), originalProvider.getForeignCalls(), originalProvider.getLowerer(), null, originalProvider.getSuites(),
367367
originalProvider.getRegisters(), originalProvider.getSnippetReflection(), originalProvider.getWordTypes(), originalProvider.getStampProvider(),
368-
originalProvider.getPlatformConfigurationProvider(), originalProvider.getMetaAccessExtensionProvider(), originalProvider.getLoopsDataProvider(), originalProvider.getConfig());
368+
originalProvider.getPlatformConfigurationProvider(), originalProvider.getMetaAccessExtensionProvider(), originalProvider.getLoopsDataProvider(), originalProvider.getConfig(),
369+
originalProvider.getIdentityHashCodeProvider());
369370
HotSpotSnippetReplacementsImpl filteringReplacements = new HotSpotSnippetReplacementsImpl(newProviders,
370371
originalProvider.getReplacements().getDefaultReplacementBytecodeProvider(), originalProvider.getCodeCache().getTarget());
371372
filteringReplacements.setGraphBuilderPlugins(originalProvider.getReplacements().getGraphBuilderPlugins());

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/meta/HotSpotProviders.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,14 @@
3030
import jdk.graal.compiler.hotspot.GraalHotSpotVMConfig;
3131
import jdk.graal.compiler.hotspot.word.HotSpotWordTypes;
3232
import jdk.graal.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins;
33+
import jdk.graal.compiler.nodes.spi.IdentityHashCodeProvider;
3334
import jdk.graal.compiler.nodes.spi.LoopsDataProvider;
3435
import jdk.graal.compiler.nodes.spi.LoweringProvider;
3536
import jdk.graal.compiler.nodes.spi.PlatformConfigurationProvider;
3637
import jdk.graal.compiler.nodes.spi.Replacements;
3738
import jdk.graal.compiler.nodes.spi.StampProvider;
3839
import jdk.graal.compiler.phases.tiers.SuitesProvider;
3940
import jdk.graal.compiler.phases.util.Providers;
40-
4141
import jdk.vm.ci.hotspot.HotSpotCodeCacheProvider;
4242
import jdk.vm.ci.meta.ConstantReflectionProvider;
4343
import jdk.vm.ci.meta.MetaAccessProvider;
@@ -67,9 +67,10 @@ public HotSpotProviders(MetaAccessProvider metaAccess,
6767
PlatformConfigurationProvider platformConfigurationProvider,
6868
MetaAccessExtensionProvider metaAccessExtensionProvider,
6969
LoopsDataProvider loopsDataProvider,
70-
GraalHotSpotVMConfig config) {
70+
GraalHotSpotVMConfig config,
71+
IdentityHashCodeProvider identityHashCodeProvider) {
7172
super(metaAccess, codeCache, constantReflection, constantField, foreignCalls, lowerer, replacements, stampProvider, platformConfigurationProvider, metaAccessExtensionProvider,
72-
snippetReflection, wordTypes, loopsDataProvider);
73+
snippetReflection, wordTypes, loopsDataProvider, identityHashCodeProvider);
7374
this.suites = suites;
7475
this.registers = registers;
7576
this.config = config;
@@ -116,7 +117,7 @@ public HotSpotProviders copyWith(ConstantReflectionProvider substitution) {
116117
return new HotSpotProviders(getMetaAccess(), getCodeCache(), substitution, getConstantFieldProvider(), getForeignCalls(), getLowerer(), getReplacements(), getSuites(),
117118
getRegisters(), getSnippetReflection(), getWordTypes(), getStampProvider(), getPlatformConfigurationProvider(), getMetaAccessExtensionProvider(),
118119
getLoopsDataProvider(),
119-
config);
120+
config, getIdentityHashCodeProvider());
120121
}
121122

122123
@Override
@@ -125,22 +126,22 @@ public HotSpotProviders copyWith(ConstantFieldProvider substitution) {
125126
getSuites(),
126127
getRegisters(), getSnippetReflection(), getWordTypes(), getStampProvider(), getPlatformConfigurationProvider(), getMetaAccessExtensionProvider(),
127128
getLoopsDataProvider(),
128-
config);
129+
config, getIdentityHashCodeProvider());
129130
}
130131

131132
@Override
132133
public HotSpotProviders copyWith(Replacements substitution) {
133134
return new HotSpotProviders(getMetaAccess(), getCodeCache(), getConstantReflection(), getConstantFieldProvider(), getForeignCalls(), getLowerer(), substitution,
134135
getSuites(), getRegisters(), getSnippetReflection(), getWordTypes(), getStampProvider(), getPlatformConfigurationProvider(),
135136
getMetaAccessExtensionProvider(),
136-
getLoopsDataProvider(), config);
137+
getLoopsDataProvider(), config, getIdentityHashCodeProvider());
137138
}
138139

139140
public HotSpotProviders copyWith() {
140141
return new HotSpotProviders(getMetaAccess(), getCodeCache(), getConstantReflection(), getConstantFieldProvider(), getForeignCalls(), getLowerer(), getReplacements(),
141142
getSuites(), getRegisters(), getSnippetReflection(), getWordTypes(), getStampProvider(), getPlatformConfigurationProvider(), getMetaAccessExtensionProvider(),
142143
getLoopsDataProvider(),
143-
config);
144+
config, getIdentityHashCodeProvider());
144145
}
145146

146147
public void setSuites(HotSpotSuitesProvider suites) {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,6 @@ public interface CoreProviders {
6060
CodeCacheProvider getCodeCache();
6161

6262
SnippetReflectionProvider getSnippetReflection();
63+
64+
IdentityHashCodeProvider getIdentityHashCodeProvider();
6365
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,4 +109,9 @@ public WordTypes getWordTypes() {
109109
public SnippetReflectionProvider getSnippetReflection() {
110110
return providers.getSnippetReflection();
111111
}
112+
113+
@Override
114+
public IdentityHashCodeProvider getIdentityHashCodeProvider() {
115+
return providers.getIdentityHashCodeProvider();
116+
}
112117
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* This code is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU General Public License version 2 only, as
7+
* published by the Free Software Foundation. Oracle designates this
8+
* particular file as subject to the "Classpath" exception as provided
9+
* by Oracle in the LICENSE file that accompanied this code.
10+
*
11+
* This code is distributed in the hope that it will be useful, but WITHOUT
12+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14+
* version 2 for more details (a copy is included in the LICENSE file that
15+
* accompanied this code).
16+
*
17+
* You should have received a copy of the GNU General Public License version
18+
* 2 along with this work; if not, write to the Free Software Foundation,
19+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20+
*
21+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22+
* or visit www.oracle.com if you need additional information or have any
23+
* questions.
24+
*/
25+
package jdk.graal.compiler.nodes.spi;
26+
27+
import jdk.graal.compiler.api.replacements.SnippetReflectionProvider;
28+
import jdk.vm.ci.meta.JavaConstant;
29+
30+
public class IdentityHashCodeProvider {
31+
32+
protected final SnippetReflectionProvider snippetReflection;
33+
34+
public IdentityHashCodeProvider(SnippetReflectionProvider snippetReflection) {
35+
this.snippetReflection = snippetReflection;
36+
}
37+
38+
public int identityHashCode(JavaConstant constant) {
39+
return System.identityHashCode(snippetReflection.asObject(Object.class, constant));
40+
}
41+
}

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/phases/common/FixReadsPhase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ public RawConditionalEliminationVisitor(StructuredGraph graph, ScheduleResult sc
239239
this.debug = graph.getDebug();
240240
this.schedule = schedule;
241241
this.metaAccess = metaAccess;
242-
this.rawCanonicalizerTool = new RawCanonicalizerTool(new Providers(metaAccess, null, null, null, null, null, null, null, null, null, null, null, null));
242+
this.rawCanonicalizerTool = new RawCanonicalizerTool(new Providers(metaAccess, null, null, null, null, null, null, null, null, null, null, null, null, null));
243243
blockActionStart = new BlockMap<>(schedule.getCFG());
244244
endMaps = EconomicMap.create(Equivalence.IDENTITY);
245245
stampMap = graph.createNodeMap();

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/phases/util/Providers.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import jdk.graal.compiler.core.common.spi.ForeignCallsProvider;
3030
import jdk.graal.compiler.core.common.spi.MetaAccessExtensionProvider;
3131
import jdk.graal.compiler.nodes.spi.CoreProviders;
32+
import jdk.graal.compiler.nodes.spi.IdentityHashCodeProvider;
3233
import jdk.graal.compiler.nodes.spi.LoopsDataProvider;
3334
import jdk.graal.compiler.nodes.spi.LoweringProvider;
3435
import jdk.graal.compiler.nodes.spi.PlatformConfigurationProvider;
@@ -57,10 +58,12 @@ public class Providers implements CoreProviders {
5758
protected final CodeCacheProvider codeCache;
5859
protected final SnippetReflectionProvider snippetReflection;
5960
protected final WordTypes wordTypes;
61+
protected final IdentityHashCodeProvider identityHashCodeProvider;
6062

6163
public Providers(MetaAccessProvider metaAccess, CodeCacheProvider codeCache, ConstantReflectionProvider constantReflection, ConstantFieldProvider constantFieldProvider,
6264
ForeignCallsProvider foreignCalls, LoweringProvider lowerer, Replacements replacements, StampProvider stampProvider, PlatformConfigurationProvider platformConfigurationProvider,
63-
MetaAccessExtensionProvider metaAccessExtensionProvider, SnippetReflectionProvider snippetReflection, WordTypes wordTypes, LoopsDataProvider loopsDataProvider) {
65+
MetaAccessExtensionProvider metaAccessExtensionProvider, SnippetReflectionProvider snippetReflection, WordTypes wordTypes, LoopsDataProvider loopsDataProvider,
66+
IdentityHashCodeProvider identityHashCodeProvider) {
6467
this.metaAccess = metaAccess;
6568
this.constantReflection = constantReflection;
6669
this.constantFieldProvider = constantFieldProvider;
@@ -74,12 +77,13 @@ public Providers(MetaAccessProvider metaAccess, CodeCacheProvider codeCache, Con
7477
this.codeCache = codeCache;
7578
this.snippetReflection = snippetReflection;
7679
this.wordTypes = wordTypes;
80+
this.identityHashCodeProvider = identityHashCodeProvider;
7781
}
7882

7983
public Providers(Providers copyFrom) {
8084
this(copyFrom.getMetaAccess(), copyFrom.getCodeCache(), copyFrom.getConstantReflection(), copyFrom.getConstantFieldProvider(), copyFrom.getForeignCalls(), copyFrom.getLowerer(),
8185
copyFrom.getReplacements(), copyFrom.getStampProvider(), copyFrom.getPlatformConfigurationProvider(), copyFrom.getMetaAccessExtensionProvider(),
82-
copyFrom.getSnippetReflection(), copyFrom.getWordTypes(), copyFrom.getLoopsDataProvider());
86+
copyFrom.getSnippetReflection(), copyFrom.getWordTypes(), copyFrom.getLoopsDataProvider(), copyFrom.getIdentityHashCodeProvider());
8387
}
8488

8589
@Override
@@ -142,6 +146,11 @@ public SnippetReflectionProvider getSnippetReflection() {
142146
return snippetReflection;
143147
}
144148

149+
@Override
150+
public IdentityHashCodeProvider getIdentityHashCodeProvider() {
151+
return identityHashCodeProvider;
152+
}
153+
145154
@Override
146155
public WordTypes getWordTypes() {
147156
return wordTypes;
@@ -150,24 +159,24 @@ public WordTypes getWordTypes() {
150159
public Providers copyWith(ConstantReflectionProvider substitution) {
151160
assert this.getClass() == Providers.class : "must override";
152161
return new Providers(metaAccess, codeCache, substitution, constantFieldProvider, foreignCalls, lowerer, replacements, stampProvider, platformConfigurationProvider, metaAccessExtensionProvider,
153-
snippetReflection, wordTypes, loopsDataProvider);
162+
snippetReflection, wordTypes, loopsDataProvider, identityHashCodeProvider);
154163
}
155164

156165
public Providers copyWith(ConstantFieldProvider substitution) {
157166
assert this.getClass() == Providers.class : "must override";
158167
return new Providers(metaAccess, codeCache, constantReflection, substitution, foreignCalls, lowerer, replacements, stampProvider, platformConfigurationProvider, metaAccessExtensionProvider,
159-
snippetReflection, wordTypes, loopsDataProvider);
168+
snippetReflection, wordTypes, loopsDataProvider, identityHashCodeProvider);
160169
}
161170

162171
public Providers copyWith(Replacements substitution) {
163172
assert this.getClass() == Providers.class : "must override in " + getClass();
164173
return new Providers(metaAccess, codeCache, constantReflection, constantFieldProvider, foreignCalls, lowerer, substitution, stampProvider, platformConfigurationProvider,
165-
metaAccessExtensionProvider, snippetReflection, wordTypes, loopsDataProvider);
174+
metaAccessExtensionProvider, snippetReflection, wordTypes, loopsDataProvider, identityHashCodeProvider);
166175
}
167176

168177
public Providers copyWith(MetaAccessExtensionProvider substitution) {
169178
assert this.getClass() == Providers.class : getClass() + " must override";
170179
return new Providers(metaAccess, codeCache, constantReflection, constantFieldProvider, foreignCalls, lowerer, replacements, stampProvider, platformConfigurationProvider, substitution,
171-
snippetReflection, wordTypes, loopsDataProvider);
180+
snippetReflection, wordTypes, loopsDataProvider, identityHashCodeProvider);
172181
}
173182
}

substratevm/src/com.oracle.graal.pointsto.standalone/src/com/oracle/graal/pointsto/standalone/PointsToAnalyzer.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
import jdk.graal.compiler.debug.Indent;
7878
import jdk.graal.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration;
7979
import jdk.graal.compiler.nodes.graphbuilderconf.InvocationPlugins;
80+
import jdk.graal.compiler.nodes.spi.IdentityHashCodeProvider;
8081
import jdk.graal.compiler.options.OptionValues;
8182
import jdk.graal.compiler.phases.util.Providers;
8283
import jdk.graal.compiler.printer.GraalDebugHandlersFactory;
@@ -147,10 +148,11 @@ private PointsToAnalyzer(String mainEntryClass, OptionValues options) {
147148
StandaloneConstantReflectionProvider aConstantReflection = new StandaloneConstantReflectionProvider(aUniverse, HotSpotJVMCIRuntime.runtime());
148149
StandaloneConstantFieldProvider aConstantFieldProvider = new StandaloneConstantFieldProvider(aMetaAccess);
149150
AnalysisMetaAccessExtensionProvider aMetaAccessExtensionProvider = new AnalysisMetaAccessExtensionProvider();
151+
IdentityHashCodeProvider identityHashCodeProvider = originalProviders.getIdentityHashCodeProvider();
150152
HostedProviders aProviders = new HostedProviders(aMetaAccess, null, aConstantReflection, aConstantFieldProvider,
151153
originalProviders.getForeignCalls(), originalProviders.getLowerer(), originalProviders.getReplacements(),
152154
originalProviders.getStampProvider(), snippetReflection, new WordTypes(aMetaAccess, wordKind),
153-
originalProviders.getPlatformConfigurationProvider(), aMetaAccessExtensionProvider, originalProviders.getLoopsDataProvider());
155+
originalProviders.getPlatformConfigurationProvider(), aMetaAccessExtensionProvider, originalProviders.getLoopsDataProvider(), identityHashCodeProvider);
154156
standaloneHost.initializeProviders(aProviders);
155157
analysisName = getAnalysisName(mainEntryClass);
156158
ClassInclusionPolicy classInclusionPolicy = new ClassInclusionPolicy.DefaultAllInclusionPolicy("Included in the base image");
@@ -160,7 +162,7 @@ private PointsToAnalyzer(String mainEntryClass, OptionValues options) {
160162
aUniverse.setBigBang(bigbang);
161163
ImageHeap heap = new ImageHeap();
162164
StandaloneImageHeapScanner heapScanner = new StandaloneImageHeapScanner(bigbang, heap, aMetaAccess,
163-
snippetReflection, aConstantReflection, new AnalysisObjectScanningObserver(bigbang), analysisClassLoader, new HostedValuesProvider(aUniverse));
165+
snippetReflection, aConstantReflection, new AnalysisObjectScanningObserver(bigbang), analysisClassLoader, new HostedValuesProvider(aUniverse), identityHashCodeProvider);
164166
aUniverse.setHeapScanner(heapScanner);
165167
HeapSnapshotVerifier heapVerifier = new StandaloneHeapSnapshotVerifier(bigbang, heap, heapScanner);
166168
aUniverse.setHeapVerifier(heapVerifier);

0 commit comments

Comments
 (0)