22 */ |
22 */ |
23 |
23 |
24 |
24 |
25 package org.graalvm.compiler.hotspot.test; |
25 package org.graalvm.compiler.hotspot.test; |
26 |
26 |
27 import jdk.vm.ci.meta.ResolvedJavaMethod; |
|
28 import org.graalvm.compiler.core.test.GraalCompilerTest; |
27 import org.graalvm.compiler.core.test.GraalCompilerTest; |
|
28 import org.graalvm.compiler.java.BytecodeParserOptions; |
29 import org.graalvm.compiler.nodes.StructuredGraph; |
29 import org.graalvm.compiler.nodes.StructuredGraph; |
30 import org.graalvm.compiler.nodes.extended.ForeignCallNode; |
30 import org.graalvm.compiler.nodes.extended.ForeignCallNode; |
31 import org.graalvm.compiler.nodes.java.MethodCallTargetNode; |
31 import org.graalvm.compiler.nodes.java.MethodCallTargetNode; |
32 import org.graalvm.compiler.nodes.memory.ReadNode; |
32 import org.graalvm.compiler.nodes.memory.ReadNode; |
33 import org.junit.Assume; |
33 import org.graalvm.compiler.options.OptionValues; |
34 import org.junit.Test; |
34 import org.junit.Test; |
|
35 |
|
36 import jdk.vm.ci.meta.JavaTypeProfile; |
|
37 import jdk.vm.ci.meta.JavaTypeProfile.ProfiledType; |
|
38 import jdk.vm.ci.meta.MetaAccessProvider; |
|
39 import jdk.vm.ci.meta.ResolvedJavaMethod; |
|
40 import jdk.vm.ci.meta.TriState; |
35 |
41 |
36 public class ObjectHashCodeInliningTest extends GraalCompilerTest { |
42 public class ObjectHashCodeInliningTest extends GraalCompilerTest { |
37 |
43 |
38 public static int getHash(Object obj) { |
44 public static int getHash(Object obj) { |
39 return obj.hashCode(); |
45 return obj.hashCode(); |
40 } |
46 } |
41 |
47 |
42 @Test |
48 @Test |
43 public void testInstallCodeInvalidation() { |
49 public void testGetHash() { |
44 for (int i = 0; i < 100000; i++) { |
50 MetaAccessProvider metaAccess = getMetaAccess(); |
45 getHash(i % 1000 == 0 ? new Object() : ""); |
51 ProfiledType[] injectedProfile = { |
|
52 new ProfiledType(metaAccess.lookupJavaType(String.class), 0.9D), |
|
53 new ProfiledType(metaAccess.lookupJavaType(Object.class), 0.1D)}; |
|
54 |
|
55 ResolvedJavaMethod method = getResolvedJavaMethod("getHash"); |
|
56 StructuredGraph graph = parseForCompile(method, |
|
57 new OptionValues(getInitialOptions(), BytecodeParserOptions.InlineDuringParsing, false, BytecodeParserOptions.InlineIntrinsicsDuringParsing, false)); |
|
58 for (MethodCallTargetNode callTargetNode : graph.getNodes(MethodCallTargetNode.TYPE)) { |
|
59 if ("Object.hashCode".equals(callTargetNode.targetName())) { |
|
60 callTargetNode.setJavaTypeProfile(new JavaTypeProfile(TriState.FALSE, 0.0D, injectedProfile)); |
|
61 } |
46 } |
62 } |
47 |
63 |
48 ResolvedJavaMethod method = getResolvedJavaMethod("getHash"); |
|
49 StructuredGraph graph = parseForCompile(method); |
|
50 for (MethodCallTargetNode callTargetNode : graph.getNodes(MethodCallTargetNode.TYPE)) { |
|
51 if ("Object.hashCode".equals(callTargetNode.targetName())) { |
|
52 Assume.assumeTrue(callTargetNode.getProfile() != null); |
|
53 } |
|
54 } |
|
55 compile(method, graph); |
64 compile(method, graph); |
56 } |
65 } |
57 |
66 |
58 private static boolean containsForeignCallToIdentityHashCode(StructuredGraph graph) { |
67 private static boolean containsForeignCallToIdentityHashCode(StructuredGraph graph) { |
59 for (ForeignCallNode foreignCallNode : graph.getNodes().filter(ForeignCallNode.class)) { |
68 for (ForeignCallNode foreignCallNode : graph.getNodes().filter(ForeignCallNode.class)) { |