src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ObjectHashCodeInliningTest.java
branchdatagramsocketimpl-branch
changeset 58678 9cf78a70fa4f
parent 54601 c40b2a190173
child 58679 9c3209ff7550
equal deleted inserted replaced
58677:13588c901957 58678:9cf78a70fa4f
    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)) {
    72         }
    81         }
    73         return false;
    82         return false;
    74     }
    83     }
    75 
    84 
    76     @Override
    85     @Override
    77     protected boolean checkHighTierGraph(StructuredGraph graph) {
    86     protected void checkHighTierGraph(StructuredGraph graph) {
    78         return containsForeignCallToIdentityHashCode(graph) && containsReadStringHash(graph);
    87         assert containsForeignCallToIdentityHashCode(graph) : "expected a foreign call to identity_hashcode";
       
    88         assert containsReadStringHash(graph) : "expected a read from String.hash";
    79     }
    89     }
    80 
    90 
    81 }
    91 }